Sesuatu yang saya temukan berguna di editor lain adalah kemampuan untuk:
- ambil teks yang dipilih
- menjalankan perintah eksternal dan meneruskan seleksi ke
stdin
- ambil perintah eksternal
stdout
dan ganti pilihan saat ini dengannya.
Dengan cara ini Anda dapat menulis alat teks berguna yang beroperasi pada seleksi menggunakan bahasa apa pun yang dapat melakukan io dasar.
Bagaimana ini bisa dilakukan dengan vim menggunakan pilihan? ... satu karakter, kata, paragraf ... dll.
(Langsung di baris perintah, atau melalui pengikatan kunci?)
Catatan
Perintah seperti !sort
bekerja pada level-line, alasan saya mengajukan pertanyaan ini adalah karena saya ingin beroperasi pada seleksi. (Yaitu, teks yang akan dihapus jika x
ditekan).
sumber
sort
perintah.:sort
?Saya menulis sebuah plugin bernama express.vim yang dapat membantu dengan ini. Plugin mendefinisikan operator
g=
yang memungkinkan Anda mengevaluasi ekspresi VimScript atas gerakan (atau pemilihan Visual). Ini meminta ekspresi, di mana Anda dapat menggunakanv:val
sebagai pengganti untuk teks yang dicakup oleh gerakan (atau, sekali lagi, pemilihan Visual).Dalam kasus ini, ekspresi yang berguna akan menggunakan
system()
fungsi, yang menjalankan perintah eksternal.(Di sini saya digunakan
tr
sebagai contoh sederhana perintah eksternal.)Cara menggunakan express.vim untuk masalah ini adalah dengan memilih teks dengan mode Visual, lalu ketik
g=
diikuti oleh ekspresi itu, lalu tekanEnter
:Saya akui, itu tidak mudah digunakan. (Faktanya, saya jarang menggunakan plugin ini sendiri!) Saya sedang mempertimbangkan untuk menambahkan jalan pintas untuk menjalankan perintah eksternal, seperti memulai ekspresi dengan
!
. Saya akan memposting pembaruan di sini jika saya akhirnya melakukan itu.EDIT
Saya telah memodifikasi express.vim untuk memperlakukan ekspresi yang diawali dengan
!
perintah eksternal. Jadi, tetap dengantr
contoh, hal di atas menjadi jauh lebih sederhana. Setelah pemilihan Visual, ketikkan yang berikut:Penjelasan:
g=
!tr a-z A-Z
sebagai ekspresiEnter
sumber
Anda mencari perintah filter di Vim. Lihat
:help filter
. Berikut dokumentasi yang relevan:Jadi mengetik
5!!sort
akan mengurutkan 5 baris berikutnya mulai dari kursor.sumber
tr [:lower:] [:upper]
, maka vim tidak hanya akan menghapus kata ini tetapi juga seluruh baris.Perhatikan bahwa hal itu dapat dilakukan dengan:
s^R=system('tr a-z A-Z', @")[:-2]^M
(dengan^R
menjadi CTRL + R, dan ^ M menjadi ENTER)Bisa juga bekerja dengan apa pun yang tidak seperti seleksi + ganti
ci"^R=...
.sumber
v
dan memindahkan kursor) saya mendapatkan kesalahanE16: Invalid range\nE16: Invalid range\nE476: Invalid command
(di Linux begitutr
dan ada perintah dasar lainnya).s
yang masuk ke mode insert atau:s
perintah?s
dari mode visual, atau Anda menekan:
terlebih dahulu? Tidak ada yang:
terlibat dalam urutan tombol yang saya tulis. Pemetaan A akan menjadi:vnoremap µ s<c-r>=system('tr a-z A-Z', @")[:-2]<cr>
.