【问题标题】:Vim, swapping words with accented charactersVim,用重音字符交换单词
【发布时间】:2013-03-08 17:58:46
【问题描述】:

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

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

【问题讨论】:

    标签: regex vim non-ascii-characters


    【解决方案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>
    

    【讨论】:

      【解决方案2】:

      我通常更喜欢宏,假设我们有如下一行(是的,这没有任何意义,我只是用它来解释):

      实验无情

      现在在 vim 中,我将转到这一行的开头,然后按 q,然后按一个记录键(任何字母数字键)让我们说“l”。 然后记录我的动作:

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

      2. 使用 e 进入词尾

      3. 按“a”添加空格

      4. 按''

      5. 输入“p”进行粘贴。

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

      【讨论】:

      • 我宁愿使用我在原始帖子中定义的映射。那么你知道如何更改正则表达式吗?
      • 对不起,我在配置vim map方面没有太多经验。
      猜你喜欢
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多