Использовать Netrw или Nerdtree в Zsh / Bash для выбора файла BY BROWSING?

Часто я нахожусь в оболочке, желая вставить имя файла в длинную команду.

Я хотел бы нажать ярлык и использовать Netrw или Nerdtree для поиска файла или каталога и вставить его в команду, которую я создаю.

Так что если я был в папке и хотел сравнить 2 файла:

  • Я бы diff
  • то я хотел бы нажать на свой ярлык и визуально просматривать с помощью Netrw или Nerdtree и выбрать файл.
  • Это имя файла теперь добавлено в мою команду diff … eg diff /tmp/file1.txt
  • Я снова нажимаю ярлык и просматриваю второй файл /super/ez/another/file/somewhere/else/compare.txt
  • это добавляет второй файл в мою команду diff , поэтому теперь у меня есть:

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

Возможно ли это с помощью любого инструмента ? Мне нравится Netrw в Vim, но я хочу попробовать новые вещи!

Обратите внимание, что мне неинтересно, что Tab заполняет имена файлов, используя globbing. Это работает иногда, но не все время. Мне нравится Netrw и мне хотелось бы выяснить, как использовать его для выбора имени файла при просмотре.

Вы в основном уже знаете ответ отсюда . Совсем легко собрать все это так:

 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 Мой код содержит довольно примитивное экранирование, вы можете улучшить его и, возможно, изменить способ добавления расстояния между аргументами.

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 

Теперь вам просто нужно получить команду, которая позволяет просматривать файловую систему так, как вы хотите, и печатать результат на stdout.

EDIT: Вот очень простая версия вышеупомянутой функции, которая использует vim:

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

Вы можете перемещаться по vim / netrw, как обычно, а затем использовать <CA> (Ctrl-A) для A ccept имя файла / каталога.

Очевидно, что это лишь очень простая функция. Если вы хотите больше функциональности, вы также можете написать функцию автозагрузки vim и вызвать это из командной строки vim с -c.