Bagaimana saya bisa memasukkan teks di tengah baris ke beberapa baris di Vim?


91

Katakanlah saya memiliki sepuluh baris dan saya ingin menambahkan teks ke beberapa kata yang muncul di baris tersebut? Tidak harus di awal baris.

Dari:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

untuk:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

Apakah hal itu juga mungkin untuk tidak hanya prepend bar(tetapi sebenarnya surround foodengan bar(foo)?

Saya juga ingin cara cepat untuk menambahkan //komentar ke beberapa baris (komentar bergaya C).

Saya menggunakan Vim / GVim 7.2.


1
Komentar gaya C adalah / * * / Komentar bergaya BCPL adalah //
William Pursell

Jawaban:


169

Pergi ke yang pertama foo, tekan Ctrl- vuntuk masuk ke mode blok visual dan tekan ke bawah sampai semua baris dengan fooditandai. Kemudian tekan Shift- iuntuk memasukkan di awal (blok). Setelah Anda selesai dan menekan Esc, karakter yang disisipkan akan ditambahkan ke setiap baris di sebelah kiri blok yang ditandai.

Untuk menyisipkan di bagian akhir, tekan lagi Ctrl- v, gerakkan ke atas / bawah untuk menandai semua garis yang terpengaruh, lalu tekan Endatau $untuk memperpanjang pilihan hingga akhir baris. Sekarang Anda dapat menekan Shift- auntuk menambahkan di akhir semua baris, seperti sebelumnya dengan Shift- i.

Pemilihan visual juga dapat dilakukan dengan perintah gerakan normal. Jadi untuk mengomentari seluruh blok di C Anda bisa pindah ke kurung kurawal dan ketik Ctrl- v % Shift- i // Esc.


5
Sebagai tambahan: jika Ctrl-V tidak memulai mode blok visual di Vim pada Windows, seseorang harus menggunakan Ctrl-Q sebagai gantinya.
Paul

3
Variasi dari jawaban tersebut adalah menandai blok visual dengan shift + V lalu mengubah blok dalam mode ex:: '<,'> s / ^ / prexix_text /: '<,'> s / $ / suffix_text / Note than "'< , '> "dicetak secara otomatis oleh vim saat Anda menekan": ".
dimba

1
Untuk menghapus komentar gunakan blok visual (tandai dengan Ctrl + V). Satu kolom dengan tanda komentar "//" bertanda tekan "d" untuk menghapus komentar. jangan lupa tentang komentar C ++ (/ ** /) juga :)
dimba

9
Perlu dicatat di Linux saya harus keluar dari mode Sisipkan sebelum awalan diterapkan ke semua baris, dan ini adalah modal yang saya perlukan untuk masuk ke mode sisip dari mode Visual - yaitu Shift + I, ketik awalan, Escape, Escape.
Joshua Enfield

6
Ini tidak bekerja pada dempul. Ketika saya menekan itidak ada yang terjadi. Ketika saya menekan shift+ipilihan menghilang tetapi saya dapat memasukkan teks (di tempat saat ini di mana hanya kursor).
Jürgen Paul

44

Untuk menjawab pertanyaan pertama Anda, di bawah ini

:%s/foo/bar(&)/g

akan mencari foo, dan mengelilingi pola yang cocok dengan bar(). Mereka /gakan melakukan ini beberapa kali dalam satu baris.

Karena Anda hanya mencocokkan foo, Anda dapat melakukan yang sederhana :s/foo/bar(foo)/g. Namun, cara di atas akan berhasil jika Anda memutuskan untuk mencocokkan pada ekspresi reguler daripada kata sederhana (mis f[a-z][a-z].). '&' Di atas mewakili apa yang Anda cocokkan.


Saya punya jawaban panjang yang besar dengan makro. Ini jauh lebih mudah :-)
Brian Ramsay

Bagaimana Anda melakukannya untuk beberapa baris? Kasus praktisnya adalah ketika Anda memiliki blok kode yang terdiri dari baris serupa yang memerlukan substitusi ini.

Sepertinya ini berfungsi di semua baris ... perhatikan:% s dan / g.
ojrac

yang menarik adalah:% s / foo / bar (&) / gc tidak mengkonfirmasi - 'c' tidak berpengaruh..Ugh

1
Teks di antara :dan smenentukan baris mana yang dioperasikannya. Tidak ada yang berarti hanya jalur saat ini. 1,30berarti baris 1 hingga 30 (inklusif). '<,'>berarti garis-garis dalam pemilihan visual saat ini.
rampion

17

Untuk mengawali serangkaian baris, saya menggunakan salah satu dari dua pendekatan berbeda:

Salah satu pendekatan adalah pemilihan blok (disebutkan oleh sth). Secara umum, Anda dapat memilih bidang persegi panjang yang ctrl-Vdiikuti dengan gerakan kursor. Setelah Anda menyorot persegi panjang, menekan shift-Iakan menyisipkan karakter di sisi kiri persegi panjang, atau shift-Aakan menambahkannya di sisi kanan persegi panjang. Jadi Anda bisa menggunakan teknik ini untuk membuat persegi panjang yang menyertakan kolom paling kiri dari garis yang ingin Anda awali, tekan shift-I, ketik awalan, dan kemudian tekan escape.

Pendekatan lainnya adalah dengan menggunakan substitusi (seperti yang disebutkan oleh Brian Agnew). Substitusi Brian akan mempengaruhi seluruh file (% dalam perintah berarti "semua baris"). Untuk mempengaruhi hanya beberapa baris, pendekatan termudah adalah dengan menekan shift-V(yang memungkinkan mode visual-line) saat berada di baris pertama / terakhir, dan kemudian pindah ke baris terakhir / pertama. Kemudian ketik:

:s/^/YOUR PREFIX/

^ Adalah regex (dalam hal ini, awal baris). Dengan mengetik ini dalam mode garis visual, Anda akan melihat '<,'> disisipkan sebelum s secara otomatis. Ini berarti kisaran substitusi akan menjadi pemilihan visual.

Kiat tambahan: jika awalan Anda berisi garis miring, Anda dapat menghindarinya dengan garis miring terbalik, atau Anda dapat menggunakan karakter tanda baca yang berbeda sebagai pemisah dalam perintah. Misalnya untuk menambahkan komentar baris C ++, saya biasanya menulis:

:s:^:// :

Untuk menambahkan sufiks, pendekatan substitusi umumnya lebih mudah kecuali semua garis Anda memiliki panjang yang persis sama. Cukup gunakan $ untuk pola alih-alih ^ dan string Anda akan ditambahkan alih-alih tertunda.

Jika Anda ingin menambahkan prefiks dan sufiks secara bersamaan, Anda dapat melakukan sesuatu seperti ini:

:s/.*/PREFIX & SUFFIX/

. * Cocok dengan seluruh baris. & Di pengganti menempatkan teks yang cocok (seluruh baris) kembali, tetapi sekarang itu akan memiliki prefiks dan sufiks Anda ditambahkan.

BTW: ketika mengomentari kode, Anda mungkin ingin menghapusnya nanti. Anda dapat menggunakan visual-block ( ctrl-V) untuk memilih garis miring dan kemudian menekan d untuk menghapusnya, atau Anda dapat menggunakan substitusi (mungkin dengan pemilihan garis visual, dibuat dengan shift-V) untuk menghapus garis miring seperti ini:

:s:// ::

6

: normal untuk menyelamatkan!

:%norm Wibar(

:%norm WEa)

: norm (al) memutar ulang perintah seolah-olah Anda telah mengetiknya:

W - pindah ke kata berikutnya

i - memulai mode penyisipan

bar (- ketik urutan 'bar ('

Atau dalam satu baris:

:%norm Wibar(ctrlvESCEa)

Jika Anda menjalankan Windows, ketik, ctrlqbukan ctrlv.


3

Namun kemungkinan lain (mungkin tidak terlalu berguna dalam kasus pengujian Anda, tetapi berguna dalam situasi lain) adalah menutup area yang ingin Anda ubah dengan tanda.

  • Letakkan kursor di mana saja di baris atas dan tekan 'a
  • Letakkan kursor di mana saja di baris terakhir dan tekan 'b
  • Berikan perintah :'a,'b s/foo/bar(&)/

Saya biasanya menyukai mode blok visual jika semuanya terlihat di layar, dan saya biasanya lebih suka tanda jika start dan stop dipisahkan oleh banyak layar.


Ini seharusnya mbukan 'untuk mengatur penanda baru. 'adalah untuk melompat ke garis penanda yang ada. `melompat ke garis dan kolom penanda itu.
tiktak


0

Untuk komentar C-style, gunakan jawaban regexp oleh Brian, dan cocokkan pada akhir baris $, dan sisipkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.