0

:!grep "tag1" filename | grep "tag2" filename | grep -n "tag3 or more" filename在 vim 中使用命令在一个大文件中根据它们的标签(片段顶部的简单注释)搜索我的代码片段,类似于 firefox 的标签功能。我使用片段来记住棘手的事情。

每次写出来都很痛苦。我想创建一个别名,或者函数来做这样的事情:

:!greptag tag1 tag2 ... tag39

它应该搜索当前文档并返回带有所有标签的行。

Vim 设置为交互式 shell 模式,以便它可以解析我的 bashrc 中的别名/函数。

set shellcmdflag=-ic "lets vim use bashrc

如何在 bash 中构造一个允许像这样的变量参数的函数?

4

2 回答 2

2

像这样的东西怎么样:

greptags() {
 if [[ -z "$1" ]] ; then
  cat
 else
  local t="$1" ; shift
  greptags "$@" | grep "$t"
 fi
}
greptag() {
 local f="$1" ; shift
 local t="$2" ; shift
 grep "$t" "$f" | greptags "$@"
}

(未经测试,可能不完全是您想要的,但说明了这个想法)。

于 2012-10-04T20:34:22.197 回答
2

你也可以使用 sed:

sed e '/tag1/!d;/tag2/!d;.../tagN/!d' filename

/tag1/!命令是一个地址前缀,告诉 sed 仅在该行包含 tag1 时才执行该命令。我们执行的命令是“d”,删除该行。

一个函数(在 .bashrc 中)将是:

greptags () {
    local filename="$1"
    shift
    sed "$filename" -e "$(echo "$@" | sed -e 's,\([^ ]*\) *,/\1/\!d;,g')"
}

请注意,我们使用另一个 sed 命令将参数解析为最终的 sed 命令列表。基本上,对于每个单词(没有空格),我们删除它后面的空格并将其放入/tagN/!d;命令形式中。

并称之为:

greptags filename tag1 tag2 tag3 tag4

希望这会有所帮助=)

于 2012-10-04T21:10:02.373 回答