在vim中,如何创建自定义单词边界移动?

7
据我所知,w通过将文本分成三组来识别单词边界:
1)在iskeyword设置中指定的字符(字母、数字和下划线)
2)其他不可打印的字符(符号)
3)空白字符
每次按下w,它都会进入下一组1或组2。 我想自定义它,使其仅转到下一组1,跳过“符号词”。
几乎起作用的是: nnoremap w /\k\+<CR> 它使用了\k字符类。 但是这很丑陋,因为它模拟了我执行搜索,从而改变了我的高亮显示,混杂了我的搜索历史记录,谁知道还会发生什么。 有没有办法使其像w命令一样正常工作,“干净”呢?

我不太明白你想要什么。W有帮助吗?它有两组字符:空格和非空格,所以它总是跳到下一个空格后的第一个字符。 - Dan Hulme
不,它并不完全起作用:W 将符号字符与字母字符归为一类。我想要的是,实际上将符号与空格归为一类,这样可以跳过符号,同时仍然创建单词边界。 - Ein
2个回答

3
我认为您正在寻找操作员挂起模式,也称为xmap、smap及其相关内容。
在其他SO答案中,我已经做了一些这些内容的示例(链接)
其中最相关的示例可能是: 您还会发现一些类似的技术,可能对您有用。

1
我记得那个。非常好的答案。 - lucapette
将其作为运算符的适当动作非常好,那个SO答案教会了我一些新东西。但真正让我不高兴的是模拟“我执行搜索”以移动,我必须这样做来定义我的相应的xmapomap - Ein
@Nuno:记录一下,文档说从Vim脚本(函数)内搜索不会影响您的“当前”搜索模式、搜索历史记录等。(无论如何,任何_其他_副作用都可以在同一个函数中恢复) - sehe
如何定义一个函数,将光标移动到下一个 /\k\+ 搜索结果? - Ein
4
这个命令 :search('\m\k\+', 'W') 可以让光标跳转到下一个匹配 /\k\+ 的搜索结果,而且不会影响搜索历史记录或高亮显示。更多选项请查看 :h search() - Peter Rincker
@PeterRincker 谢谢!如果您将此作为答案发布,我会接受它。 - Ein

1

我可能无法在这里提供太多帮助.. 我甚至不知道在这种情况下 \k 代表什么,但你可以解决你提出的两个直接问题:

nnoremap w /\k\+<CR>:nohl<CR>:call histdel("search", -1)<CR>

这看起来很丑,而且高亮可能会闪烁,但也许这能指引你朝正确的方向前进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接