Saya terkadang mencoba memanggil Vim menggunakan xargs
, seperti ini:
find . -name '*.java' | xargs vim
... jenis pekerjaan apa:
Saat Vim diluncurkan, saya melihat lampu kilat peringatan berikut:
Vim: Warning: Input is not from a terminal
- Pengeditan berfungsi -
:files
dengan benar menyebutkan semua.java
file seperti yang diharapkan. - Saya bisa menyimpan dan berhenti.
Namun, setelah keluar dari Vim, terminal saya borked:
- Apa pun yang saya ketik di shell prompt tidak digaungkan.
- Pengembalian kereta tidak muncul sama sekali, dan umpan baris hanya kadang-kadang muncul.
Ini berlangsung sampai saya mengeluarkan reset(1)
perintah untuk menginisialisasi ulang terminal.
Apakah ini bug Vim, atau adakah penjelasan yang lebih memuaskan mengapa ia berinteraksi dengan terminal seperti itu? Saya telah melihatnya terjadi pada Vim hingga versi 7.3 (versi ini tampaknya tidak penting) di Linux dan berbagai Unix.
Saya menyadari satu solusi, yaitu vim $(find . -name '*.java')
. Penanganan lainnya akan disambut baik, meskipun itu bukan pertanyaan utama saya.
terminal
invocation
unix
quit
200_sukses
sumber
sumber
xargs
menggunakan bonekastdin
yang tidak dapat digunakan oleh Vim dan istirahat semuanya sesudahnya.Jawaban:
Ini terjadi ketika vim dipanggil dan terhubung ke output pipa sebelumnya, bukan terminal dan menerima input yang berbeda yang tidak terduga (seperti NUL). Hal yang sama terjadi ketika Anda menjalankan :,
vim < /dev/null
jadireset
perintah dalam hal ini membantu. Ini dijelaskan dengan baik oleh grawity di superuser .Jika Anda menggunakan
find
untuk menyampaikan nama file untuk diedit, Anda tidak perluxargs
, cukup gunakan-exec
, misalnya:Jika Anda ingin menggunakan
xargs
, pada Unix / macOS Anda harus menggunakan-o
parameter, seperti:atau:
Catatan: Menggunakan
-print0
/-0
akan mendukung nama file dengan spasi putih.find
+ BSDxargs
Pada Unix / macOS Anda dapat mencoba solusi berikut:
Anda juga dapat menggunakan sintaks substitusi perintah , misalnya:
Atau gunakan GNU
parallel
alih-alihxargs
untuk memaksa alokasi tty, misalnya:catatan:
parallel
pada Unix / OSX tidak akan berfungsi karena memiliki parameter yang berbeda dan tidak mendukung tty.Banyak perintah populer lainnya menyediakan alokasi pseudo-tty juga (seperti
-t
dalamssh
), jadi periksa bantuan.Saran lain adalah menggunakan:
ex
editor baris perintah untuk mem-parsing data atau menggunakan mode Ex, untuk lebih jelasnya lihat:Bagaimana cara mengedit file secara non-interaktif (mis. Dalam pipeline)?
vipe
(sebuah pipa perintah Vim)gunakan skrip sederhana berikut:
Terkait:
grep -l .. | xargs vim
menghasilkan peringatan, mengapa? [dup] di unix SEsumber
xargs
tidak punya-J
. Itu tampaknya menjadi opsi MacOS (BSD) yang tidak ada dalam versi GNU.Saran solusi: gunakan buffer sebagai navigator sistem file
Gunakan
vim -
perintah untuk membaca daftar jalur dari stdin. Vim:help --
menjelaskan ini: 1Anda kemudian dapat menggunakan gfatauCtrl-wCtrl-f untuk menavigasi ke file dalam buffer yang sama atau di jendela split baru masing-masing.
Saran penyelesaian: daftar argumen
Cara hebat lainnya adalah dengan menggunakan daftar argumen Vim. The
:argadd **/*.java
perintah akan mengisi daftar argumen Vim dengan semua file java yang ditemukan di dalam direktori saat ini secara rekursif. Anda kemudian dapat menggunakan:next
dan:prev
untuk berpindah di antara file.1 Yang pertama
-
memberi tahu Vim bahwa Anda ingin mencari bantuan untuk opsi baris perintah, yang kedua sebenarnya merupakan flag baris perintah yang Anda cari. Baca:help help-context
lebih banyak trik seperti ini.sumber
Selain itu
reset
, Anda dapat mencoba:yang seharusnya juga membuat terminal Anda dapat digunakan kembali.
Lihat di sini untuk penjelasan. Dan entah bagaimana ini dapat dianggap sebagai perilaku vim, setidaknya Neovim tidak memiliki masalah ini saat ini.
sumber
reset
juga harus.Alasannya adalah bahwa
xargs
setstdin
ke/dev/null
, sedangkanvim
kebutuhanstdin
untuk menjadi/dev/tty
.BSD
xargs
Solusi (misalnya Mac):-o
mengaturstdin
proses anak xarg (vim
dalam hal ini) menjadidev/tty
.GNU
xargs
Solusi (misalnya Linux):GNU
xargs
tidak memiliki-o
opsi. Sebaliknya, Anda harus menggunakan solusi yang lebih rumit. (Catatan: Sangat penting untuk memilikizero
string tambahan, jangan lupakan itu.)Anda juga dapat menjadikannya sebagai alias:
Penjelasan terperinci tentang solusi GNU xargs
Mari kita jabarkan langkah demi langkah:
1.
xargs
cukup tambahkanstdin
sampai akhir string, sehinggaxargs
akan mengeksekusi ini:2. Format untuk
bash -c
isbash -c 'COMMAND_STRING' $0 $1 $2 etc
."$@"
memperluas ke parameter posisi"$1", "$2"
, dll. Ini tidak termasuk "$ 0" karena itu adalah parameter khusus untuk nama skrip, bukan parameter posisional. Inilah sebabnya mengapa kita perlu menambahkan string dummyzero
(bisa berupa string apa saja) untuk menggantikannya$0
. Jika tidak, Anda akan kehilangan file pertama.Jadi setelah Anda berkembang
"$@"
, Anda berakhir dengan:3.
bash -c
akan menjalankan COMMAND_STRING:</dev/tty
mengaturstdin
agar/dev/tty
sehinggavim
dapat bekerja dalam mode interaktif.sumber
$0
placeholder (di sini "nol") adalah kuncinya.Saya menemukan semua jawaban ini kurang. Setelah berjuang melalui masalah xargs, cara yang paling sederhana - bagi saya! - untuk melakukan pencarian-dan-buka pada kotak generik adalah sebagai berikut:
Saya tidak punya masalah menggunakan
find
denganxargs
dangrep
, tapi saya menemukan sintaks menjengkelkan. Dan sebagai coder harian yang menggunakanvim
terminal sebagai IDE mereka, dan mencari file untuk properti secara konstan, inilah yang telah saya gunakan.Ada waktu dan tempat untuk
find . -path ./node_modules -prune -o -name '*.js' | xargs grep -i mySearchTerm
digabungkan dengan membuka file melalui vim, dan metode lainnya. Bagi saya, itu jarang.Semoga ini bisa membantu seseorang.
sumber
$(...)
. Tidak penting dalam baris perintah Anda seperti dalam skrip tetapi saya pikir masih lebih baik untuk menggunakannya dalam jawaban Anda :) (referensi di sini dan di sini )