Vim - 网站搜索的快捷方式?

时间:2014-07-17 20:24:37

标签: search vim performance

我的日常工作通常需要在HTML或Sass部分中找到同名的HTML类或CSS选择器。

目前我正在这样做:

:vimgrep /searchTerm/ **/*.html

OR:

:vimgrep /searchTerm/ **/*.scss

但是,每次手动输入效率都非常低,因此我正在寻找快捷方式。我是Vim的新手,但是谷歌用谷歌搜索,所以我知道这是明智的。

是否可以创建一些捷径,所以我必须输入的是:

:se searchTerm scss:se searchTerm html并让它自动填写重复的部分?我只是在那个例子中使用:se,因为它很简洁,但我想它可能是什么。

或者,我应该使用哪些更智能的搜索工具?我习惯了Sublime的搜索,我一直都很满意 - 它快速闪电,还提供了一个结果列表,你可以选择点击一个直接进入类/选择器。

这里有任何指示/生产力提示。

更新:刚刚找到https://github.com/dkprice/vim-easygrep,这看起来非常直观。还有其他类似的东西我应该看一下吗?

3 个答案:

答案 0 :(得分:4)

好的,让我们把它变成一个自定义命令。 :se不会这样做,自定义命令必须以大写字母开头,所以让我们使用:Se

:command Se vimgrep /searchTerm/ **/*.html

这还没有参数化。让我们允许搜索词的参数:

:command -nargs=1 Se vimgrep /<args>/ **/*.html

然后,默认文件扩展名为当前缓冲区;我们现在需要:execute来插值:

:command -nargs=1 Se execute 'vimgrep /<args>/ **/*.' . expand('%:e')

将模式和扩展名作为参数传递,需要我们拆分参数。 Vim可以使用<f-args>传递单个字符串;我们可以通过用[]包装它来制作一个List,然后使用索引来提取参数:

:command -nargs=+ Se execute 'vimgrep /' . [<f-args>][0] . '/ **/*.' . [<f-args>][1]

瞧!


当然,有几个插件可以让搜索更容易,但正如您所看到的,逐步为特定用途构建自定义命令也非常容易。 :help :command拥有所有信息。

答案 1 :(得分:2)

您可以通过将:vimgrep缩短为:vim来输入更少的内容。

在命令中附加| cw会在quickfix窗口中打开匹配列表。该窗口可以像任何其他窗口一样进行导航和搜索,最重要的是,您可以跳转到列表中的匹配项,而无需窗口本身。请参阅:help quickfix

正如Ingo所证明的那样,它不仅可行,而且强烈建议编写自定义命令和映射以简化常见任务。

例如,此映射以递归方式搜索当前目录下每个*.html文件中光标下的单词,并在quickfix窗口中显示匹配列表(如果有):

:nnoremap <key> :execute "noautocmd vimgrep /" . expand('<cword>') . "/ **/*.html <bar> cwindow"<CR>

请注意,:vimgrep稍微慢于:grep,您可以更改grepprg选项以使用Ack或Ag等外部工具很多快于grep

答案 2 :(得分:0)

键入<c-r><c-w>会将光标下的单词复制到命令行。 :vimgrep / searchTerm / ** / *。在大多数情况下,ext可以缩短为:vim <c-r><c-w> **/*.ext。如果您不介意搜索所有文件类型,那么:vim <c-r><c-w> **甚至更短(谨防数据/二进制文件)。此外,q:将打开可搜索的命令行窗口。因此,在您第一次输入搜索后,您可能?vim<CR>Wcw并保留以前使用的扩展名,即使有多个也是如此。

由于这些工具的可用性,而不是编写自定义命令(这非常简单),我会尝试更普遍地考虑问题并将其用作提升您对vim知识的手段。

当然,如果您使用的是外部grep程序,请执行以下操作:gr -R searchTerm。也很短暂。

如果您想使用lowercase:se命令,可以使用以下命令:

"--Redefine command (taken from vim wiki)--
    command! -nargs=+ CommandCabbr call CommandCabbr(<f-args>)
    function! CommandCabbr(abbreviation, expansion)
        execute 'cabbr ' . a:abbreviation . ' <c-r>=getcmdpos() == 1 && getcmdtype() == ":" ? "'
        \. a:expansion . '" : "' . a:abbreviation . '"<CR>'
    endfunction

注意:我没有写这个功能,我在网上把它拿起来(但我不记得在哪里)。 然后你可以使用:CommandCabbr se Se。它基本上是命令行缩写,它将自身限制为仅在命令行的开头扩展(因此se不会作为命令参数或其他东西扩展)。

在任何情况下,我都倾向于不编写新命令,除非我觉得它们解决了一般任务,因为为每个小任务编写特定命令会使你的vim fu混乱,因为这样可以避免找到更通用的解决方案。这里的特殊问题是如何对程序进行结构化搜索,而一般解决方案实际上是获得ctags的css / scss支持。然后你可以使用g_CTRL-]和一个数字。