Wie drehe ich Zeichen oder Wörter wie die Transponierte von Emacs um?

10

Auf der Bash-Readline im Emacs-Modus habe ich kürzlich die Transponierungsfunktion entdeckt , die mir die Möglichkeit gibt, einen Tippfehler wie schnell zu beheben

dc dir

zu

cd dir

durch Drücken von CTRL+ Tauf das cZeichen.

Gibt es etwas Ähnliches in Vi / Vim, mit dem ich Zeichen und Wörter austauschen kann?

k0pernikus
quelle
1
Sie könnten sicherlich ein Makro / eine Bindung erstellen, die dies tut. vim.wikia.com/wiki/Reverse_letters ist ein Beispiel
fruglemonkey

Antworten:

13

Für Zeichen ist es ziemlich einfach: xpden Buchstaben unter dem Cursor mit dem folgenden Buchstaben Xpzu tauschen und den Buchstaben unter dem Cursor mit dem vorherigen Buchstaben zu tauschen.

Der xBefehl löscht das Zeichen unter dem Cursor und belässt den Cursor auf dem nächsten Zeichen. Der XBefehl löscht das Zeichen unmittelbar vor dem Cursor und belässt den Cursor auf demselben Zeichen, auf dem er sich befand.

pSetzt (fügt) den zuletzt gelöschten oder zuletzt gezogenen Text direkt nach der aktuellen Cursorposition ein. ( PSetzt es kurz vor die aktuelle Cursorposition, xPund XPbeide belassen den Text so, wie er vor dem Start war.)

Ich bin mir nicht sicher, ob ich Worte austauschen soll. Vielleicht kann jemand anderes darauf antworten. Sie können sich dem dawwPnähern (oder es neu zuordnen, um es kürzer zu machen), aber das wird bei mehreren Randfällen brechen, zum Beispiel am Ende einer Linie.

Platzhalter
quelle
2
Wenn nicht zum Kern gehörende Lösungen akzeptabel sind, gibt es github.com/tommcdo/vim-exchange , mit dem Sie nicht nur Wörter, sondern auch ganze Regionen austauschen können. Vimcasts.org/episodes/…
dkns
2

Wortwechselzuordnungen für lateinische Sprachen

Die Wortwechselzuordnungen aus dem Vim-Wiki funktionieren bei Wörtern mit akzentuierten Zeichen nicht ordnungsgemäß .

Diese Zuordnungen sind für die Arbeit mit (europäischen) ISO / IEC_8859-1 Latin-1-Ergänzungszeichen angepasst . Dies erfolgt durch Ersetzen aller Instanzen von \wwith [0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]und aller Instanzen von \_Wwith \_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-].

Löschen der Suchhervorhebung

Darüber hinaus wird die Hervorhebung der Suche bei Bedarf gelöscht . Dies wird erreicht, indem :nohlsearch<return>bei Bedarf am Ende jeder Zuordnung hinzugefügt wird .

Hier ist das Endergebnis:

" Use gc to swap the current CHARACTER with the next, WITHOUT changing the cursor position.
nnoremap <silent> gc xph

" Use gw to swap the current WORD with the next, WITHOUT changing the cursor position.
nnoremap <silent> gw "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>

" Disable Alt+[menukey] menu keys (i.e. Alt+h for help)
set winaltkeys=no

" Use Alt + ← or Alt + h to swap the current WORD with the previous, keeping the cursor on the current word. This feels like "PUSHING" the word to the left.
nnoremap <silent> <A-Left> "_yiw?[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]\+\%#<CR>:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>
nnoremap <silent> <A-h>    "_yiw?[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]\+\%#<CR>:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o><c-l>:nohlsearch<return>
" <A-h> corresponds to è

" Use Alt + → or Alt + l to swap the current WORD with the next, keeping the cursor on the current word. This feels like "PUSHING" the word to the right.
nnoremap <silent> <A-Right> "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o>/[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+<CR><c-l>:nohlsearch<return>
nnoremap <silent> <A-l>     "_yiw:s/\(\%#[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\(\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)\([0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\)/\3\2\1/<CR><c-o>/[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-\`]\+<CR><c-l>:nohlsearch<return>
" <A-l> corresponds to ì

" Use g{ to swap the current PARAGRAPH with the next.
nnoremap g{ {dap}p{
Serge Stroobandt
quelle