Emacsをエミュレートする方法’ Vimで単語を置き換えますか?

StackOverflow https://stackoverflow.com/questions/141372

  •  02-07-2019
  •  | 
  •  

質問

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スクリプトがあります。美しく機能します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top