Wie kann man Wörter einfach wechseln (in VIM)?


11

Ich bin nicht gut genug in vim, um festzustellen, ob dies möglich war oder nicht (weshalb ich zu Superuser gekommen bin und nicht gut) ~ Gibt es in vim eine Möglichkeit, zwei Wörter einfach zu wechseln?

Gibt es zum Beispiel def function(param1, param2)eine schnelle / einfache Möglichkeit, dies in def function(param2, param1)??? zu ändern ?

Antworten:


13

Ich erinnere mich nicht, woher ich das ursprünglich habe, aber es ist seit mindestens ein paar Jahren in meinem ~ / .vimrc:

" Swap the word the cursor is on with the next word (which can be on a
" newline, and punctuation is "skipped"):
nmap <silent> gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o>:noh<CR>

Nachdem Sie dies definiert haben, müssen Sie den Cursor im normalen Modus nur noch auf "param1" setzen und Folgendes eingeben: gw


4
Ich habe es auch, es kommt aus dem Vim-Wiki.
Romainl

5

+1 für die Antwort von @ Heptite.

Der Vollständigkeit halber habe ich Folgendes in meiner .vimrc:

" push current line up or down
nnoremap <leader><Up> ddkP
nnoremap <leader><Down> ddp

" exchange character under cursor with the next character without moving the cursor
nnoremap gc xph

" exchange word under cursor with the next word without moving the cursor
nnoremap gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o><C-l>

" push word under cursor to the left
nnoremap <leader><Left> "_yiw?\w\+\_W\+\%#<CR>:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o><C-l>

" push word under cursor to the right
nnoremap <leader><Right> "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR><C-o>/\w\+\_W\+<CR><C-l>

Quelle: das Vim-Wiki .

Ich sehe, dass mein (und das Wiki) gwetwas anders ist als das von Heptite. Ich bin mir nicht sicher, welches besser ist.


4

Diese lange Lösung ist hässlich. Angenommen, Ihr Cursor befindet sich links vom ersten Buchstaben des ersten Wortes, dh 'p'. Tun Sie dies : dwlpldw%p. Dies passt in Ihren speziellen Fall. Wie wäre es mit der täglichen Bearbeitung? Versuchen Sie es dwwPoder dWWP. : D.

Tipps: Schreiben Sie nicht immer lange reguläre Ausdrücke, wenn Sie dies nicht oft tun müssen. Sonst boomt dein vimrc. Alle vim-Benutzer müssen mit der integrierten Cursorbewegung vertraut sein.


1

Ich habe wiederholbare Zuordnungen mit einer Kombination aus vim-exchange , Repeatable (abhängig von repeat.vim ) und argtextobj geschrieben .

" Swap function arguments, move the argument under the cursor to the left or to
" the right.
Repeatable map <leader>al cxiaf,cxia
Repeatable map <leader>ah cxiaF,hcxia

Der Vorteil bei der Verwendung der Exchange- und wiederholbaren Plugins für diese Zuordnungen ist:

  • Durch ein Rückgängigmachen uwird der Tausch rückgängig gemacht (es handelt sich um atomare Änderungen).
  • Sie können das verwenden ., um das Argument nach links / rechts zu bewegen.

Ich weiß, ich weiß, es scheint eine ganze Menge Plugins für eine einfache Operation zu sein, aber denken Sie darüber nach, was diese Plugins Ihnen sonst noch bieten:

  • argtextobj gibt Ihnen das iaund aatextobj zum Löschen ( diaund daa) und Ziehen ( yia).
  • vim-repeat und Repeatable, damit Ihre Zuordnungen mit wiederholt werden können ..
  • Mit vim-exchange können Sie wiederholt und atomar Text austauschen.

1

Tauschen Sie Zuordnungen gegen lateinische Sprachen aus

Die Swap-Zuordnungen aus dem Vim-Wiki funktionieren bei Wörtern mit akzentuierten Zeichen nicht korrekt .

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>am Ende jedes benötigten Mappings 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{

0

Das Eclim- Plugin bietet ein gutes. Alle Credits an sie :)

:SwapWords

.. und wenn Sie nicht das gesamte Plugin installieren möchten, wird hier ihre Funktion extrahiert:

" Swap words:
" taken from Eclim
" https://github.com/ervandew/eclim

function! SwapWords() " {{{
  " Initially based on http://www.vim.org/tips/tip.php?tip_id=329

  " save the last search pattern
  let save_search = @/

  normal! "_yiw
  let pos = getpos('.')
  keepjumps s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/
  call setpos('.', pos)

  " restore the last search pattern
  let @/ = save_search

  silent! call repeat#set(":call SwapWords()\<cr>", v:count)
endfunction " }}}

command! SwapWords :call SwapWords()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.