Emacsをエミュレートする方法’ Vimで単語を置き換えますか?
質問
Emacsには便利な transpose-words
コマンドがあり、カーソルの前の単語とカーソルの後の単語を交換し、句読点を保持できます。
たとえば、‘ stack | overflow
’ + M-t =‘ overflow stack |
’ (‘ |
’はカーソル位置です)。
< a> |< p>
は< p>< a |>
になります。
Vimでエミュレートすることはできますか? dwwP
を使用できることは知っていますが、句読点ではうまく機能しません。
更新:いいえ、 dwwP
は本当に解決策ではありません。想像してみてください:
SOME_BOOST_PP_BLACK_MAGIC( (a)(b)(c) )
// with cursor here ^
Emacs’ M-tは b
と c
を交換したため、(a)(c)(b)
になりました。
機能するのは / \ w
yiwNviwpnviwgp
。しかし、""
と" /
は台無しになります。よりクリーンなソリューションはありますか?
更新²:
解決済み
:nmap gn :s,\v(\w+)(\W*%#\W*)(\w+),\3\2\1\r,<CR>kgJ:nohl<CR>
不完全ですが、動作します。
%#
アイテムを注意してくれたCamflanに感謝します。もちろん、それはすべて wiki にありますが、私は気づきませんでした transpose-words
機能の exact (Emacsが完全に正解)の重複の問題を解決できます。
解決
これらは私の.vimrcからのものであり、私にとってはうまく機能します。
" swap two words
:vnoremap <C-X> <Esc>`.``gvP``P
" Swap word with next word
nmap <silent> gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<cr><c-o><c-l> *N*
他のヒント
状況に応じて、dWwPのようにWまたはBコマンドを使用できます。 「資本」バージョンは、句読点を含む次/前のスペースにスキップします。 fおよびtコマンドも、削除された範囲の終了を指定するのに役立ちます。
さまざまなスワッピング手法について、 Vim Tips Wiki でも議論があります。
>行の途中で、最初の単語の最初の文字に移動してから、
dw wP
行の最後(つまり、行の最後の2つの単語)で、単語間のスペースに移動して、
2dw bhP
便利な VIMとEmacsコマンド
vimrcファイルに次のようなものを追加することで、ショートカットキーを追加できます。
map L dwwP
map M 2dwbhP
その場合、SHIFT-L(コマンドモード)は行の途中で単語を切り替え、SHIFT-Mは最後に切り替えます。
NB:これはスペースで区切られた単語で最適に機能し、OPの特定のケースをうまく処理しません。
http://vim.wikia.com/wiki/VimTip10 にヒントがあります。しかし、私は自分のロールを選択します。 私のスニペットには、ヒントで述べた方法に比べて2つの明らかな利点があります。1)カーソルが単語にないときに機能します。 2)画面全体を強調表示しません。
これはemacsの「転置語」のように機能しますが、転置が不可能な場合は何もしません。 (emacs 'transpose-words'は点滅し、カーソル位置を現在の単語の先頭に変更します。)
"transpose words (like emacs `transpose-words')
function! TransposeWords()
if search('\w\+\%#\w*\W\+\w\+')
elseif search('\w\+\W\+\%#\W*\w\+')
endif
let l:pos = getpos('.')
exec 'silent! :s/\(\%#\w\+\)\(\W\+\)\(\w\+\)/\3\2\1/'
call setpos('.', l:pos)
let l:_ = search('\(\%#\w\+\W\+\)\@<=\w\+')
normal el
endfunction
nmap <silent> <M-right> :call TransposeWords()<CR>
imap <silent> <M-right> <C-O>:call TransposeWords()<CR>
MarkとCapnNefariousが言ったように、dwwPまたはdWwPを使用できますが、私自身のメモがいくつかあります:
- 指定した例のように、カーソルが2番目の単語の最初の文字にある場合、dwbP(またはdWbPを使用して句読点を処理できます);
- カーソルが単語の中央にある場合、dawbP / daWbPを使用できます。
vim.orgには transpose-wordsスクリプトがあります。美しく機能します。