有没有办法定义什么vim应该识别为一个单词?我想将\ w +正则表达式分配给所有单词键动作,例如" w"," e"," b" ...我可以在正常模式下进行像这样:
nnoremap <silent> w :call search('\w\+')<CR>
但它对视觉模式和操作员待定模式不起作用。如果有设置可以做到这一点会很棒。
答案 0 :(得分:1)
对于像 w 和 e 这样的小写动作,“单词”的定义由:iskeyword
选项控制;请参阅:help iskeyword
。基本上它由作为单个字符或范围给出的字符列表组成,以逗号分隔。我认为各种语法文件会针对不同语言进行调整,以便这些命令按标识符移动。看起来您不能为此指定正则表达式。
像 W 和 E 这样的大写动作看起来不像是可以重新编程的。他们对“WORD”的定义是用空格分隔的非空白字符,加上每个空行都算作“WORD”。
然而,不幸的是,看起来有一种行为有效,iskeyword
个字符只是将输入分为iskeyword
个字符,非iskeyword
字符和空格的序列。当使用 w 和相关命令时,它们会跳过空白,但同时访问iskeyword
令牌和非iskeyword
令牌。
使用:map
重新映射到/
或?
按键序列在视觉和命令模式下均可使用:
:map w /\<\w/^M
:map b ?\</\w^M
:map e /\w\>^M
它适用于两者,因为/
和?
搜索在两种模式下都有效。当然,这是一个丑陋的解决方案,因为它破坏了当前的搜索模式,如果你打开:set hls
(highlightsearch
),单词的提示/尾部会突出显示。
由于锚定操作符的行为方式,上述搜索不是很令人满意。例如,我无法让a
或{abc
上的(abc
“登陆”。
以下映射效果更好。每个触发几次搜索。 /.
和?.
次搜索会被用作进行搜索的技巧
下一个或上一个字符,如果我们在一行的最后一个字符上,我们会转到下一行的第一个字符,反之亦然。
:map b ?\w^M?\W^M/.^M
:map w /\W^M/\w^M
:map e /\w^M/\W^M?.^M
还有一些怪癖。例如,一个单词列表,如:
abc
def
ghi
不包含非词类\W
的匹配项。匹配必须包括行结尾。继续前进,对这方面的 w 的改进是为这样的行添加匹配:
:map w /\(\W\\|$\)^M/\w^M
注意管道前面的双反斜杠!最右边的反斜杠会转义管道,因此:map
命令的处理不会将其视为命令分隔符。然后我们留下\|
,这是分支的正则表达式运算符。同样,可以改进其他两个映射;我将其作为一项练习。
答案 1 :(得分:1)
根据我对你的问题的理解,以及对Kaz回答的讨论,我认为你正在寻找的是Kana的smartword插件:http://www.vim.org/scripts/script.php?script_id=2470。
您必须使用:help smartword
检查文档,但是如果您安装插件并将内置字映射映射到插件,那么简短版本就是...
map w <Plug>(smartword-w)
map b <Plug>(smartword-b)
map e <Plug>(smartword-e)
map ge <Plug>(smartword-ge)
...然后内置插件将沿途跳过任何非单词字符。我已经使用了很多年了,而且我对它的表现非常满意。