簡単な方法で単語を切り替える方法(VIMで)?


11

私はこれが可能かどうかを判断するためにvimが十分ではありません(これが私がスーパーユーザーに来て良くない理由です)〜vimで2つの単語を簡単に切り替える方法はありますか?

たとえば、def function(param1, param2)それをにすばやく/簡単に変更する方法はありますdef function(param2, param1)か?

回答:


13

私が最初にこれを手に入れた場所を覚えていませんが、少なくとも数年間は〜/ .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>

これを定義したら、通常モードで「param1」のどこかにカーソルを置き、次のように入力するだけです。 gw


4
私もそれを持っています、それはvim wikiから来ています。
ロメインル

5

@Heptiteの回答に対して+1。

完全を期すために、ここに私の.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>

出典:VIMウィキ

私(およびwiki)gwは、Heptiteのものとは少し異なります。どっちがいいのかわかりません。


4

その長い解決策はいです。カーソルが左にある最初の単語の最初の文字、つまり「p」であるとします。これを行いますdwlpldw%p。これは特別な場合に適合します。毎日の編集はどうですか?dwwPまたはをお試しくださいdWWP。:D

ヒント:頻繁にこれを行う必要がない場合は、常に長い正規表現を作成しないでください。そうでなければ、vimrcがブームになります。すべてのvimユーザーは、組み込みのカーソル移動に精通している必要があります。


1

vim-exchangeRepeatablerepeat.vimに依存)、およびargtextobjの組み合わせを使用して、繰り返し可能なマッピングを作成しました

" 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

これらのマッピングに交換および反復可能なプラグインを使用する利点は次のとおりです。

  • 1回元uに戻すと、スワップが元に戻ります(アトミックな変更です)
  • を使用し.て、引数を左右に移動し続けることができます。

簡単な操作のための多くのプラグインのように思えますが、それらのプラグインが他に何を提供するかを考えてください:

  • argtextobjは、削除(および)、ヤンク()のためのiaおよびaatextobjを提供します。diadaayia
  • を使用してマッピングを繰り返し可能にするためのvim-repeatおよびRepeatable .
  • vim-exchangeは、繰り返し可能なアトミックなテキスト交換を提供します。

1

ラテン語のスワップマッピング

Vim wikiのスワップマッピングは、アクセント付き文字が含まれる単語では正しく動作しません

これらのマッピングは、(ヨーロッパの)ISO / IEC_8859-1 Latin-1補足文字で動作するように適合されています。これは、すべてのインスタンス代入することによって行われている\w[0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]のすべてのインスタンス\_Wでは\_[^0-9A-Za-zÀ-ÖØ-öø-ÿ_\-]

検索の強調表示のクリア

さらに、検索の強調表示は必要に応じてクリアされます。これは:nohlsearch<return>、必要な各マッピングの最後に追加することにより実現されます。

最終結果は次のとおりです。

" 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

Eclimプラグインは良いものを提供します。それらへのすべてのクレジット:)

:SwapWords

..そして、プラグイン全体をインストールしたくない場合、それらの機能を抽出します。

" 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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.