我正在尝试使用以下映射来交换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,:,#
以上映射适用于交换(推送单词),除非重音字符开始单词。由于我用西班牙语写的经常使用重音字符,所以如何更改正则表达式来解决这个问题呢?
答案 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'。 然后记录我的行动:
按'dW'剪切单词,(大写w并假设单词以空格结尾)
以e
按“a”
按''
输入'p'进行粘贴。
我第一次知道它太麻烦了,但是一旦你保存它就可以通过'@l'在任何一对单词上回忆它,'l'是我们从上面的记录键。