Ganti pilihan dengan output dari perintah eksternal

10

Dengan asumsi saya memiliki baris dalam file dengan XXXXmenjadi pengganti yang saya pilih melalui vsebagai berikut:

XXXX Some other text

Bagaimana saya bisa mengubah hanya satu XXXXdengan output dari perintah eksternal, seperti date +%Y%m%d?

Saya mendapat sejauh

:'<,'>!date +\%Y\%m\%d 

tapi itu menggantikan seluruh lini.

muk.li
sumber
Pertanyaan terkait tentang stackoverflow: stackoverflow.com/q/8403599/…
Hotschke

Jawaban:

15

Anda dapat menghapus teks dan memasukkan output dari perintah menggunakan CtrlR- =:

CTRL-R {0-9a-z"%#*+:.-=}                                        i_CTRL-R
                Insert the contents of a register.  Between typing CTRL-R and
                the second character, '"' will be displayed to indicate that
                you are expected to enter the name of a register.
 …
                                                        i_CTRL-R_=
                        '='     the expression register: you are prompted to
                                enter an expression (see expression)

Untuk ekspresi, Anda dapat menggunakan system()fungsi untuk menjalankan perintah eksternal.

Setelah memilih teks, tekan c, lalu <c-r>=dan gunakan system('date +%Y%m%d')sebagai ekspresi.

muru
sumber
1
Itu menambahkan baris baru antara teks yang diganti dan sisa baris, bukan?
muk.li
2
@ muk.li itulah bagian dari output date. Jika Anda mencoba sesuatu seperti system('printf %s foo'), yang tidak menghasilkan baris baru, Anda akan melihat ada perbedaan.
muru
4
@ muk.li jika Anda hanya menginginkan tanggal dalam teks, ada strftimefungsi yang bisa Anda gunakan alih-alih system('date …'). String formatnya sama.
muru
2
Anda tidak perlu menghapus teks yang dipilih. Anda dapat menggunakan "=system('date +%Y%m%d')ppilihan visual sebagai gantinya.
Hauleth
5

Jika Anda meletakkan kursor pada garis seperti itu, Anda dapat:

  • 0 untuk meletakkan kursor di kolom pertama.
  • f Space untuk meletakkan kursor di tempat kosong pertama.
  • i Enter Esc untuk membagi garis.
  • l untuk memindahkan kursor satu baris ke atas.
  • :.!date +\%Y\%m\%d untuk mengeksekusi perintah.
  • J untuk bergabung dengan garis lagi.

Dari :h :visual_example:

Saat ini perintah ":" hanya berfungsi pada seluruh baris. Saat Anda memilih bagian dari sebuah baris, melakukan sesuatu seperti ":! Date" akan menggantikan seluruh baris. Jika Anda ingin hanya bagian dari garis yang akan diganti, Anda harus membuat pemetaan untuk itu. Dalam rilis mendatang ":" dapat berfungsi pada sebagian baris.

Lihat juga :h visual-operatorsuntuk detailnya.

Dari komentar ini : Anda juga dapat mencoba plugin vis atau NrrwRgn . Keduanya harus menanganinya dengan baik. (Terima kasih @ christian-brabandt untuk tipnya).

Jair López
sumber
2

Buat pemetaan sementara untuk penggantian seperti itu. Sebagai contoh:

:vnoremap qq c<C-R>=system('wc -c | perl -pe chomp', @")<CR><ESC>

Kemudian dalam mode visual Anda dapat memilih teks, ketik qqdan itu akan diganti oleh output perintah. Dalam contoh ini wc -cakan memproses pilihan Anda, yang merupakan @"parameter. perl -pe chompdiperlukan untuk menghapus baris baru dari output.

Oleg Tsybulskyi
sumber
1
Perhatikan bahwa solusi ini adalah pembungkus jawaban muru, membuat pemetaan untuk penggunaan satu kali mungkin bukan metode yang paling efisien.
statox
1

Coba ini:

:let @a = system('date +\%Y\%m\%d')[:-2]
:'<,'>g/XXXX/s/XXXX/\=@a/g
  • Baris pertama menyimpan output dari dateperintah ke register a, dengan baris akhir yang dihapus.
  • Baris kedua secara global memeriksa pilihan Anda dan menandai baris yang berisi XXXX( g/XXXX/), dan
  • ganti semua instance dari XXXXdengan konten register a ( s/XXXX/\=@a/g)

Lihat :h let-@dan :h :globaljuga bagian "Sublist" di:h list-index

Charles Jie
sumber
0

Plugin: Perintah Blok Visual (vis) oleh DrChip

Instalasi vis.vba.gzdan ketergantungan cecutil.vba.gzke paket vim8

# shell brace expansion (bash >=3.0, zsh>=2.6)
$ mkdir -p ~/.vim/pack/manual/start/{vis,cecutil}
$ vim http://www.drchip.org/astronaut/vim/vbafiles/vis.vba.gz
:UseVimball ~/.vim/pack/manual/start/vis
:e http://www.drchip.org/astronaut/vim/vbafiles/cecutil.vba.gz
:UseVimball ~/.vim/pack/manual/start/cecutil

Contoh OP menjadi

:'<,'>B !date +\%Y\%m\%d 
Hotschke
sumber