我在vim中使用:!grep "tag1" filename | grep "tag2" filename | grep -n "tag3 or more" filename
命令在一个大文件中根据标签(在代码段顶部的简单注释)搜索我的代码段,类似于firefox'标签功能。我使用片段来记住棘手的事情。
每次写出都很痛苦。我想做一个别名,或者做一些像这样的事情:
:!greptag tag1 tag2 ... tag39
它应该搜索当前的文档并返回包含所有标记的行。
将Vim设置为交互式shell模式,以便它可以解析我的bashrc中的别名/函数。
set shellcmdflag=-ic "lets vim use bashrc
如何在bash中构造一个允许这样的变量参数的函数?
答案 0 :(得分: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 "$@"
}
(未经测试,可能不是完全你想要什么,但说明了这个想法)。
答案 1 :(得分: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
希望这有助于=)