Vim,用重音字符交换单词

时间:2013-03-08 17:58:46

标签: regex vim non-ascii-characters

我正在尝试使用以下映射来交换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,:,#

以上映射适用于交换(推送单词),除非重音字符开始单词。由于我用西班牙语写的经常使用重音字符,所以如何更改正则表达式来解决这个问题呢?

2 个答案:

答案 0 :(得分:1)

问题在于\_W匹配非WORD和换行符“atom。在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>

答案 1 :(得分:0)

我通常更喜欢一个宏,让我们说我们有一条如下的线(是的,它没有任何意义我只是用它来解释):

experimentacióninclacable

现在在vim我会开始这一行,然后按q后跟一个记录键(任何字母数字键)让我们说'l'。 然后记录我的行动:

  1. 按'dW'剪切单词,(大写w并假设单词以空格结尾)

  2. 以e

  3. 继续结束
  4. 按“a”

  5. 添加空格
  6. 按''

  7. 输入'p'进行粘贴。

  8. 我第一次知道它太麻烦了,但是一旦你保存它就可以通过'@l'在任何一对单词上回忆它,'l'是我们从上面的记录键。