Zsh / BashでNetrwまたはNerdtreeを使用して検索してファイルを選択しますか?

Zsh / BashでNetrwまたはNerdtreeを使用して検索してファイルを選択しますか?

私はしばしばシェルに入り、長いコマンドにファイル名を挿入したいと思います。

ショートカットを選択し、NetrwまたはNerdtreeを使用して検索ファイルまたはディレクトリを見つけて、私が作成しているコマンドに貼り付けます。

したがって、フォルダにあり、2つのファイルを比較するには、次の手順を実行します。

  • 入るよdiff

  • その後、ショートカットをクリックし、NetrwまたはNerdtreeを使用して視覚的にナビゲートし、ファイルを選択したいと思います。

  • これで、ファイル名が私のdiffコマンドに追加されました...例:diff /tmp/file1.txt

  • もう一度ショートカットをクリックして2番目のファイルを見つけて、 /super/ez/another/file/somewhere/else/compare.txt

  • その後、私のコマンドに2番目のファイルを追加して、次のようにdiffなりました。

      diff /tmp/file1.txt /super/ez/another/file/somewhere/else/compare.txt
    

これは使えますか?どんなツールでも?私はVimのNetrwが好きですが、新しいことを試してみたいと思います!

Tabファイル名を完成させるためにワイルドカードを使用することには興味がありません。これは時々動作しますが、常にそうではありません。私はNetrwが好きで、それを使ってナビゲートしてファイル名を選択する方法を知りたいです。

答え1

Zshを使用すると、シェル機能をキーにバインドでき、コマンドラインにテキストを入力する組み込み機能もあります。したがって、次のようにすることができます(zshから):

# define a function that does the work
function my_browser_function () {
  local result
  result=$( some command that returns the filename )
  # print -z $result (see comments)
  LBUFFER+=$result
}
# turn the function into a widget
zle -N my_browser_function
# bind it to some key ("CTRL-X I" for example)
bindkey '\Cxi' my_browser_function

必要に応じてファイルシステムを検索し、結果を標準出力に印刷できるコマンドを実行するだけです。

編集:vimを使用する上記の関数の非常に基本的なバージョンは次のとおりです。

function my_browser_function () {
  local file=$(mktemp)
  vim -c "map <C-A> :cal system('echo '.expand('%').'/'.getline('.').'>$file')<bar>q<cr>" .
  LBUFFER+=$(<$file)
  rm $file
}

いつものようにvim / netrwに移動し、<CA>(Ctrl-A)を使用して次のことができます。ファイル/ディレクトリ名を受け入れます。

明らかに、これは非常に基本的な機能です。さらに機能が必要な場合は、vim自動ロード機能を作成し、-cを使用してvimコマンドラインから呼び出すこともできます。

答え2

2022年版の回答

Vifm v0.8以降では、optionsを介してこれを達成するためのより良い方法を提供します --choose-files。これは設定ディレクトリの場所とは無関係です。

zsh バージョン

function insert_files() {
    local file
    while read file; do
        LBUFFER+="$(printf %q "$file") "
    done <<< "$(vifm --choose-files - < /dev/tty)"

    zle reset-prompt
}
zle -N insert_files
bindkey '^t' insert_files

バッシュバージョン

function _insert_files() {
    local file
    local files
    while read -r file; do
        files="$files$(printf %q "$file") "
    done <<< "$(vifm --choose-files - < /dev/tty)"

    local prefix=${READLINE_LINE::READLINE_POINT}
    local suffix=${READLINE_LINE:READLINE_POINT}
    READLINE_LINE=${prefix}${files}${suffix}
    READLINE_POINT=$(( READLINE_POINT + ${#files} ))
}
bind -x '"\C-T": _insert_files'

元の回答(2014)

あなたは基本的にすでに答えを知っていますここ。下の図に示すように、これらすべてを1つにまとめるのはとても簡単です。

function insert_files() {
    vifm -f < /dev/tty > /dev/tty

    while read l; do
        LBUFFER+="'$l' "
    done < ~/.vifm/vimfiles

    zle reset-prompt
}
zle -N insert_files
bindkey '^t' insert_files

私はzshユーザーではないので、Lucasの答えからコード構造を盗んだ。 Bashの場合、ショートカット内で外部コマンドの出力を処理する方法を見つけましたが、見つかりませんでした。

デモ

PS内のコードには非常に原始的なエスケープが含まれているため、これを改善し、パラメータ間にスペースを追加する方法を変更したい場合があります。

関連情報