Sementara saya suka vipe
pendekatan, saya telah menemukan cara yang lebih keren:fzf.
cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk" | fzf -m | cat
... memberikan daftar yang bagus di mana saya dapat mencari dan mengganti item dengan keyboard dan menghilang sepenuhnya setelah saya selesai.
moreutils memiliki vipe
, yang hanya menjalankan editor teks biasa Anda (vi atau sesuatu) sebagai bagian dari pipa. Setiap baris yang tidak Anda hapus akan ditulis kembali ke stdout. (Namun secara umum, Anda mendapatkan hasil yang sama dengan mengalihkan ke file sementara dan mengedit file tersebut.)
Anda juga dapat menggunakan gvim
(dan vim
) untuk ini. Masukkan gvim /dev/stdin
ke dalam pipa Anda, dan tulis dengan melakukan :wq! /dev/stdout
setelah Anda selesai mengedit.
Memanggil gvim sebagai berikut memungkinkan Anda menulis dan menutup dengan lebih alami dengan ZZ
:
gvim +'nmap ZZ :wq!<cr> | r /dev/stdin | 1d | file /dev/stdout'
Anda dapat membuat alias atau fungsi dari itu:
gvimp() {
gvim +'
nmap ZZ :wq!<cr>
r /dev/stdin
1d
file /dev/stdout
'
}
Berikut adalah contoh dimana saya menghapus baris 4-7 dan selesai dengan melakukan ZZ
dalam mode normal:
$ seq 1 10 | gvimp | sed -r 's/^|$/=/g'
=1=
=2=
=3=
=8=
=9=
=10=
EDIT:Vim reguler sedikit lebih rumit, karena menggunakan stdin untuk input keyboard dan stdout untuk menggambar antarmuka pengguna. Namun, Anda masih dapat menggunakannya dengan menambahkan proses tambahan. Anda mengalihkan std* vim ke terminal, dan menggunakan std* proses induk untuk pipa data.
vimp() {
bash -c '
terminal="/dev/$(ps -o tty= $$)"
tmp_out="$(mktemp)"
trap "rm \$tmp_out" EXIT
vim <(cat) < "$terminal" &> "$terminal" +"
file $tmp_out
set noreadonly
nmap ZZ :wq!<cr>
"
cat "$tmp_out"
'
}
File sementara diperlukan karena jika tidak, keluaran pipa akan tercampur dengan antarmuka pengguna vim dan mungkin hilang bersamanya saat vim keluar.