Bagaimana cara `mencari` beberapa file dan membukanya di vim?

10

Misalkan saya memiliki file bernama filename123.txtdan itu adalah file tunggal yang dinamai demikian, dan saya dapat locatemelakukannya dengan perintah locate filename123. Dan hanya mengembalikan file ini.

Sekarang saya ingin membukanya dengan vi/ vim. Tapi saya tidak ingin pergi ke lokasi itu dan ketik viperintah yang diikuti oleh nama file. Di sini saya ingin hasilnya locate filename123ditambahkan ke perintah vi. Bagaimana saya bisa melakukannya? Saya sudah mencoba:

locate filename123 | vi

Tetapi ini tidak berhasil. Dan kesalahan ini muncul di terminal:

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
Santosh Kumar
sumber
kemungkinan duplikat xargs dan vi - "Input bukan dari terminal"
kenorb

Jawaban:

12

Anda bisa menggunakan xargs:

locate filename123 | xargs vi

Secara default xargsakan mengeksekusi sesedikit contoh perintah yang ditentukan sebanyak mungkin, melewati parameter sebanyak mungkin sesuai dengan ARG_MAX sistem . Untuk membatasi jumlah parameter yang diteruskan ke instance vi, gunakan opsi xargs' -n.

Untuk menangani nama file yang mengandung spasi gunakan opsi xargs' -d:

locate filename123 | xargs -d '\n' vi

Untuk menangani nama file yang berisi baris menggunakan xargs' -0pilihan bersama dengan locate' s -0pilihan:

locate -0 filename123 | xargs -0 vi

(Jika -0tidak tersedia pada salah satu dari mereka, periksa --nulljuga, atau cara lain untuk menentukan karakter \000sebagai pembatas.)

manatwork
sumber
Bisakah Anda memberi tahu saya apa yang mencegah saya sebelum membuka file ini?
Santosh Kumar
1
@ Santosh Anda melewatkan output dari locateperintah sebagai input ke vi. Vi, seperti program lain, mengharapkan nama file untuk dikerjakan sebagai argumen.
Gilles 'SANGAT berhenti menjadi jahat'
@manatwork Masalahnya adalah saya tidak dapat menemukan dan membuka nama file dengan spasi di dalamnya. Misalnya perintah ini akan membuka banyak file dalam vim: cari I \ have \ to \ download | xargs vi
Santosh Kumar
3

Anda dapat menggunakan ekspansi perintah:

vi "$(locate filename123 | head -n1)"

Untuk membuat vimread nya stdin dapat Anda lakukan vim -, tetapi itu hanya akan memberi Anda output locateyang merupakan path nama file. Ini mungkin bekerja meskipun, menggunakan vim gfperintah normal kemudian akan membuka path tempat kursor aktif.

Edit

Dalam hal nama file dengan spasi di dalamnya, Anda lebih baik menggunakan xargsopsi yang disebutkan atau vimsolusi yang dijelaskan di atas. Catatan untuk membuat gfpekerjaan Anda perlu menambahkan ruang ke isfname:

set isfname+=32

Kiat dan alternatif ini dijelaskan di sini .

Edit 2

Menambahkan kutipan dan headseperti yang disarankan oleh PeterO dalam komentar .

Thor
sumber
Untuk file dengan spasi putih di dalamnya, ketika saya memasukkan \ dalam nama file, seperti vi $ (cari file lain \). Vm membukanya sebagai dua file terpisah, anotherdan file:(.
Santosh Kumar
Jawaban Anda hanya berfungsi ketika saya tidak memiliki spasi di file yang saya temukan.
Santosh Kumar
Jawaban diperbarui.
Thor
2
@Thor: Untuk satu file, seperti yang disebutkan dalam pertanyaan, Anda hanya perlu membungkus kutipan di sekitar proses-substitusi: vi "$(locate filename123)"... Untuk memastikan bahwa itu hanya memiliki satu nama file untuk berurusan dengan:vi "$(locate filename123 |head -n1)"
Peter.O
PeterO: Anda benar, saya hanya menguji dengan beberapa hit. Saya telah menambahkan komentar Anda pada jawabannya.
Thor
1

Cara paling sederhana adalah untuk lulus locatesebagai substitusi shell , seperti:

vim $(locate filename123)

Anda juga dapat mempertimbangkan untuk menggunakan findalih-alih locatememberikan nama file untuk diedit, misalnya:

find . -name 'filename123' -exec vim {} +

Pada Unix / OSX Anda dapat menggunakan xargsdengan -oparameter, seperti:

locate filename123 | xargs -o vim

-oBuka kembali stdin sebagai / dev / tty dalam proses anak sebelum menjalankan perintah. Ini berguna jika Anda ingin xargs menjalankan aplikasi interaktif.

Atau di Linux coba solusi berikut menggunakan:

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

Jika Anda menggunakan perintah yang berbeda, gunakan substitusi perintah untuk mencapai itu, seperti:

vim $(locate filename123)
vim `locate filename123`

Atau gunakan GNU parallelalih-alih xargsuntuk memaksa alokasi tty, misalnya:

locate filename123 | parallel -X --tty vi

Catatan: parallelpada Unix / OSX tidak akan berfungsi karena memiliki parameter yang berbeda dan tidak mendukung tty.

Banyak perintah populer lainnya menyediakan alokasi pseudo-tty juga (seperti -tdalam ssh), jadi periksa bantuan.

Saran lain akan menggunakan vipe(pipa perintah Vim) atau menggunakan skrip sederhana berikut:

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

Terkait:

kenorb
sumber