我的日常工作通常需要在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,这看起来非常直观。还有其他类似的东西我应该看一下吗?
答案 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-]和一个数字。