5

シェルでは、次の関数を使用してファイルリストを作成し、vimに渡します。

大丈夫だと思いますが、行参照を失いました。ファイルを正しい順序で開きますが、カーソルが最初の行から始まるため、テキストを再度検索する必要があります。

〜/.bashrcの実際の関数

function vimgrep(){
   vim `grep -IR "$1" * | awk -F: '$1!=f{print ""$1"";f=$1}' | grep -v 'Test\|test'` +ls
}

function vimgrep2(){
   vim `grep -IR "$1" * | awk -F: '$1!=f{print ""$1"";f=$1}' ` +ls
}

Obs .: filelistはシェルからvimに移動する必要があり、エラーが発生した場合の:makeの結果と同様に、バッファリングされたファイルの行参照を保持する必要があります(ただし、下部のウィンドウ[:cwindow]はありません)。

編集済み:わかりました...それほどエレガントではありませんが、検索した文字列を+ /"$1"としてvimに渡すことができます。

   vim `grep -IR "$1" * | awk -F: '$1!=f{print ""$1"";f=$1}' ` +/"$1"

スクリプトが一時ファイルを使用しない場合は、より良いでしょう。

4

5 に答える 5

1

cnこれを使用するとcp、、、cc.. ectを介して試合間を移動できます:

function vimgrep(){
   vim -c "exec(\"grep $1 *\")"
}

ハイライトあり:

function vimgrep(){
   vim -c "exec(\"grep -IR $1 *\")" -c "let @/='$1'" -c "set hls"
}
于 2012-07-30T16:36:03.010 に答える
1

外部Grepでの行番号の使用

私の知る限り、Vimはリストの最初のファイルにのみフラグを適用するため、行番号オプションフラグを使用して一度に複数のファイルを開くことはできません。マニュアルページには次のように書かれています。

 +[num]      For the first file the cursor will be positioned on line  
             "num". If "num" is missing, the cursor will be positioned
             on the last line.

したがって、各ファイルで一度に1つずつ関数を呼び出すことも、一度に2つの位置パラメーター(ファイル名と正規表現)を操作するループに関数呼び出しを配置することもできます。前者は確かに簡単です。例えば:

vimgrep () {
    local file="$1"
    shift || return 1
    vim +$(egrep -n "$1" "$file" | cut -d: -f1) "$file"
}

# Sample function call.
vimgrep /etc/password '^www-data'
于 2012-07-27T18:54:29.297 に答える
1

免責事項:私は何も知りませんvim

マニュアルページには+<line no>、提供されたファイルのその行にジャンプするような引数があります。この情報に基づいて、私はこのスクリプトを作成しました。次のようなコマンドラインを使用してvimを起動します。

$ vim +n1 file1 +n2 file2

'~/.bashrc非常に小さいので、シェル関数として配置することもできます。

使用法: vimgrep -e <search pattern> <fileglob>

検索パターンは、によって理解される任意の正規表現にすることができgrep、ファイルグロブは。によって理解されるシェルグロブbashです。

#!/bin/bash

# set -o xtrace # uncomment to debug

# declare variables
declare -a grepopts files

[[ $1 =~ -e$ ]] && grepopts+=("-e") && grepopts+=("$2") && shift 2

files=("${@}")

vim $(egrep -n -m1 -H "${grepopts[@]}" "${files[@]}" | \
        sed -e 's/^\(.\+\):\([0-9]\+\):.\+$/+\2 \1/')

警告:ファイル名に:文字が含まれていると、このスクリプトは失敗します。

于 2012-07-30T20:51:25.923 に答える
1

ここにあなたが望むものを正確に提供するいくつかの機能があります。指定された正規表現に一致する最初の行に設定された行で、バッファー内の各ファイルを開きます。

私はこのような短い記述的なbash関数を好む傾向があります。なぜなら、bashは大量のコードブロックを使用せずに理解するのに十分難しいからです。

これの唯一の欠点は、バイナリファイルを効果的に除外しないことです。find_nonbinary関数を更新すると、これが修正されます。

これらはヘルパー関数です。それらは直接実行されるべきではありません。

# Using print0 to handle files with weird names.
# This is just a quick placeholder.
# You can play with this to get better results.
function __find_nonbinary() {
    find -type f -print0
}

function __generate_vim_cmds() {
    xargs -0 awk -v regex="$regex" \
        '$0 ~ regex {printf "e +%s %s\n", FNR, FILENAME; nextfile}'
}

function __combine_vim_cmds() {
    declare -a vim_cmds

    while read line; do
        vim_cmds+=( " $line " )
    done

    # Force subshell to prevent IFS from being clobbered.
    (
        IFS="|"
        echo "${vim_cmds[*]}"
    )
}

これが実際に使用する関数です。

function vimgrep() {
    local regex="$1"

    if [[ -z "$regex" ]]; then
        echo "Usage: $0 regex" 1>&2
        exit 1
    fi

    local vim_cmds=$(
        __find_nonbinary    |
        __generate_vim_cmds |
        __combine_vim_cmds
    )

    if [[ -z "$vim_cmds" ]]; then
        echo "No files matching $regex found." 1>&2
        exit 1
    fi

    vim -c "$vim_cmds"
}
于 2012-07-31T12:04:37.883 に答える
1

vimgrepVimには、使用できるコマンドも付属しています

function vimgrep() {
    local regex="$1"

    if [[ -z "$regex" ]]; then
        echo "Usage: $0 regex" 1>&2
        exit 1
    fi

    vim -c "vimgrep /$regex/ **"
}

その下にたくさんのファイルがあるディレクトリで実行するように注意してください。

于 2012-07-31T12:46:49.767 に答える