Cara memasukkan teks di awal pemilihan multi-baris di vi / Vim

423

Di Vim , bagaimana cara memasukkan karakter di awal setiap baris dalam pilihan?

Misalnya, saya ingin mengomentari satu blok kode dengan menuliskan //di awal setiap baris dengan asumsi sistem komentar bahasa saya tidak mengizinkan komentar seperti blok /* */. Bagaimana saya melakukan ini?

Jordan Parmer
sumber

Jawaban:

748
  • Tekan Escuntuk masuk ke 'mode perintah'
  • Gunakan Ctrl+ Vuntuk memasuki mode blok visual
  • Pindahkan Up/ Downuntuk memilih kolom teks dalam baris yang ingin Anda komentari.
  • Lalu tekan Shift+ idan ketikkan teks yang ingin Anda masukkan.
  • Kemudian tekan Esc, tunggu 1 detik dan teks yang disisipkan akan muncul di setiap baris.

Untuk informasi dan bacaan lebih lanjut, lihat " Memasukkan teks dalam banyak baris " di Vim Tips Wiki.

pixelbeat
sumber
6
Satu-satunya gelandangan dengan ini adalah bahwa itu muncul Ctrl + V ditimpa di GVIM.
Jordan Parmer
14
Bukan untuk saya (di linux) bukan
pixelbeat
23
Anda dapat menggunakan Ctrl-Q sebagai pengganti di gVim (seperti: help Ctrl-V menjelaskan) tetapi Anda harus menggunakan hjkl untuk bernavigasi dalam mode ini daripada tombol panah
Gareth
9
Jika ctrl-v Anda diganti di windows gvim, Anda harus mengedit vimrc global untuk berhenti termasuk mswin.vim.
graywh
18
Tahu mengapa ini tidak akan melakukan apa pun setelah mendorong esc? Aku menunggu seperti 10 detik untuk sesuatu terjadi pada kurang dari seratus garis - Sudahlah, saya mendorong Shift + vtidak CTRL + v. @ vkaul11 Mungkin hal yang sama dengan yang Anda lakukan lol
Tek
186

Ini menggantikan awal setiap baris dengan "//":

:%s!^!//!

Ini menggantikan awal dari setiap baris yang dipilih (gunakan mode visual untuk memilih) dengan "//":

:'<,'>s!^!//!

Perhatikan bahwa gv(dalam mode normal) mengembalikan pilihan visual terakhir, ini berguna dari waktu ke waktu.

Tomalak
sumber
3
Terima kasih! Masuk akal total. Dan menghapus teks berbunyi sebagai berikut: '<,'> s! ^ // !!
Jordan Parmer
4
Apa arti dari tanda seru dalam jawaban di atas? (:% s! ^! //!)
Henrik K
19
@HKK, biasanya seseorang menggunakan karakter garis miring / sebagai delimeter untuk perintah pencarian dan ganti. Dalam hal ini kami memasukkan garis miring ke depan sebagai bagian dari pencarian dan ganti jadi kami menggunakan delimeter alternatif, yaitu karakter seru!
cyber-monk
+1 Ini berfungsi di VsVim di mana (Ctrl + V) (Shiift + I) Esc tidak.
Seth Reno
4
1, tidak tahu Anda bisa menggunakan sesuatu yang lain sebagai pembatas regex (di sini saya menggunakan /dan harus melarikan diri //dalam :s/^/\/\/alih-alih menulis :s!^!//)
Hashbrown
83

Pola umum untuk pencarian dan penggantian adalah:

:s/search/replace/

Mengganti kemunculan pertama 'pencarian' dengan 'ganti' untuk baris saat ini

:s/search/replace/g

Mengganti semua kemunculan 'pencarian' dengan 'ganti' untuk baris saat ini, 'g' adalah kependekan dari 'global'

Perintah ini akan menggantikan setiap kemunculan 'pencarian' dengan 'ganti' hanya untuk baris saat ini. % Digunakan untuk mencari seluruh file. Untuk mengonfirmasi setiap penggantian secara interaktif, tambahkan 'c' untuk konfirmasi:

:%s/search/replace/c

Konfirmasi interaktif mengganti 'pencarian' dengan 'ganti' untuk seluruh file

Alih-alih% karakter, Anda dapat menggunakan rentang nomor baris (perhatikan bahwa karakter '^' adalah karakter pencarian khusus untuk awal baris) :

:14,20s/^/#/

Menyisipkan karakter '#' di awal baris 14-20

Jika Anda ingin menggunakan karakter komentar lain (seperti //) maka ubah pembatas perintah Anda:

:14,20s!^!//!

Menyisipkan urutan karakter '//' di awal baris 14-20

Atau Anda selalu bisa lolos dari // karakter seperti:

:14,20s/^/\/\//

Menyisipkan urutan karakter '//' di awal baris 14-20

Jika Anda tidak melihat nomor baris di editor Anda, cukup ketik yang berikut ini

:set nu
cyber-biarawan
sumber
untuk menghapus awal #: alih-alih: 14,20s / # / ^ /, Anda harus menggunakan: 14,20s / # //
cn1h
1
@ cn1h Saya pikir ini akan menggantikan yang lainnya #juga. Anda harus menggunakannya ^#sebagai gantinya.
ankush981
Terima kasih telah menjelaskan dasar-dasarnya. Adalah baik untuk mengetahui mengapa sesuatu terjadi.
didierCH
38

Cara lain yang mungkin lebih mudah bagi pendatang baru:

 some█
 code
 here

Tempatkan kursor pada baris pertama, misalnya dengan

gg

dan ketik berikut ini untuk masuk ke mode penyisipan dan menambahkan teks Anda:

I / / Space

 // █some
 code
 here

Tekan Escuntuk kembali ke mode perintah dan menggunakan digraf:

j . j .

 // some
 // code
 //█here

jadalah perintah gerak untuk turun satu baris dan .mengulangi perintah pengeditan terakhir yang Anda buat.

ninegrid
sumber
3
Itu sangat sederhana :). Jika Anda mengalami masalah dengan itu mungkin karena Anda mengetik bilah (simbol lain dengan \ Anda) |bukan modal I. Saya pikir itu |pada awalnya.
Cokedude
1
Jika saya melakukannya "5." itu menghapus 5 karakter dari baris yang sama. Bagaimana cara membuatnya menghapus 5 karakter sekaligus dari setiap baris?
Rahul Prasad
1
@RahulPrasad Katakanlah Anda memiliki 25 baris, lalu mulai dari depan baris pertama, catat 5xj ke dalam register dan mainkan register itu 24 kali, misalnya: qa5xjq25 @ a Tetapi akan lebih baik jika Anda memposting ini sebagai pertanyaan aktual jika tidak ada sudah ...
ninegrid
26

Dan cara lain:

  • Pindah ke awal baris
  • masuk ke mode Blok Visual ( CTRL- v)
  • pilih garis yang Anda inginkan (bergerak naik / turun dengan j/ k, atau melompat ke garis dengan [garis] G)
  • tekan I(itu modal saya)
  • ketikkan karakter komentar
  • tekan ESC
Yewge
sumber
20

Ini menambahkan #di awal setiap baris:

:%s/^/#/

Dan orang-orang akan berhenti mengeluh tentang kurangnya Anda mengomentari skrip yang benar.

Guci-guci
sumber
2
Bagaimana jika Anda ingin menambahkan # hanya pada baris yang dipilih (atau beberapa)
Rahul Prasad
15

Jika Anda ingin menjadi super mewah tentang itu, letakkan ini di .vimrc Anda:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

Kemudian, setiap kali dalam mode visual, Anda dapat menekan \cuntuk c omment blok dan \uuntuk u ncomment itu. Tentu saja, Anda dapat mengubah penekanan tombol pintas itu menjadi apa pun.

Lucas Oman
sumber
Terpilih karena memperkenalkan sesuatu yang baru - vmap!
ankush981
11

Namun cara lain:

:'<,'>g/^/norm I//

/^/hanyalah pola tiruan yang cocok dengan setiap baris. normmemungkinkan Anda menjalankan perintah mode normal yang mengikuti. I//mengatakan untuk masuk ke mode insert sambil melompat kursor ke awal baris, lalu masukkan teks berikut (dua garis miring).

:g sering berguna untuk melakukan sesuatu yang kompleks pada banyak baris, di mana Anda mungkin ingin beralih di antara beberapa mode, menghapus atau menambah baris, memindahkan kursor, menjalankan banyak makro, dll. Dan Anda dapat memerintahkannya untuk beroperasi hanya pada baris yang cocok dengan suatu pola.

Brian Carper
sumber
1
sebenarnya perintah: g tidak diperlukan. Ini akan melakukan:: '<,'> norma I //
Cyber ​​Oliveira
1
Dan: s lebih baik digunakan dalam kasus ini juga.
graywh
Ini adalah jawaban yang paling berguna.
Damai
3

Untuk mengomentari blok kode, saya suka plugin NERD Commenter .

Pilih beberapa teks:

Shift-V
...select the lines of text you want to comment....

Komentar:

,cc

Tanda komentar:

,cu

Atau hanya beralih kondisi komentar pada baris atau blok:

,c<space>
Kevin
sumber
2

Saya dapat merekomendasikan plugin EnhCommentify .

misalnya. letakkan ini di vimrc Anda:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

Anda kemudian dapat mengomentari / menghapus komentar pada baris (yang dipilih) dengan ', c'

Benedikt Waldvogel
sumber
3
Anda juga dapat menggunakan Nerd Commenter di vim.org/scripts/script.php?script_id=1218
Nathan Fellman
1

Tandai area yang akan dikomentari sebagai blok visual ( <C-V)

dan lakukan c#<ESC>p

  1. change ke "#"
  2. taruh lagi

Jika Anda sering melakukannya, tentukan pintasan (contoh \q) di .vimrc Anda

:vmap \q c#<ESC>p
Joao
sumber
1

Dalam hal pemilihan multi-baris seseorang sebenarnya adalah sebuah paragraf, tidak perlu memilih secara manual. vim dapat melakukannya untuk Anda:

  1. vip: pilih dan tandai seluruh paragraf
  2. shift-i: masukkan teks di awal baris
  3. escape: tinggalkan mode sisipkan / masuk ke mode normal [garis awal masih dipilih]
  4. escape: batalkan pemilihan garis awal
TheUnseen
sumber
0

Untuk memasukkan "ABC" di awal setiap baris:

1) Masuk ke mode perintah

2):% norma I ABC

Mac
sumber
Ini menambahkan teks di sebelah kiri karakter non-spasi pertama di baris.
Kingsley