Buka file yang diberikan oleh hasil perintah di vim

34

Saya menemukan diri saya melakukan yang berikut hampir setiap hari

  1. Jalankan penemuan ( find -name somefile.txt)
  2. Buka hasilnya di vim

Masalahnya adalah saya harus menyalin dan menempelkan hasil findke dalam vimperintah. Apakah ada cara untuk menghindari keharusan melakukan ini? Saya telah bereksperimen sedikit ( find -name somefile.txt | vim) tetapi belum menemukan apa pun yang berfungsi.

Terima kasih sebelumnya

smauel
sumber

Jawaban:

31

Anda dapat menggunakan substitusi perintah:

vim $(find -name somefile.txt)

atau

find -name somefile.txt -exec vim {} \;
dogbane
sumber
1
baik. Jika itu yang diperlukan, maka cari -name somefile.txt | xargs vim
balki
3
Tidak, itu tidak berfungsi dengan baik dan bahkan mungkin mengacaukan terminal Anda! Anda tidak dapat melakukan pipe ke xargs vim, karena vim mengharapkan input berasal dari terminal interaktif.
dogbane
1
Pengguna anonim mencatat bahwa ini akan gagal jika nama file memiliki spasi
Michael Mrozek
4
Alternatif lain adalah vim `find -name somefile.txt`. @StuartPowers Sebagai alternatif, Anda dapat menggunakan vim `!-1`jika Anda sudah menggunakan find ini adalah perintah Anda sebelumnya
Bernhard
1
@balki untuk menggunakan xargs dalam skenario ini, Anda harus menggunakan flag -o, ada di man: -o Buka kembali stdin sebagai / dev / tty dalam proses anak sebelum menjalankan perintah. Ini berguna jika Anda ingin xargs menjalankan aplikasi interaktif.
davidmh
7

Coba ini:

  1. mulai vim
  2. di vim, gunakan yang berikut ini:

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

Hasilnya akan muncul di vim ketika pencarian selesai.

Atau

Mencoba:

find /<path> -name > results.txt
vim results.txt 
Karl
sumber
Solusi saya melakukan hal yang persis sama tetapi mengapa ia memilih?
balki
5

Jika Anda tidak keberatan menjalankan perintah lagi: tekan Updan tambahkan xargsperintah. Atau gunakan subtitusi riwayat dan jalankan

!! | xargs vim          # won't work with file names containing \'" or whitespace
!! | xargs -d \\n vim   # GNU only (Linux, Cygwin)

Ada cara ringan menyimpan output dari perintah yang bekerja di ksh dan zsh tetapi tidak di bash (ini membutuhkan sisi output dari pipa yang akan dieksekusi di shell induk). Pipa perintah ke fungsi K(definisi zsh di bawah), yang k eeps outputnya dalam variabel $K.

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

Secara otomatis menyimpan output dari setiap perintah tidak benar-benar mungkin dengan shell saja, Anda perlu menjalankan perintah di terminal yang ditiru. Anda dapat melakukannya dengan menjalankan bagian dalam script(utilitas BSD, tetapi tersedia di sebagian besar perangkat termasuk Linux dan Solaris), yang menyimpan semua output sesi Anda melalui file (masih ada sedikit upaya yang diperlukan untuk secara andal mendeteksi prompt terakhir dalam naskah. ).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Saya suka menggunakan kutu belakang `(Ini pada tombol yang sama dengan ~)

> vim `find . -name somefile.txt`

Kutu kembali mengeksekusi perintah di dalam kutu dan output kemudian dapat digunakan oleh perintah. Di atas akan menemukan semua file somefile.txt sehingga memungkinkan Anda untuk menggunakan :nextuntuk menelusuri semua file.

Ini sangat berguna jika Anda menghabiskan beberapa upaya untuk menyempurnakan perintah, karena Anda kemudian dapat menggunakan substitusi sejarah untuk mengulangi perintah untuk editor.

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`
Martin York
sumber
2

Saya pasti melewatkan poin di sini, karena saya akan menggunakan:

:find **/somefile.txt

(jika saya tahu hanya ada satu di saya :echo &path ) atau, jika saya ingin semuanya:

:args **/somefile.txt

Sunting: Whoa! Ok, jadi saya melakukan rindu titik - Anda ingin daftar menemukan, bukan file sebenarnya dibuka? Coba (lagi, dari dalam Vim):

!!find . -name somefile.txt

-- salahku :)

Barry Arthur
sumber
1

Seperti @davidmh tunjukkan dalam komentar, Anda dapat menggunakan xargsdengan flag -ojika Anda ingin menggunakan aplikasi interaktif.

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

Jika Anda tidak menggunakan -o, Anda mungkin akan mengacaukan status terminal setelah meninggalkan vim. Jika sudah melakukannya, Anda harus bisa mereset terminal Anda dengan perintah berikut:

reset
durum
sumber
0

Saya menulis fungsi pvimyang melakukan apa yang Anda inginkan. Jika banyak baris disalurkan ke pvimmengabaikan semua kecuali yang pertama, itu bisa diperpanjang meskipun untuk membuka beberapa file dalam 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"
}

Gunakan seperti:

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

yang akan memuat "foo.txt" pertama ke vim sama seperti jika Anda mengetik:

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

Sente
sumber
0

Ini adalah xargssolusi yang lebih sederhana daripada yang telah disebutkan:

find -name somefile.txt | xargs vim -p

The -ppilihan memberitahu vimuntuk membuka setiap file di tab terpisah. Saya menemukan ini lebih nyaman daripada menggunakan buffer.

Cory Klein
sumber
0

Saya menemukan bahwa membuka file dengan bantuan locatein vim sangat mudah dan jauh lebih cepat daripada find.

Perintah berikut mencari file yang disebut app.pydi jalur yang berisi direktori MyPythonProject.

:args `locate '*MyPythonProject*app.py'`
Searene
sumber