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 回答