1

次のマッピングを使用して、Vim で単語を交換しようとしています。

" Swap current word with previous one (push word to the left)
nnoremap <silent> <A-h> "_yiw?\k\+\_W\+\%#<CR>:s/\(\%#\k\+\)\(\_W\+\)\(\k\+\)/\3\2\1/<CR><c-o><cl>:noh<CR>

" Swap current word with the next one (push word to the right)
nnoremap <silent> <A-l> "_yiw:s/\(\%#\k\+\)\(\_W\+\)\(\k\+\)/\3\2\1/<CR><c-o>/\k\+\_W\+<CR><c-l>:noh<CR>

また、vimrcファイルには次のものがあります

set isk=@,48-57,_,192-255,:,#

上記のマッピングは、アクセント付きの文字が単語を開始する場合を除いて、スワッピング (単語のプッシュ) には問題なく機能します。私はスペイン語のアクセント付き文字を頻繁に使用するので、正規表現を変更してこの問題を解決するにはどうすればよいですか?

4

2 に答える 2

1

問題は、\_W「単語以外と改行に一致」アトムにあります。Vim では、WORD は ASCII 文字に制限されているため、アクセント付きの文字がここで一致し、間違った境界が作成されます。代わりに、「非キーワードと改行」が必要です。\Kはの否定ではないため、「キーワードではない任意の文字 (および改行)」\kを使用する必要があります。\%(\k\@!\_.\)これらは結果のマッピングです:

nnoremap <silent> <A-h> "_yiw?\k\+\%(\k\@!\_.\)\+\%#<CR>:s/\(\%#\k\+\)\(\%(\k\@!\_.\)\+\)\(\k\+\)/\3\2\1/<CR><c-o><c-l>:noh<CR>

nnoremap <silent> <A-l> "_yiw:s/\(\%#\k\+\)\(\%(\k\@!\_.\)\+\)\(\k\+\)/\3\2\1/<CR><c-o>/\k\+\%(\k\@!\_.\)\+<CR><c-l>:noh<CR>
于 2013-03-09T20:37:49.743 に答える
0

私は通常、マクロを好みますが、次のような行があるとしましょう (はい、説明のために使用しているだけで意味がありません):

かけがえのない実験

今vimでこの行の先頭に行き、qを押してからレコードキー(任意の英数字キー)を押して「l」と言います。次に、私の行動を記録します。

  1. 'dW' を押して単語を切り取ります (大文字の w で、単語がスペースで終わると仮定します)。

  2. e で単語の終わりに進む

  3. 「a」を押してスペースを追加します

  4. プレス ''

  5. 「p」と入力して貼り付けます。

最初は手間がかかりすぎることはわかっていますが、一度保存すると、「@l」を使用して任意の単語のペアで呼び出すことができます。「l」は上記のレコード キーです。

于 2013-03-08T18:14:02.163 に答える