0

私は:!grep "tag1" filename | grep "tag2" filename | grep -n "tag3 or more" filenamevimのコマンドを使用して、Firefoxのタグ機能と同様に、1つの大きなファイル内のタグ(スニペットの上部にある簡単なコメント)に基づいてコードスニペットを検索しています。トリッキーなことを覚えるためにスニペットを使用します。

これは毎回書き出すのが面倒です。エイリアスを作成するか、次のような機能を実行したいと思います。

:!greptag tag1 tag2 ... tag39

そして、現在のドキュメントを検索し、すべてのタグが付いた行を返す必要があります。

Vimはインタラクティブシェルモードに設定されているため、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/!コマンドは、行にtag1が含まれている場合にのみコマンドを実行するようにsedに指示するアドレスプレフィックスです。実行するコマンドは「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 に答える