[英]Vim, swapping words with accented 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,:,#
上面的映射可以很好地用于交换(推送单词),除非带有重音符号的单词开头。 由于我经常用西班牙语写带重音符号的字符,因此如何更改正则表达式来解决此问题?
问题在于\\_W
“匹配非\\_W
和换行符”原子。 在Vim中,单词仅限于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>
我通常更喜欢一个宏,可以说我们有如下一行(是的,我只是用它来解释,这没有任何意义):
实验性的
现在在vim中,我将转到此行的开头,然后按q,然后按一个记录键(任何字母数字键),让我们说“ l”。 然后记录我的动作:
按'dW'剪切单词(大写w并假设单词以空格结尾)
继续以e结尾
按“ a”添加空格
按 ''
输入“ p”进行粘贴。
我第一次知道它太麻烦了,但是一旦将其保存起来,您就可以用“ @l”对任何单词进行调用,“ l”是我们上面的记录键。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.