Откройте файл, полученный в результате команды в vim

Я считаю, что делаю следующее почти каждый день

  1. Запустите поиск (find -name somefile.txt)
  2. Откройте результат в vim

Проблема заключается в том, что мне нужно скопировать и вставить результат find в vim. Есть ли способ избежать этого? Я немного экспериментировал (find -name somefile.txt | vim), но ничего не нашел.

Заранее спасибо

28 голосов | спросил smauel 14 Jpm1000000pmFri, 14 Jan 2011 20:22:10 +030011 2011, 20:22:10

9 ответов


27

Вы можете использовать подстановку команд:

vim $(find -name somefile.txt)

или

find -name somefile.txt -exec vim {} \;
ответил dogbane 14 Jpm1000000pmFri, 14 Jan 2011 20:27:38 +030011 2011, 20:27:38
6

Попробуйте следующее:

  1. start vim
  2. в vim, используйте следующее:

:r!find /<path> -name 'expression'

Результаты поиска должны появиться в vim, когда поиск будет завершен.

или

Try:

find /<path> -name > results.txt
vim results.txt 
ответил Karl 14 Jpm1000000pmFri, 14 Jan 2011 22:46:22 +030011 2011, 22:46:22
4

Если вы не возражаете запустить команду еще раз: нажмите Вверх и добавьте команду 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) который сохраняет весь вывод вашей сессии через файл (все еще требуется немного усилий, чтобы надежно обнаружить последнее приглашение в машинописном тексте).

ответил Gilles 15 Jam1000000amSat, 15 Jan 2011 00:59:20 +030011 2011, 00:59:20
2

Мне нравится использовать обратные тики `(Its на том же ключе, что и ~)

> vim `find . -name somefile.txt`

Задние тики выполняют команду внутри тиков, и результат может быть использован командой. Вышеупомянутое найдет все файлы somefile.txt, что позволит вам использовать :next для перемещения по всем файлам.

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

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`
ответил Martin York 14 Jpm1000000pmFri, 14 Jan 2011 23:31:31 +030011 2011, 23:31:31
1

Я, должно быть, пропустил этот пункт, потому что использовал бы:

:find **/somefile.txt

(если бы я знал, что в моем :echo &path) был только один, или, если бы я хотел их всех:

:args **/somefile.txt

Редактировать: Whoa! Хорошо, поэтому я сделал пропустить точку - вам нужен список поиска, а не открытые файлы? Попробуйте (опять же, изнутри Vim):

!!find . -name somefile.txt

- мой плохой:)

ответил Barry Arthur 28 Jam1000000amSat, 28 Jan 2012 10:29:03 +040012 2012, 10:29:03
1

Как @davidmh указал в комментариях, вы можете использовать xargs с флагом -o, если вы хотите использовать интерактивное приложение.

find . -name somefile.txt | xargs -o vim

Если вы не используете -o, вы, вероятно, испортите состояние терминала после выхода из vim. Если вы это сделали, вы можете сбросить свой терминал с помощью следующей команды:

reset
ответил durum 15 FriEurope/Moscow2017-12-15T14:56:01+03:00Europe/Moscow12bEurope/MoscowFri, 15 Dec 2017 14:56:01 +0300 2017, 14:56:01
0

Я написал функцию 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")

ответил Stuart Powers 28 Jam1000000amSat, 28 Jan 2012 08:26:49 +040012 2012, 08:26:49
0

Вот более простой xargs решение, чем те, которые уже упомянуты:

find -name somefile.txt | xargs vim -p

Параметр -p сообщает vim для открытия каждого файла на отдельной вкладке. Я считаю это более удобным, чем использование буферов.

ответил Cory Klein 15 +03002015-10-15T00:52:41+03:00312015bEurope/MoscowThu, 15 Oct 2015 00:52:41 +0300 2015, 00:52:41
0

Я обнаружил, что открытие файла с помощью locate в vim чрезвычайно удобно и намного быстрее, чем find

Следующая команда ищет файл с именем app.py в пути, содержащем каталог MyPythonProject

:args `locate '*MyPythonProject*app.py'`
ответил Searene 11 SunEurope/Moscow2016-12-11T06:53:28+03:00Europe/Moscow12bEurope/MoscowSun, 11 Dec 2016 06:53:28 +0300 2016, 06:53:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132