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.

Rishabh Manocha
sumber
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>

theosp
sumber
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
72

satu arah secara manual

:set number
:10,12s/^/#
ghostdog74
sumber
4
bagaimana Anda menghapusnya?
Charlie Parker
15
@CharlieParker::10,12s/^#//
bstpierre
1
Thumbs up for ex answer (old school :)
mlv
Ini tidak berfungsi untuk kode indentasi
Andrés Pérez-Albela H.
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.

didaftarkan
sumber
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 #.

pengguna2437225
sumber
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/^#//

sumber
19

Ada beberapa plugin yang bagus untuk membantu komentar / tanda komentar. Misalnya The NERD Commenter .

Geoff Reedy
sumber
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
Lukas Cenovsky
sumber
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.

Darek
sumber
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 \)

Abid H. Mujtaba
sumber
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 .

Pierz
sumber
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?

Magnus
sumber
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.

yantaq
sumber
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>
Pradip Das
sumber