zshからvimへ `ファイル名を開く'、たぶん実行前のフックですか?

zshからvimへ `ファイル名を開く'、たぶん実行前のフックですか?

フラグメント:

次の作品は...

function default_open_in_vim () {
    filename=$(echo -e "$1" | tr -d '[:space:]')
    if [[ -f $filename ]]; then
        vim $filename
    fi
}

autoload -Uz  add-zsh-hook
add-zsh-hook preexec default_open_in_vim

...しかし、vimを閉じると、次のような結果が表示されます。

zsh: permission denied: src/findPathBFS.js

長いバージョン:

私は同じことを繰り返し続けていることを発見しました。

現在のディレクトリでファイルを検索するには、CTRL-tと入力します。次にEnterキーを押すと、fzfはカーソル位置にファイル名を挿入します。素晴らしいです。時にはファイルをgrepしたり、cattingやgit-checkoutingなどを実行します。時にはvimで開きますが、vim CTRL-tで起動しないことがあります。今やるべきことは、CTRL-aを押して端末の行の先頭に移動し、vim <cr>と入力することです。

問題は、vimでCTRL-tを押す前にこれを入力しなかったという事実さえ認識しないことが多いことです...問題を見ることができます。

前に cd なしでディレクトリ名を入力すると、AUTO_CD がある zsh はそのディレクトリに CD を入力し、同様の操作を実行したいと思います。前にCDなしでファイル名を入力したら、単に開く必要があります。 vimから。

Preexecフックは動作しますが、エラーメッセージは気に入らません。

コマンドをキャンセルできればと思いますが、zshはpreexecフックからコマンドをキャンセルすることを許可していないようです。 (おそらくキャンセルできますが、どうすればいいかわかりません。)

man zshmiscに文書化された内容を試してみましたが、command_not_found_handler「コマンド」が有効なファイル名の場合は役に立ちません。

答え1

これは働きます:

command_not_found_handler () {
    if [[ $# -eq 1 && -f $1 ]]; then
      vim "$1"
    else
      exit 127
    fi
}

しかし、私はそれが非常に危険であることがわかりました。あなたが何か間違っている可能性があります。たとえば、現在のディレクトリでパス内のコマンドと同じ名前のファイルを編集しようとすると、パス内のコマンドが実行されます。それはあなたの問題ではなく、command_not_found_handlerあなたの要求です。別の問題は、このような内容を入力するとfoo/barファイルが実行可能でない場合は編集し、実行可能であれば実行することです。

現在のディレクトリのファイルがPATHのコマンドより優先されるようにするには、次のようにします。DEBUGまたはaccept-line編集コマンドのオーバーロード。しかし、これは2番目の問題を解決しません。

他のユーザーインターフェイスをお勧めします。コマンドの実行を中断しないでください。編集するには、Return キーを押すのではなく別のキーを押し、そのキーが行の前にvim挿入されるように構成します。これはvim、シェル履歴にコマンド呼び出しを維持することを含むいくつかの良い利点があります。

zle -N edit-file
edit-file () {
  BUFFER="vim $BUFFER"
  zle accept-line "$@"
}

関連情報