16

Emacs には、transpose-words句読点を保持したまま、カーソルの前の単語をカーソルの後の単語と交換できる便利なコマンドがあります。

たとえば、'<コード>スタック |オーバーフロー' + Mt = '<コード>オーバーフロー スタック|' ('<code>|' はカーソル位置です)。

<a>|<p>になり<p><a|>ます。

Vimでエミュレートできますか?を使用できることはわかってdwwPいますが、句読点ではうまく機能しません。

更新:いいえ、実際dwwPには解決策ではありません。想像:

SOME_BOOST_PP_BLACK_MAGIC( (a)(b)(c) )
//             with cursor here ^

Emacs の Mt は and を交換bc、結果として(a)(c)(b).

機能するのは/\w yiwNviwpnviwgp. しかし、それは台無し""にされ"/ます。よりクリーンなソリューションはありますか?

更新²:

解決済み

:nmap gn :s,\v(\w+)(\W*%#\W*)(\w+),\3\2\1\r,<CR>kgJ:nohl<CR>

不完全ですが、機能します。

私の注意を引いてくれた Camflan に感謝し%#ます。もちろん、それはすべてwikiにありますが、機能の正確な(Emacs は完全に正しい) 重複の問題を解決できるとは思いませんでしたtranspose-words

4

6 に答える 6

7

これらは私の .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*
于 2008-09-26T20:38:07.773 に答える
5

状況に応じて、dWwP のように W または B コマンドを使用できます。「大文字」バージョンは、句読点を含め、次/前のスペースにスキップします。f および t コマンドも、削除された範囲の末尾を指定するのに役立ちます。

Vim Tips Wikiには、さまざまなスワッピング手法に関する議論もあります。

于 2008-09-26T19:33:21.203 に答える
5

行の途中で、最初の単語の最初の文字に移動してから、

dw wP

行の終わり (つまり、行の最後の 2 つの単語) で、単語の間のスペースに移動して、

2dw bhP

VIMとEmacsコマンドの便利な等価性から


次のようなものをvimrcファイルに追加することで、それらのショートカットキーを追加できます。

map L dwwP
map M 2dwbhP 

その場合、SHIFT-L (コマンドモード) は行の途中で単語を切り替え、SHIFT-M は最後にそれを行います。

注意: これは、スペースで区切られた単語で最もうまく機能し、OP の特定のケースをうまく処理しません。

于 2008-09-26T19:40:48.037 に答える
2

http://vim.wikia.com/wiki/VimTip10にヒントがあります。しかし、私は自分でロールすることを選択します。私のスニペットには、ヒントで述べた方法よりも明らかな利点が 2 つあります。1) カーソルが単語内にない場合に機能します。2) 画面全体が強調表示されません。

これは emacs の 'transpose-words' とほとんど同じように機能しますが、転置が不可能な場合は何もしません。(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>
于 2012-09-20T12:09:05.697 に答える
0

Mark と CapnNefarious が言ったように、dwwP または dWwP を使用できますが、私自身のメモがいくつかあります。

  • あなたが示した例のように、カーソルが2番目の単語の最初の文字にある場合、dwbP(または句読点を処理するためにdWbP)を使用できます。
  • カーソルが単語の途中にある場合は、dawbP/daWbP を使用できます。
于 2008-09-26T19:51:43.143 に答える