Откройте файл, полученный в результате команды в vim
Я считаю, что делаю следующее почти каждый день
- Запустите поиск (
find -name somefile.txt
) - Откройте результат в
vim
Проблема заключается в том, что мне нужно скопировать и вставить результат find
в vim
. Есть ли способ избежать этого? Я немного экспериментировал (find -name somefile.txt | vim
), но ничего не нашел.
Заранее спасибо
9 ответов
Вы можете использовать подстановку команд:
vim $(find -name somefile.txt)
или
find -name somefile.txt -exec vim {} \;
Попробуйте следующее:
- start vim
- в vim, используйте следующее:
:r!find /<path> -name 'expression'
Результаты поиска должны появиться в vim, когда поиск будет завершен.
или
Try:
find /<path> -name > results.txt
vim results.txt
Если вы не возражаете запустить команду еще раз: нажмите Вверх и добавьте команду xargs
. Или используйте замену истории и запустите
!! | xargs vim # won't work with file names containing \'" or whitespace
!! | xargs -d \\n vim # GNU only (Linux, Cygwin)
Существует легкий способ сохранения вывода команды, которая работает в ksh и zsh, но не в bash (для выполнения в исходной оболочке требуется выходная сторона конвейера). Проведите команду в функцию K
(определение zsh ниже), которая k выполняет eeps свой вывод в переменной ---- +: = 3 =:. + ----
$K
Автоматическое сохранение вывода каждой команды на самом деле невозможно с помощью оболочки, вам нужно запустить команду в эмулированном терминале. Вы можете сделать это, запустив внутри function K {
K=("${(@f)$(tee /dev/fd/3)}") 3>&1;
}
find … |K
vim $K
(утилита BSD, но доступная для большинства организаций, включая Linux и Solaris) который сохраняет весь вывод вашей сессии через файл (все еще требуется немного усилий, чтобы надежно обнаружить последнее приглашение в машинописном тексте).
Мне нравится использовать обратные тики `(Its на том же ключе, что и ~)
> vim `find . -name somefile.txt`
Задние тики выполняют команду внутри тиков, и результат может быть использован командой. Вышеупомянутое найдет все файлы somefile.txt, что позволит вам использовать :next
для перемещения по всем файлам.
Это очень полезно, если вы потратите пару попыток, уточняющих команду, потому что затем вы можете использовать замену истории для повторения команды для редактора.
> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`
Я, должно быть, пропустил этот пункт, потому что использовал бы:
:find **/somefile.txt
(если бы я знал, что в моем :echo &path
) был только один, или, если бы я хотел их всех:
:args **/somefile.txt
Редактировать: Whoa! Хорошо, поэтому я сделал пропустить точку - вам нужен список поиска, а не открытые файлы? Попробуйте (опять же, изнутри Vim):
!!find . -name somefile.txt
- мой плохой:)
Как @davidmh указал в комментариях, вы можете использовать xargs
с флагом -o
, если вы хотите использовать интерактивное приложение.
find . -name somefile.txt | xargs -o vim
Если вы не используете -o
, вы, вероятно, испортите состояние терминала после выхода из vim. Если вы это сделали, вы можете сбросить свой терминал с помощью следующей команды:
reset
Я написал функцию pvim
, которая делает то, что вы хотите. Если несколько строк переданы по каналу на pvim
, он игнорирует все, кроме первого, он может быть расширен, хотя для открытия нескольких файлов в vim.
[email protected] ~ $ function pvim() { read -r somefile; exec < /dev/fd/1; vim "$somefile"; }
[email protected] ~ $ type pvim
pvim is a function
pvim ()
{
read -r somefile;
exec < /dev/fd/1;
vi "$somefile"
}
Используйте его как:
[email protected] ~ $ find . -name "foo.txt" | pvim
, который загрузит первый «foo.txt» в vim так же, как если бы вы набрали:
vim $(find . -name "foo.txt | head -n1")
Вот более простой xargs
решение, чем те, которые уже упомянуты:
find -name somefile.txt | xargs vim -p
Параметр -p
сообщает vim
для открытия каждого файла на отдельной вкладке. Я считаю это более удобным, чем использование буферов.
Я обнаружил, что открытие файла с помощью locate
в vim чрезвычайно удобно и намного быстрее, чем find
Следующая команда ищет файл с именем app.py
в пути, содержащем каталог MyPythonProject
:args `locate '*MyPythonProject*app.py'`