web-dev-qa-db-ja.com

grep -nの結果でフォーマットされた特定の行番号でファイルを開くことは可能ですか?

私はよくgrep-nオプションと一緒に使用して、行番号を一覧表示します

$ grep -n xyz .*
/ext1/acheong/foo/bar/a.cc:42:    inline bool abc(int xyz);
/ext1/acheong/foo/bar/a.cc:43:    inline bool def(int xyz);
/ext1/acheong/foo/bar/b.cc:415:            int xyz = result;
/ext1/acheong/foo/bar/b.cc:490:                xyz += result;
$

vimにエイリアスを作成することは可能でしょうか。

vim /ext1/acheong/foo/bar/b.cc:415

ファイルを開いて415行目を自動的にシークしますか?

cshで可能ですか? (はい、はい、cshは悪魔とすべての不聖なものを引き出しますが、私には選択の余地がありません...)他のシェルの答えも役に立ちます。

4
Andrew Cheong

まあ、それはエイリアスではありません、あなたはこのようにvimを使うことができます:

vim +<LineNumberHere> fileName

だから、例えば

vim +150 .bash_history

.bash_historyファイル(bash用)を開き、150行目に移動します。

ちなみに、これは検索語でも実行できます。例えば

vim +/MyTerm MyFile

myFileを開き、MyTermの最初のオカレンスに上から移動します。

楽しい!

7
David Moye

これに対する1つの解決策は、 file_line.vim プラグインを使用することです。これにより、ファイル名と行番号をVimの引数として、またはVimのコマンドラインで指定できます。

もう1つは、このスクリプトです。

$ cat $(which vimgrep)
#!/bin/bash

tmp=$(mktemp)

cat > $tmp
exec < /dev/tty
vim --cmd 'let &efm=&gfm' -q $tmp "$@"
rm $tmp

これは次のように使用できます:

$ grep -Hn xyz .* | vimgrep

そして、すべての一致をVimのquickfixエラーリストにロードします。見る

:help quickfix.txt

-Hが1つのファイル名のみに展開された場合でも、ファイル名がgrepの出力に含まれるようにするには、grepの.*オプションに注意してください。

4
garyjohn

最も単純で回復力のある方法:

  1. 新しいファイルを作成します~/.bin/vimそして以下のコードを貼り付けます
  2. シェルエイリアスを作成します:in ~/.bashrc行を追加alias vi=~/.bin/vim

これはパラメータ置換と呼ばれ、基本的に提供されたパラメータを ''(コロン)で分割します。

#!/usr/bin/env bash

if [[ ${1} == *":"* ]]; then
    vim ${1/:*/} -c "${1/*:/}"
else
    vim ${1}
fi

次に、次のように単純に使用できます。vim /ext1/acheong/foo/bar/b.cc:415

1
ww12

Vim自体からgrepを実行できます。

:grep xyz *

次に、クイックフィックスウィンドウを開きます。

:cw
1
romainl

vim-fetch コロンで区切られた値として提供される特定の場所でファイルを開くことができます。

1
phil pirozhkov