Відкрийте файл, отриманий за результатами команди in vim


34

Мені здається, що я роблю наступне майже кожен день

  1. Виконати пошук ( find -name somefile.txt)
  2. Відкрийте результат у vim

Проблема полягає в тому, що я повинен скопіювати і вставити результат команди findв vimкоманду. Чи є спосіб уникнути необхідності цього робити? Я трохи експериментував ( find -name somefile.txt | vim), але не знайшов нічого, що працює.

Спасибі заздалегідь

Відповіді:


31

Ви можете використовувати підстановку команд:

vim $(find -name somefile.txt)

або

find -name somefile.txt -exec vim {} \;

1
добре. Якщо це те, що потрібно, знайдіть -name somefile.txt | xargs vim
balki

3
Ні, це не працює належним чином і може навіть зіпсувати ваш термінал! Ви не можете передати на xargs vim, оскільки vim очікує, що вхід надходить з інтерактивного терміналу.
dogbane

1
Анонімний користувач зазначає, що це не вдасться, якщо в назві файлу є пробіли
Michael Mrozek

4
Ще одна альтернатива була б vim `find -name somefile.txt`. @StuartPowers Крім того, ви можете використовувати, vim `!-1`якщо ви вже використовували цю знахідку, коли ви були попередньою командою
Bernhard

1
@balki для використання xargs в цьому сценарії, ви повинні використовувати прапор -o, це в людині: -o Відкрити stdin як / dev / tty в дочірньому процесі перед виконанням команди. Це корисно, якщо ви хочете, щоб xargs запустив інтерактивну програму.
davidmh

7

Спробуйте це:

  1. start vim
  2. in vim, використовуйте наступне:

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

Результати повинні з’являтися у vim, коли пошук завершений.

Або

Спробуйте:

find /<path> -name > results.txt
vim results.txt 

Моє рішення робить саме так, але чому за нього проголосують?
балки

5

Якщо ви не проти запустити команду ще раз: натисніть Upта додайте 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 видає свій результат у змінній $K.

function K {
    K=("${(@f)$(tee /dev/fd/3)}") 3>&1;
}
find  |K
vim $K

Автоматичне збереження виводу кожної команди насправді неможливо лише з оболонкою, потрібно запустити команду в емуляційному терміналі. Це можна зробити, запустивши всередину script(утиліта BSD, але доступна в більшості об'єктів, включаючи Linux та Solaris), яка зберігає весь результат вашого сеансу через файл (потрібно ще трохи зусиль, необхідних для надійного виявлення останнього підказки в машинописі ).


2

Мені подобається використовувати зворотні кліщі `(це на тій самій клавіші, що і ~)

> vim `find . -name somefile.txt`

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

Це дуже корисно, якщо ви витратите пару спроб на вдосконалення команди, тому що ви можете використовувати підстановку історії, щоб повторити команду для редактора.

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`

2

Я, мабуть, пропустив цю точку, бо я б використав:

:find **/somefile.txt

(якщо я знав, що в моєму є лише один :echo &path ) або, якщо я хотів їх усіх:

:args **/somefile.txt

Редагувати: Ого! Добре, так що я зробив промах точки - ви хочете знайти список, а не власними файли відкрили? Спробуйте (знову ж таки, зсередини Vim):

!!find . -name somefile.txt

-- моє ліжко :)


1

Як @davidmh вказав у коментарях, ви можете використовувати xargsпрапор, -oякщо хочете використовувати інтерактивний додаток.

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

Якщо ви не користуєтесь -o, ви, ймовірно, зіпсуєте термінальний стан після відходу vim. Якщо ви це зробили, ви зможете скинути термінал за допомогою наступної команди:

reset

0

Я написав функцію, pvimяка робить те, що ти хочеш. Якщо до pvimнього прокладено декілька рядків, ігноруються всі, крім першої, його можна продовжити, хоча відкрити декілька файлів у vim.

stu@sente ~ $ function pvim() { read -r somefile; exec < /dev/fd/1; vim "$somefile"; }
stu@sente ~ $ type pvim
pvim is a function
pvim ()
{
    read -r somefile;
    exec < /dev/fd/1;
    vi "$somefile"
}

Використовуйте його так:

stu@sente ~ $ find . -name "foo.txt" | pvim

який завантажить перший "foo.txt" у vim так само, як якщо б ви ввели:

vim $(find . -name "foo.txt | head -n1")


0

Ось більш просте xargsрішення, ніж уже згадуване:

find -name somefile.txt | xargs vim -p

-pОпція вказує , vimщоб відкрити кожен файл в окремій вкладці. Мені це зручніше, ніж використання буферів.


0

Я виявив, що відкривати файл за допомогою locatein vim надзвичайно зручно і набагато швидше, ніж find.

Наступна команда здійснює пошук у файлі, який викликається app.pyу шляху, що містить каталог MyPythonProject.

:args `locate '*MyPythonProject*app.py'`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.