在 vim 中,如何进行自定义单词边界运动?
Posted
技术标签:
【中文标题】在 vim 中,如何进行自定义单词边界运动?【英文标题】:In vim, how do I make a custom word boundary motion? 【发布时间】:2012-03-21 09:37:06 【问题描述】:据我了解,w
通过将文本分成 3 组来识别单词边界:
1) 在iskeyword
设置中指定的字符(字母、数字和下划线)
2) 其他不可打印的字符(符号)
3) 空白字符
每次按 w
时,它都会转到下一个组 1 或组 2。我想对其进行自定义,使其仅转到下一个组 1,跳过“符号词”。
几乎可行的是:
nnoremap w /\k\+<CR>
它使用iskeyword
字符类\k
。但它很丑,因为它模拟了我执行搜索,这改变了我的突出显示,弄乱了我的搜索历史,谁知道还有什么。有没有办法像w
命令一样“干净”地完成这项工作?
【问题讨论】:
我不太符合您的要求。W
有帮助吗?它有两组字符:空白和非空白,所以它总是在下一个空白之后的第一个字符。
不,它不太有效:W
将符号字符与字母字符混为一谈。我想要的是有效地将符号与空格合并,以便在创建单词边界的同时跳过符号。
【参考方案1】:
我认为您正在寻找operator pending mode,又名xmap, smap
和家人。
我已经做了一些in other answers on SO的例子:
最相关的例子可能是
vim: select inside dots您还会发现一些类似的技术,可能对您有用
【讨论】:
我记得那个。很好的答案。 让它成为操作员的正确动作很棒,而且这个答案教会了我一些新东西。但真正让我不开心的是模拟“我执行搜索”来移动,我必须这样做来定义我对应的xmap
和omap
。
@Nuno:为了记录,文档说从 vimscript(函数)内部搜索不会影响您的“当前”搜索模式、搜索历史等。(无论如何,任何其他副作用都可以简单地在同一个函数中恢复)
如何定义将光标移动到下一个/\k\+
搜索结果的函数?
这 :search('\m\k\+', 'W')
会将光标移动到下一个 /\k\+
搜索结果。作为奖励,它不会弄乱您的搜索历史或突出显示。有关更多选项,请参阅:h search()
。【参考方案2】:
我在这里可能帮不上什么忙..我什至不知道\k
在这种情况下是什么意思,但是您可以解决您提出的两个直接问题:
nnoremap w /\k\+<CR>:nohl<CR>:call histdel("search", -1)<CR>
它很难看,突出显示可能会闪烁,但也许这会为您指明正确的方向。
【讨论】:
以上是关于在 vim 中,如何进行自定义单词边界运动?的主要内容,如果未能解决你的问题,请参考以下文章