Bagaimana mengomentari blok kode Python di Vim


186

Saya bertanya-tanya apakah ada pemetaan kunci di Vim untuk memungkinkan saya untuk indentasi baris kode tertentu (apakah garis-garis tersebut telah dipilih dalam mode visual, atau n baris di atas / di bawah posisi kursor saat ini).

Jadi pada dasarnya sesuatu yang mengubah berikut

def my_fun(x, y):
    return x + y

untuk

#def my_fun(x, y):
#    return x + y

Saya baik-baik saja dengan menggunakan #atau """untuk mengomentari baris yang relevan. Idealnya, saya juga ingin penekanan tombol yang sama untuk menghapus komentar baris jika baris yang diberikan telah dikomentari.


Tidak perlu menemukan kembali roda, ada plugin: tComment untuk Anda, yang mendukung (tidak) kode komentar untuk berbagai bahasa.
Meow

Jawaban:


411

Langkah 1: Pergi ke kolom pertama dari baris pertama yang ingin Anda komentari.

Status awal

Langkah 2: Tekan: Ctrl+ vdan pilih baris yang ingin Anda komentari:

Pilih garis

Langkah 3: Shift - I#space(Masuk ke mode Insert-at-left, ketik karakter untuk disisipkan. Pilihan akan menghilang, tetapi semua baris di dalamnya akan dimodifikasi setelah Langkah 4.)

Komentar

Langkah 4: Esc

<Esc>


4
Mengomentari kalimat dengan cara ini sangat bagus. Apakah ada cara untuk menghilangkan tanda komentar pada baris ini? Shift-I # <ESC>tidak bekerja (mungkin saya salah melakukannya).
Rishabh Manocha

41
@ rishabh-manocha: gunakan blok visual (Ctrl-V) untuk memilih semua # yang ditambahkan dan ketik x untuk menghapusnya.
theosp

3
Anda harus ingat bahwa Shift-I berarti "masukkan pada baris pertama yang tidak kosong", sehingga tidak dapat digunakan untuk menghapus. Melakukan pemilihan visual dengan Ctrl-V menandai karakter yang akan dimodifikasi, kemudian "x" menghapus satu karakter di area yang dipilih, akhirnya menghapus karakter '#'. Lihat ": h I" dan ": h CTRL-V" dalam vim untuk informasi lebih lanjut.
the Tin Man

5
@Samaursa Ctrl-V mungkin tidak berfungsi di Windows. Coba Ctrl-Q sebagai gantinya.
AZ.

1
Untuk menghapus 2 karakter (jika Anda memasukkan '#'), cari kursor di baris paling atas yang ingin Anda modifikasi, tekan ctrl-v untuk masuk ke mode blok visual, tekan j (atau panah bawah) untuk menyorot semua baris untuk dimodifikasi, tekan l (atau panah kanan) untuk menyorot lebar 2-char (tekan sekali per kolom untuk menyorot), lalu tekan d untuk menghapus teks yang disorot.
thinkmassive


49

Anda bisa menambahkan pemetaan berikut ke .vimrc Anda

vnoremap <silent> # :s/^/#/<cr>:noh<cr>
vnoremap <silent> -# :s/^#//<cr>:noh<cr>

Sorot blokir Anda dengan:

Shift+v

# untuk mengomentari baris Anda dari kolom pertama.

-# untuk menghapus komentar dengan cara yang sama.


5
Sederhana itu brilian! Terimakasih!
1515

1
@architectonic tidak berpengaruh kecuali Anda berada dalam mode visual, dan '#' tidak terikat dalam mode visual vimdoc.sourceforge.net/htmldoc/visual.html#visual-operators
cdated

1
Saya telah memodifikasi sedikit: Ctrl + k untuk komentar "vnoremap <silent> <Ck>: s # ^ # \ ## <cr>: noh <cr>"> Ctrl + u untuk tanda komentar: "vnoremap <silent> <Cu >: s # ^ \ ### <cr>: noh <cr> "
Pradip Das

1
@JonathanHartley Anda tidak harus menggunakan '/' dalam hal ini '#' adalah pembatas. Jadi: s / ^ / # / dan: s / ^ # // adalah pengganti yang setara. Jadi ganti awal baris dengan '#' dan ganti '#' di kolom pertama dengan ''. <cr>: noh <cr> baru saja membersihkan string pencarian sehingga tidak ada yang tersisa yang disorot ketika Anda selesai.
Disiarkan

1
@JonathanHartley jujur ​​saya pikir saya hanya mengikuti pola tanpa memikirkannya. Sekarang saya terkejut # vs / tidak muncul lebih cepat. Mengubah jawaban berdasarkan akal sehat. Terima kasih!
Disiarkan

26

Sorot blokir Anda dengan: ShiftV

Komentari blok yang dipilih dengan: :norm i#(huruf kecil i)

Untuk membatalkan komentar, sorot blokir Anda lagi, dan batalkan komentar dengan: :norm ^x

The :normperintah melakukan tindakan untuk setiap baris yang dipilih. Mengomentari akan menyisipkan #pada awal setiap baris, dan menghapus komentar akan menghapusnya #.


Dengan Vim terbaru dan konfigurasi polos, memilih garis dalam mode visual (dengan Shift+v) dan kemudian :norm i#hanya menggunakan mengubah baris yang dipilih pertama. Ini berfungsi bagi saya untuk mengomentari baris 389 hingga 391::389,391norm i #
mmell

22

Saya biasanya menyapu blok visual ( <C-V>), lalu mencari dan mengganti karakter pertama dengan:

:'<,'>s/^/#

(Memasuki mode perintah dengan blok visual yang dipilih secara otomatis menempatkan '<,'> pada baris perintah) Saya kemudian dapat menghapus komentar blok dengan menyapu blok visual yang sama dan:

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


9

Saya memiliki baris berikut di .vimrc:

" comment line, selection with Ctrl-N,Ctrl-N
au BufEnter *.py nnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N><C-N>    <C-O>mn<C-O>:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>gv`n

" uncomment line, selection with Ctrl-N,N
au BufEnter *.py nnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>:s/^#$//ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N>n     <C-O>mn<C-O>:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR><C-O>:s/^#$//ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>gv:s/#\n/\r/ge<CR>:noh<CR>gv`n

Cara pintas mempertahankan posisi kursor dan komentar Anda selama mereka mulai dengan #(ada ruang setelah #). Sebagai contoh:

# variable x
x = 0

Setelah berkomentar:

# variable x
#x = 0

Setelah uncomennting:

# variable x
x = 0

Bagus, tapi saya pikir Anda akan lebih baik menggunakan s/^/#/regexp sederhana . Saya lebih suka komentar char terjadi di awal baris ... tetapi jauh lebih penting, 'komentar komentar' sangat penting. Saya juga menjatuhkan au BufEnter *.py, karena #komentar cukup umum untuk perintah yang digunakan di semua buffer secara default.
Travc

5

Terus terang saya menggunakan plugin tcomment untuk tautan itu . Ia dapat menangani hampir setiap sintaks. Ini mendefinisikan gerakan yang bagus, menggunakannya dengan beberapa pencocokan blok teks khusus untuk python membuatnya menjadi alat yang ampuh.


5

NERDcommenter adalah plugin yang sangat baik untuk berkomentar yang secara otomatis mendeteksi sejumlah tipe file dan karakter komentar terkaitnya. Sangat mudah untuk menginstal menggunakan Pathogen .

Komentar dengan <leader>cc. Batalkan komentar dengan <leader>cu. Dan beralih komentar dengan <leader>c<space>.

( <leader>Kunci default dalam vim adalah \)


3

Ada banyak plugin komentar untuk vim - beberapa di antaranya multi-bahasa - bukan hanya python. Jika Anda menggunakan manajer plugin seperti Vundle maka Anda dapat mencarinya (setelah Anda menginstal Vundle) menggunakan misalnya:

:PluginSearch comment

Dan Anda akan mendapatkan jendela hasil. Atau Anda bisa mencari plugin komentar vim-scripts .


3

Tidak diperlukan plugin atau pemetaan. Coba perintah "norma" bawaan, yang secara harfiah mengeksekusi apa pun yang Anda inginkan pada setiap baris yang dipilih.

Tambahkan # Komentar

1. shift V to visually select lines
2. :norm i#

Hapus # Komentar

1. visually select region as before
2. :norm x

Atau jika komentar Anda indentasi dapat Anda lakukan :norm ^x

Perhatikan bahwa ini hanyalah perintah vim biasa yang didahului oleh ": norma" untuk mengeksekusinya di setiap baris.

Jawaban yang lebih terperinci untuk menggunakan perintah "norma" di salah satu jawaban di sini

Apa cara cepat untuk mengomentari / menghapus komentar baris di Vim?


1

Plugin ringan yang sangat minim : vim-commentary.

gccmengomentari baris
gcgcke tanda komentar. lihat halaman plugin untuk lebih.

v+k/jsorot blok lalu gccberi komentar pada blok itu.


0

CtrlK untuk komentar (Mode Visual):

vnoremap <silent> <C-k> :s#^#\##<cr>:noh<cr>

CtrlU untuk tanda komentar (Mode Visual):

vnoremap <silent> <C-u> :s#^\###<cr>:noh<cr>
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.