Intereting Posts
Для чего используется ~ / default? Создание сертификата * .local ssl Есть ли простой способ сделать эквивалент `sed …` заменяя одну и ту же строку несколькими значениями? смотрите оба, текст, курсоры с двумя фреймами в emacs Инструмент для генерации трафика TCP Зачем мне нужно вручную включать специальные клавиши ноутбука в openbox рекурсивное удаление с помощью sftp? просто наберите несколько шаблонов на разных строках Странные ошибки firefox после миграции домашних областей на NAS-накопитель Как apt-get имеет дело с несколькими источниками? псевдоним для уничтожения всех процессов попадания grep Как я могу перечислить все файлы, но только в каталогах, у которых нет подкаталогов? Как исправить графические проблемы с приложениями Qt? (дельфин: 14635): Gdk-WARNING **: ошибка shmget: ошибка 28 (на устройстве не осталось места) Контрольное имя файла, хранящееся в tar-архиве Как использовать sed, awk или grep для удаления определенного шаблона, но все остальное

Использовать 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.