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

1172

Saya memiliki file kode Ruby terbuka di vi, ada baris yang dikomentari dengan #:

class Search < ActiveRecord::Migration
  def self.up
    # create_table :searches do |t|
    #   t.integer :user_id
    #   t.string :name
    #   t.string :all_of
    #   t.string :any_of
    #   t.string :none_of
    #   t.string :exact_phrase
    # 
    #   t.timestamps
    # end
  end

  def self.down
    # drop_table :searches
  end
end

Katakanlah saya ingin menghapus komentar semua baris di bagian pertama def ... end. Apa cara yang efisien untuk melakukan itu di Vim?

Secara umum, saya mencari cara yang mudah dan lancar untuk berkomentar dan menghapus komentar. Di sini saya berurusan dengan kode Ruby, tetapi bisa berupa JavaScript ( //) atau Haml ( -#).

Ethan
sumber
20
Jawaban yang diterima harus diubah menjadi salah satu jawaban yang memiliki instruksi terperinci tentang cara menyelesaikan blok komentar / komentar tanpa menggunakan plugin. The jawaban yang diterima saat ini pada dasarnya hanya link ke sebuah plugin pihak ketiga.
faintsignal
Jawaban dengan peringkat terbaik tidak menyebutkan plugin apa pun, @rationalis komentar Anda menyesatkan, bisakah Anda memperbaikinya atau menghapusnya, terima kasih.
bonobo

Jawaban:

181

Saya menggunakan skrip NERD Commenter . Ini memungkinkan Anda dengan mudah mengomentari, menghapus komentar atau mengganti komentar dalam kode Anda.

Seperti disebutkan dalam komentar :

bagi siapa saja yang bingung dengan penggunaannya, pemimpin default adalah "\" jadi 10 \ cc akan mengomentari sepuluh baris dan 10 \ cu akan menghapus komentar sepuluh baris tersebut

Manuel Ceron
sumber
Menarik! Saya membaca Doc dan menemukan ada "komentar seksi" - cukup gunakan "\ cs". Untuk Ruby, ia akan menggunakan =begindan =endmengomentari banyak baris alih-alih tag hash.
Hegwin
Saya pikir itu bukan cara tercepat untuk melakukannya dengan vim karena perlu menginstal plugin. Juga jawaban terbaik telah menerima lebih banyak suara tetapi belum ditandai sebagai solusi.
Whirmill
138
Jangan berhenti di sini. Sebagian besar jawaban di bawah ini tanpa persyaratan plugin apa pun. stackoverflow.com/a/15588798/2117868 dan stackoverflow.com/a/1676690/2117868
kuttumiah
@whirmill Saya pikir "terbaik" benar-benar tergantung pada use case. Mode blok visual lebih cepat jika saya ingin beralih komentar sekali dalam hidup saya. Tetapi jika saya tidak keberatan menginstal plugin dan ingin melakukan penekanan tombol sesedikit mungkin untuk beralih komentar dan tidak harus membedakan operasi antara menambahkan atau menghapus komentar - maka ini di sini mungkin menjadi "jawaban terbaik".
Carolus
@Cololus saya akan setuju dengan Anda jika pertanyaannya dimulai dengan "apa cara terbaik" alih-alih "apa cara cepat".
Whirmill
2544

Untuk tugas-tugas itu saya menggunakan sebagian besar pemilihan blok waktu .

Letakkan kursor Anda pada #karakter pertama , tekan CtrlV(atau CtrlQuntuk gVim), dan turun sampai baris komentar terakhir dan tekan x, yang akan menghapus semua #karakter secara vertikal.

Untuk mengomentari blok teks hampir sama:

  1. Pertama, buka baris pertama yang ingin Anda komentari, tekan CtrlV. Ini akan menempatkan editor dalam VISUAL BLOCKmode.
  2. Kemudian gunakan tombol panah dan pilih hingga baris terakhir
  3. Sekarang tekan ShiftI, yang akan menempatkan editor dalam INSERTmode dan kemudian tekan #. Ini akan menambahkan hash ke baris pertama.
  4. Kemudian tekan Esc(beri sebentar), dan itu akan menyisipkan #karakter pada semua baris yang dipilih lainnya.

Untuk versi singkat dari vim yang dikirimkan dengan debian / ubuntu secara default, ketik : s/^/#langkah ketiga sebagai gantinya (setiap penyorotan yang tersisa dari karakter pertama dari setiap baris dapat dihapus dengan :nohl).

Berikut adalah dua rekaman layar kecil untuk referensi visual.

Komentar: Komentar

Tanda komentar: Uncomment

CMS
sumber
87
Secara default itu adalah CTRL + V. Versi windows gvim menggunakan Ctrl + Q karena Ctrl + V sudah digunakan untuk menempelkan.
R. Martinho Fernandes
8
@amindfv Ctrl + V, n(di mana n adalah garis num - 1), j, n(di mana n num jumlah panjang urutan karakter komentar - 1), l, x.
michael.bartnett
28
Bagaimana Anda melakukan ini dengan '//'?
AustinT
74
Anda dapat mengklik Esc dua kali untuk tidak menunggu yang kedua;)
Ahmed Hegazy
45
Ini tidak berhasil untuk saya. Shift-I masuk ke mode penyisipan sederhana.
Geremia
828

Untuk mengomentari blok di vim:

  • tekan Esc(untuk meninggalkan pengeditan atau mode lain)
  • tekan ctrl+ v(mode blok visual)
  • gunakan tombol / panah untuk memilih garis yang Anda inginkan (tidak akan menyorot semuanya - tidak apa-apa!)
  • Shift+ i(huruf kapital I)
  • masukkan teks yang Anda inginkan, mis %
  • tekan EscEsc

Untuk menghapus tanda komentar pada blok di vim:

  • tekan Esc(untuk meninggalkan pengeditan atau mode lain)
  • tekan ctrl+ v(mode blok visual)
  • gunakan tombol / panah untuk memilih garis yang tidak ditandai.

    Jika Anda ingin memilih beberapa karakter, gunakan satu atau gabungkan metode ini:

    • gunakan tombol panah kiri / kanan untuk memilih lebih banyak teks
    • untuk memilih potongan teks menggunakan tombol shift+ / panah
    • Anda dapat berulang kali menekan tombol hapus di bawah, seperti tombol hapus biasa

  • tekan datau xuntuk menghapus karakter, berulang kali jika perlu
amelia
sumber
34
@amelia: Pintasan komentar tidak berfungsi untuk saya. Shift + i membawa saya ke mode insert. Apakah ini tergantung pada versi vim?
user3527975
7
Mengapa perlu sedetik?
Conor Patrick
24
Satu-satunya masalah yang saya miliki dengan jawaban ini adalah ia memberi tahu Anda untuk menggunakan tombol panah .
cozyconemotel
6
Tekan Esc dua kali saja. :)
Aaron Alphonsus
22
Pada awalnya mengaktifkan komentar tidak berfungsi untuk saya tetapi setelah membaca itu sekali lagi bekerja dengan baik: 1. pastikan Anda menggunakan Ctrl-V, bukan V untuk seleksi 2. ketika memasukkannya akan muncul karena Anda hanya memodifikasi satu baris 3. semua sisipan terjadi ketika Anda menekan Esc pada akhirnya
timurb
335

Kadang-kadang saya dimasukkan ke kotak jauh di mana plugin dan .vimrc saya tidak dapat membantu saya, atau kadang-kadang NerdCommenter salah melakukannya (mis. JavaScript tertanam di dalam HTML).

Dalam kasus ini alternatif teknologi rendah adalah normperintah bawaan, yang hanya menjalankan perintah vim sewenang-wenang di setiap baris dalam rentang yang Anda tentukan. Sebagai contoh:

Berkomentar dengan # :

1. visually select the text rows (using V as usual)
2. :norm i#

Ini memasukkan "#" di awal setiap baris. Perhatikan bahwa saat Anda mengetik: rentang akan diisi, sehingga akan benar-benar terlihat:'<,'>norm i#

Tidak berkomentar # :

1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x

Ini menghapus karakter pertama dari setiap baris. Jika saya menggunakan komentar 2-char seperti // maka saya cukup lakukan :norm xxuntuk menghapus kedua karakter tersebut.

Jika komentar diindentasikan seperti dalam pertanyaan OP, maka Anda dapat membuang jangkar seperti ini:

:norm ^x

yang berarti "pergi ke karakter non-spasi pertama, lalu hapus satu karakter". Perhatikan bahwa tidak seperti pemilihan blok, teknik ini berfungsi bahkan jika komentar memiliki indentasi yang tidak rata!

Catatan : Karena normsecara harfiah hanya menjalankan perintah vim biasa, Anda tidak terbatas pada komentar, Anda juga dapat melakukan beberapa pengeditan kompleks untuk setiap baris. Jika Anda memerlukan karakter escape sebagai bagian dari urutan perintah Anda, ketik ctrl-v lalu tekan tombol escape (atau bahkan lebih mudah, cukup rekam makro cepat dan kemudian gunakan norma untuk mengeksekusi makro itu di setiap baris).

Catatan 2 : Anda tentu saja dapat juga menambahkan pemetaan jika Anda menemukan diri Anda menggunakan normbanyak. Misalnya, memasukkan baris berikut ke ~ / .vimrc memungkinkan Anda mengetik ctrl-nalih-alih :normsetelah membuat pilihan visual

vnoremap <C-n> :norm

Catatan 3 : Bare-bones vim terkadang tidak memiliki normperintah yang dikompilasi ke dalamnya, jadi pastikan untuk menggunakan versi yang ditingkatkan, yaitu biasanya / usr / bin / vim, bukan / bin / vi

(Terima kasih kepada @Manbroski dan @rakslice untuk peningkatan yang dimasukkan ke dalam jawaban ini)

Magnus
sumber
Saya pikir ini adalah cara untuk pergi sampai saya menggulir untuk membaca jawaban ini stackoverflow.com/a/1676690/850996 Pemilihan blok menggunakan CTRL + V (yang bertentangan dengan pemilihan garis dengan SHIFT + V) memberikan kontrol yang jauh lebih baik atas di mana komentar penyisipan karakter berlangsung.
Shyam Habarakada
2
@Shyam Teknik ctrl-v yang dikombinasikan dengan perintah khusus pemilihan blok saja adalah yang direkomendasikan sebagian besar jawaban lain; namun saya pribadi menemukan teknik "norma" yang saya jelaskan lebih mudah karena tidak memperkenalkan sintaks baru selain perintah norma itu sendiri, sehingga saya dapat menggunakan kembali apa yang sudah saya ketahui tentang vim.
Magnus
2
Untuk menghilangkan komentar pada blok yang berlekuk, ada baiknya untuk mengatakan :norm ^x. Metode ini secara umum memiliki keuntungan bekerja dengan pemilihan wilayah (misalnya vi{akan memilih kurung kurawal di dalam). Selektor objek teks semacam itu tidak bekerja Visual Block.
ivan-k
1
Ah, saya baru saja mengetahuinya - pada centos 6 /bin/viitu vim 7.2, tapi itu build yang berbeda dari /usr/bin/vim, dan memiliki fitur seperti ini dimatikan.
rakslice
4
Sejauh ini, inilah jawaban terbaik. Terutama bila dikombinasikan dengan vipuntuk memilih seluruh paragraf.
meh
122

Saya memiliki yang berikut ini di .vimrc:

" Commenting blocks of code.
autocmd FileType c,cpp,java,scala let b:comment_leader = '// '
autocmd FileType sh,ruby,python   let b:comment_leader = '# '
autocmd FileType conf,fstab       let b:comment_leader = '# '
autocmd FileType tex              let b:comment_leader = '% '
autocmd FileType mail             let b:comment_leader = '> '
autocmd FileType vim              let b:comment_leader = '" '
noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>

Sekarang Anda dapat mengetik ,ccuntuk mengomentari garis dan ,cumenghapus tanda komentar garis (berfungsi baik dalam mode normal dan visual).

(Saya mencurinya dari beberapa situs web bertahun-tahun yang lalu jadi saya tidak bisa sepenuhnya menjelaskan cara kerjanya lagi :). Ada komentar yang menjelaskannya.)

jqno
sumber
apa jalan pintas yang harus saya gunakan? Saya tidak bisa memastikan dari kode vim itu sendiri!
gideon
dalam mode normal atau visual, gunakan ", cc" (3 urutan karakter) untuk mengomentari baris saat ini, dan ", cu" untuk menghapus komentar pada baris saat ini.
Dan
8
saya suka itu :)! Terima kasih! Di samping catatan saya tidak merasa sulit untuk menjelaskan. a) memformat ulang sebuah perintah (non rekursif [lihat ini] ( stackoverflow.com/questions/3776117/… ) jadi sekarang ketika Anda menekan, cc: ... hal dieksekusi. b) sekarang ini pada dasarnya adalah sed (s) / what / towhat / where) perintah mengubah ^ (mulai dari baris) ke karakter komentar yang ditetapkan dengan benar berdasarkan jenis file yang telah Anda buka c) sedangkan untuk hal diam mereka hanya menekan output dari perintah. d): nohlsearch menghentikannya dari menyoroti pencarian sed
ramrunner
14
Catatan, ini bukan cara yang benar untuk memuat perintah otomatis. Mereka harus berada di dalam augroup atau mereka akan ditambahkan ke vim beberapa kali dan menyebabkan banyak memperlambat. Lihat: learnvimscriptthehardway.stevelosh.com/chapters/14.html . Saya telah menambahkan jawaban saya untuk pertanyaan ini.
Bagus. Ini adalah jawaban aktual untuk pertanyaan yang saya miliki tentang cara (membatalkan) komentar saat Anda memiliki pilihan blokir.
Erwin Rooijakkers
120

Tentukan baris mana yang akan dikomentari dalam vim:

Mengungkapkan nomor baris:

:set number

kemudian

:5,17s/^/#/     this will comment out line 5-17

atau ini:

:%s/^/#/        will comment out all lines in file
Carlos
sumber
11
Karena Anda baru saja mengubah karakter pertama di setiap baris, Anda tidak memerlukan "g" di akhir
Magnus
1
Beberapa vims pada embedded box (seperti openwrt) tidak memiliki mode visual .. Jadi ini sangat luar biasa :)
kim0
dapatkah Anda menjelaskan mengapa :%s/^/#/gkomentar semua baris? Saya ingin tahu tanda persennya%
Bin
18
Dan untuk menghilangkan tanda komentar pada baris-baris ini, Anda dapat menulis: 5,17s / ^ # /
Iraklis Moutidis
Bagus! Ini benar-benar berfungsi dengan baik dengan pemilihan blok seperti: va{atau dengan varuntuk ruby.
Artur Małecki
58

Inilah cara saya melakukannya:

  1. Pergi ke karakter pertama pada baris pertama yang ingin Anda komentari.

  2. Tekan Ctrl+ qdi GVIM atau Ctrl+ vdi VIM, lalu turun untuk memilih karakter pertama pada baris untuk berkomentar.

  3. Kemudian tekan c, dan tambahkan karakter komentar.

Uncommenting bekerja dengan cara yang sama, cukup ketikkan spasi alih-alih karakter komentar.

Marcin
sumber
44
cmenghapus karakter pertama juga. Jawaban CMS benar yaitu menekan Ikemudian mengetik karakter komentar dan kemudian Esc(ini ada di windows vim)
Samaursa
6
Ini berfungsi, kecuali 'r' perlu ditekan pada langkah ketiga, bukan 'c'.
David Baucum
atau Anda dapat menekan ESCdua kali setelah menekan cdan yang seharusnya melakukan trik
nihiser
Semua opsi ini merusak karakter pertama di telepon.
Josiah
36

Saya telah datang dengan tambahan sederhana untuk file .vimrc saya yang berfungsi dengan cukup baik dan dapat diperpanjang dengan mudah. Anda cukup menambahkan filetype baru ke comment_map dan pemimpin komentarnya.

Saya menambahkan pemetaan ke mode normal dan visual, tetapi Anda dapat memetakan kembali apa pun yang Anda suka. Saya lebih suka hanya memiliki fungsi gaya 'toggle'. Satu beruang memiliki beberapa pemetaan dll.

let s:comment_map = { 
    \   "c": '\/\/',
    \   "cpp": '\/\/',
    \   "go": '\/\/',
    \   "java": '\/\/',
    \   "javascript": '\/\/',
    \   "lua": '--',
    \   "scala": '\/\/',
    \   "php": '\/\/',
    \   "python": '#',
    \   "ruby": '#',
    \   "rust": '\/\/',
    \   "sh": '#',
    \   "desktop": '#',
    \   "fstab": '#',
    \   "conf": '#',
    \   "profile": '#',
    \   "bashrc": '#',
    \   "bash_profile": '#',
    \   "mail": '>',
    \   "eml": '>',
    \   "bat": 'REM',
    \   "ahk": ';',
    \   "vim": '"',
    \   "tex": '%',
    \ }

function! ToggleComment()
    if has_key(s:comment_map, &filetype)
        let comment_leader = s:comment_map[&filetype]
        if getline('.') =~ "^\\s*" . comment_leader . " " 
            " Uncomment the line
            execute "silent s/^\\(\\s*\\)" . comment_leader . " /\\1/"
        else 
            if getline('.') =~ "^\\s*" . comment_leader
                " Uncomment the line
                execute "silent s/^\\(\\s*\\)" . comment_leader . "/\\1/"
            else
                " Comment the line
                execute "silent s/^\\(\\s*\\)/\\1" . comment_leader . " /"
            end
        end
    else
        echo "No comment leader found for filetype"
    end
endfunction


nnoremap <leader><Space> :call ToggleComment()<cr>
vnoremap <leader><Space> :call ToggleComment()<cr>

catatan:

Saya tidak menggunakan callback atau kait apa pun ke dalam tipe file / memuat, karena saya menemukan mereka memperlambat startup Vim lebih dari .vimrcfungsi statis / peta tetapi itu hanya preferensi saya. Saya juga mencoba membuatnya tetap sederhana dan performan. Jika Anda menggunakan perintah otomatis, Anda harus memastikan untuk memasukkannya ke dalam grup perintah otomatis atau jika tidak, callback akan ditambahkan ke tipe file beberapa kali per file yang dimuat dan menyebabkan banyak penurunan kinerja.

gagasanman42
sumber
1
Saya benar-benar baru untuk vim, tombol apa yang harus saya tekan untuk mengaktifkan fungsi yang dipetakan? <leader><Space>Deklarasi apa yang ada di bawah?
Jens Kohl
2
Anda dapat mengganti <leader> dengan kunci seperti <,>. Kemudian Anda menekan, SPACE dan itu akan mengubah status komentar baris. Pemimpin adalah apa pun pemimpin Anda, <leader> default Vim adalah \, tetapi Anda dapat mengatur sendiri seperti "biarkan mapleader = ','"
Jawaban yang bagus, satu gangguan, mengomentari blok yang sudah memiliki beberapa komentar, akan bertukar komentar untuk baris yang tidak dikomentari. QtCreator misalnya hanya menghapus komentar jika semua baris yang tidak kosong memiliki komentar utama, atau menambahkan komentar utama.
ideasman42
1
Saya telah membuat versi yang sedikit berbeda menggunakan trik \zsdan \zeregex, kode menjadi sedikit lebih kecil. Anda bisa melihatnya di sini
SergioAraujo
33

Alihkan komentar

Jika semua yang Anda butuhkan adalah beralih komentar saya lebih suka pergi dengan commentary.vim oleh tpope .

masukkan deskripsi gambar di sini

Instalasi

Patogen:

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git

vim-plug:

Plug 'tpope/vim-commentary'

Vundle:

Plugin 'tpope/vim-commentary'

Kustomisasi lebih lanjut

Tambahkan ini ke file .vimrc Anda: noremap <leader>/ :Commentary<cr>

Anda sekarang dapat beralih komentar dengan menekan Leader+ /, seperti Sublime dan Atom.

Flavio Wuensche
sumber
Terima kasih! apakah itu akan mendukung komentar css di dalam html di masa depan?
Dan Oak
25

Gunakan Control-V untuk memilih persegi panjang teks: buka #karakter pertama , ketik Ctrl+ V, geser ke kanan satu kali, lalu ke bawah, hingga akhir komentar. Sekarang ketik x: Anda menghapus semua #karakter diikuti oleh satu spasi.

Arthur Reutenauer
sumber
18

Ini bagian dari saya .vimrc:

"insert and remove comments in visual and normal mode
vmap ,ic :s/^/#/g<CR>:let @/ = ""<CR>
map  ,ic :s/^/#/g<CR>:let @/ = ""<CR>
vmap ,rc :s/^#//g<CR>:let @/ = ""<CR>
map  ,rc :s/^#//g<CR>:let @/ = ""<CR>

Dalam mode normal dan visual, ini memungkinkan saya menekan ,icuntuk memasukkan komentar dan ,rcmenghapus komentar.

innaM
sumber
Ini sangat membantu bagi pemula bagaimana belajar menulis sendiri .vimrc.
keren
3
mapmencakup mode normal dan visual, jadi Anda tidak perlu vmapgaris
doubleDown
Tempat yang lebih baik after/ftplugin/ruby.vim.
Santosh Kumar
juga menggunakan <leader>icdan<leader>rc
Hans Kristian
15

Saya menggunakan vim 7.4 dan ini berfungsi untuk saya.
Dengan asumsi kami mengomentari / menghapus komentar 3 baris.

Untuk berkomentar:

jika baris tidak memiliki tab / ruang di awal:
ctrl + Vmaka jjjkemudian shift + I (cappital i)kemudian //kemudian esc esc
jika baris memiliki tab / ruang di awal Anda masih bisa melakukan hal di atas atau swap c:
ctrl + Vmaka jjjkemudian ckemudian //kemudian esc esc

Untuk tanda komentar:

jika garis tidak memiliki tab / spasi di awal:
ctrl + Vlalu jjjmaka ll (lower cap L)kemudianc

jika garis memiliki tab / ruang di awal, maka Anda satu ruang atas dan esc
ctrl + Vkemudian jjjkemudian ll (lower cap L)kemudian ckemudian spacekemudianesc

Andy
sumber
9

Dengan 30 jawaban di depan saya, saya akan mencoba memberikan solusi yang lebih mudah: Masukkan a #di awal baris. Lalu turun satu baris dan tekan dot ( .). Untuk ulangi, jangan j, ., j, ., dll ... Untuk tanda komentar, menghapus #(Anda dapat menekan xatas #), dan melakukan sebaliknya menggunakan k, ., dll ...

bayangkan itu
sumber
1
Ini adalah jawaban yang sangat sederhana yang bahkan dapat dipahami dan digunakan oleh pemula. Namun, itu bekerja sangat lambat pada sejumlah besar baris untuk berkomentar. Untuk mengatasinya Anda dapat menulis I#<Esc>jke buffer - katakan, c- dan kemudian lakukan 10@c, atau berapa pun jumlah baris yang cocok untuk Anda.
Daerdemandt
9

Cara menghapus komentar pada tiga baris berikut in vi:

#code code
#code
#code code code

Tempatkan kursor di atas #simbol kiri atas dan tekan CtrlV. Ini menempatkan Anda dalam mode blok visual. Tekan panah bawah atau Jtiga kali untuk memilih ketiga garis. Lalu tekan D. Semua komentar hilang. Untuk membatalkan, tekan U.

Bagaimana mengomentari tiga baris berikut di vi:

code code
code
code code code

Tempatkan kursor di atas karakter kiri atas, tekan CtrlV. Ini menempatkan Anda dalam mode blok visual. Tekan atau Jtiga kali untuk memilih ketiga garis. Lalu tekan:

I//Esc

Itu modal saya, //, dan Escape.

Saat Anda menekan ESC, semua baris yang dipilih akan mendapatkan simbol komentar yang Anda tentukan.

Ivor Scott
sumber
1
jika Anda melewatkan hash "kiri atas", Anda dapat menekan o untuk memindahkan kursor ke "sisi lain" dalam mode visual.
dylnmc
Saya pikir ini yang terbaik untuk digunakan. Tidak perlu pihak ketiga, cukup gunakan vim asli
Ardi Nusawan
jawaban terbaik, sederhana dan tanpa pihak ketiga
aze
8

Ya, sudah ada 33 (kebanyakan berulang) jawaban untuk pertanyaan ini.

Berikut adalah pendekatan lain tentang cara mengomentari kalimat di Vim: motions . Ide dasarnya adalah mengomentari atau menghapus komentar baris menggunakan metode yang sama seperti menarik paragraf dengan mengetik yipatau menghapus 2 baris dengan mengetik dj.

Pendekatan ini akan memungkinkan Anda melakukan hal-hal seperti:

  • ccjuntuk mengomentari 2 baris berikutnya, dan cukmenghapus komentar mereka;

  • cci{untuk mengomentari blokir, dan cui{untuk menghapus komentar itu;

  • ccipuntuk mengomentari seluruh paragraf, dan cuipmembatalkan komentar itu.

  • ccGuntuk mengomentari semuanya sampai ke baris terakhir, dan cugguntuk membatalkan komentar semuanya sampai ke baris pertama.

Yang Anda butuhkan adalah 2 fungsi yang beroperasi lebih dari gerakan , dan 2 pemetaan untuk setiap fungsi. Pertama, pemetaan:

nnoremap <silent> cc  :set opfunc=CommentOut<cr>g@
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>g@
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

(Lihat manual tentang g@operator dan operatorfuncvariabelnya.)

Dan sekarang fungsinya:

function! CommentOut(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^/#/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^/#/\<cr>'["
  endif
endfunction

function! Uncomment(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^\\(\\s*\\)#/\\1/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^\\(\\s*\\)#/\\1/\<cr>`["
  endif
endfunction

Ubah ekspresi reguler di atas agar sesuai dengan selera Anda di mana #seharusnya:

no
sumber
"gerakan [...] yang sepenuhnya baru" tampaknya sedikit di atas: plugin t_comment dan vim-commentary, yang keduanya mendahului jawaban ini, memungkinkan Anda untuk berkomentar menggunakan gerakan.
Kaya
Barang bagus! Terpilih. (Saya juga berpikir saya mungkin mulai menggunakan pendekatan ini alih-alih plugin yang saya gunakan sebelumnya, jadi terima kasih telah menulisnya!)
Rich
7

Jika Anda sudah tahu nomor baris, maka n,ms/# //akan berhasil.

uckelman
sumber
benar-benar mungkin seharusnya: n, ms / ^ \ s. # // Karena Anda mungkin memiliki ruang putih dan mungkin tidak mengikuti hash dengan satu
Lewati Huffman
7

Saya menandai baris pertama dan terakhir (ma dan mb), dan kemudian melakukan: 'a,' bs / ^ # //

SDGator
sumber
6

Saya menggunakan EnhancedCommentify . Ini komentar semua yang saya butuhkan (bahasa pemrograman, skrip, file konfigurasi). Saya menggunakannya dengan binding mode visual. Cukup pilih teks yang ingin Anda komentari dan tekan co / cc / cd.

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 
qba
sumber
5

Saya menggabungkan jawaban Phil dan jqno dan membuat komentar tanpa tanda dengan spasi:

autocmd FileType c,cpp,java,scala let b:comment_leader = '//'
autocmd FileType sh,ruby,python   let b:comment_leader = '#'
autocmd FileType conf,fstab       let b:comment_leader = '#'
autocmd FileType tex              let b:comment_leader = '%'
autocmd FileType mail             let b:comment_leader = '>'
autocmd FileType vim              let b:comment_leader = '"'
function! CommentToggle()
    execute ':silent! s/\([^ ]\)/' . b:comment_leader . ' \1/'
    execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>
pemandu matematika
sumber
5

Ada plugin yang mengubah hidup ini dengan tpopemeneleponvim-commentary

https://github.com/tpope/vim-commentary

Plugin ini menyediakan :

  • Kewarasan
  • Komentar yang terindentasi dengan benar
  • Tidak mengomentari baris kosong / tidak perlu

Penggunaan :

  • Instal melalui Vundle (atau saya kira Patogen).
  • Sorot teks Anda dan tekan :yang akan ditampilkan sebagai:<,'>
  • Ketik Komentar di sini :<,'>Commentarydan tekan Enter.
  • Ledakan. Tunas Anda sudah selesai.
Weston Ganger
sumber
vim-commentary(seperti semua plugin tpope) memiliki bonus menjadi idiom vim. gc= "go comment", gcap= "go comment a paragraph", etc.
goldenratio
Mungkinkah ini hasil edit dari jawaban Paus Tim oleh Jim Stewart?
jdk1.0
5

Jawaban ini sangat berguna jika Anda tidak dapat menginstal plugin tetapi Anda masih ingin karakter komentar Anda mengikuti level indentasi yang ada.

Jawaban ini ada di sini untuk 1) menunjukkan kode yang benar untuk ditempel ke dalam .vimrcuntuk vim 7.4+melakukan blok komentar / komentar sambil menjaga tingkat lekukan dengan 1 pintasan dalam mode visual dan 2) untuk menjelaskannya. Ini kodenya:

let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.[ch]    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.cpp    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.py    let b:commentChar='#'
autocmd BufNewFile,BufReadPost *.*sh    let b:commentChar='#'
function! Docomment ()
  "make comments on all the lines we've grabbed
  execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
endfunction
function! Uncomment ()
  "uncomment on all our lines
  execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
endfunction
function! Comment ()
  "does the first line begin with a comment?
  let l:line=getpos("'<")[1]
  "if there's a match
  if match(getline(l:line), '^\s*'.b:commentChar)>-1
    call Uncomment()
  else
    call Docomment()
  endif
endfunction
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>

Bagaimana itu bekerja:

  • let b:commentChar='//': Ini menciptakan variabel dalam vim. di bsini mengacu pada ruang lingkup, yang dalam hal ini terkandung ke buffer, yang berarti file yang sedang dibuka. Karakter komentar Anda adalah string dan perlu dibungkus dengan tanda kutip, tanda kutip itu bukan bagian dari apa yang akan diganti ketika bertukar komentar.

  • autocmd BufNewFile,BufReadPost *...: Perintah otomatis memicu pada hal-hal yang berbeda, dalam hal ini, ini memicu ketika file baru atau file baca berakhir dengan ekstensi tertentu. Setelah dipicu, jalankan perintah berikut, yang memungkinkan kita untuk mengubah commentChartergantung pada tipe file. Ada cara lain untuk melakukan ini, tetapi mereka lebih membingungkan bagi pemula (seperti saya).

  • function! Docomment(): Fungsi dideklarasikan dengan mulai functiondan diakhiri dengan endfunction. Fungsi harus dimulai dengan modal. itu !memastikan bahwa fungsi ini menimpa setiap fungsi sebelumnya yang didefinisikan Docomment()dengan versi ini Docomment(). Tanpa !, saya memiliki kesalahan, tapi itu mungkin karena saya mendefinisikan fungsi baru melalui baris perintah vim.

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e': Jalankan panggilan perintah. Dalam hal ini, kami mengeksekusi substitute, yang dapat mengambil rentang (secara default ini adalah baris saat ini) seperti %untuk seluruh buffer atau '<,'>untuk bagian yang disorot. ^\s*adalah regex untuk mencocokkan awal baris diikuti oleh jumlah spasi, yang kemudian ditambahkan ke (karena &). Di .sini digunakan untuk penggabungan string, karena escape()tidak dapat dibungkus dengan tanda kutip. escape()memungkinkan Anda untuk keluar dari karakter commentCharyang cocok dengan argumen (dalam hal ini, \dan /) dengan menambahkannya dengan a \. Setelah ini, kami menyatukan lagi dengan ujung substitutesenar kami , yang memilikiebendera. Bendera ini memungkinkan kita gagal secara diam-diam, artinya jika kita tidak menemukan kecocokan pada baris yang diberikan, kita tidak akan berteriak tentang hal itu. Secara keseluruhan, baris ini memungkinkan kita menempatkan karakter komentar diikuti oleh spasi tepat sebelum teks pertama, yang berarti kita menjaga tingkat indentasi kita.

  • execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e': Ini mirip dengan perintah besar terakhir kami. Unik untuk yang satu ini, kami punya \v, yang memastikan bahwa kami tidak harus melarikan diri dari kami (), dan 1, yang mengacu pada grup yang kami buat dengan kami (). Pada dasarnya, kami mencocokkan garis yang dimulai dengan jumlah spasi putih apa pun dan kemudian karakter komentar kami diikuti oleh jumlah spasi putih apa pun, dan kami hanya menyimpan set spasi putih pertama. Sekali lagi, emari kita gagal secara diam-diam jika kita tidak memiliki karakter komentar di baris itu.

  • let l:line=getpos("'<")[1]: ini menetapkan variabel seperti yang kami lakukan dengan karakter komentar kami, tetapi lmerujuk ke lingkup lokal (lokal ke fungsi ini). getpos()mendapat posisi, dalam hal ini, awal dari penyorotan kami, dan [1]sarana kami hanya peduli dengan nomor baris, bukan hal-hal lain seperti nomor kolom.

  • if match(getline(l:line), '^\s*'.b:commentChar)>-1: Anda tahu cara ifkerjanya. match()memeriksa apakah hal pertama berisi hal kedua, jadi kami mengambil garis yang kami mulai sorot kami, dan memeriksa apakah itu dimulai dengan spasi putih diikuti oleh karakter komentar kami. match()mengembalikan indeks di mana ini benar, dan -1jika tidak ada kecocokan yang ditemukan. Karena ifmengevaluasi semua angka bukan nol itu benar, kita harus membandingkan output kita untuk melihat apakah itu lebih besar dari -1. Perbandingan dalam vimpengembalian 0 jika salah dan 1 jika benar, yang ifingin dilihat untuk mengevaluasi dengan benar.

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>: vnoremapberarti memetakan perintah berikut dalam mode visual, tetapi jangan memetakannya secara rekursif (artinya tidak mengubah perintah lain yang mungkin digunakan dengan cara lain). Pada dasarnya, jika Anda seorang pemula, selalu gunakan noremapuntuk memastikan Anda tidak merusak barang-barang. <silent>berarti "Saya tidak ingin kata-kata Anda, hanya tindakan Anda" dan mengatakan itu untuk tidak mencetak apa pun ke baris perintah. <C-r>adalah hal yang kami pemetaan, yaitu ctrl + r dalam hal ini (perhatikan bahwa Anda masih dapat menggunakan Cr secara normal untuk "redo" dalam mode normal dengan pemetaan ini). C-uagak membingungkan, tetapi pada dasarnya itu memastikan Anda tidak kehilangan jejak penyorotan visual Anda (menurut jawaban ini membuat perintah Anda mulai dengan '<,'>apa yang kita inginkan).calldi sini hanya memberitahu vim untuk menjalankan fungsi yang kita beri nama, dan <cr>mengacu pada menekan entertombol. Kita harus menekannya sekali untuk benar-benar memanggil fungsi (jika tidak kita baru saja mengetik call function()pada baris perintah, dan kita harus menekannya lagi untuk mendapatkan pengganti kita untuk pergi sepanjang jalan (tidak benar-benar yakin mengapa, tapi apa pun).

Bagaimanapun, semoga ini membantu. Ini akan mengambil apa pun yang disorot dengan v,, Vatau C-v, periksa apakah baris pertama dikomentari, jika ya, coba batalkan komentar pada semua baris yang disorot, dan jika tidak, tambahkan lapisan karakter komentar tambahan untuk setiap baris. Inilah perilaku yang saya inginkan; Saya tidak hanya ingin beralih apakah setiap baris di blok dikomentari atau tidak, jadi itu berfungsi dengan baik bagi saya setelah mengajukan beberapa pertanyaan pada subjek.

profilprofil
sumber
3

Anda dapat menggunakan vim-commentary oleh tpope ( https://github.com/tpope/vim-commentary ) Anda dapat menggunakannya sebagai berikut:

Masuk ke mode visual dengan menekan

'v'

Lalu tekan

'j' repeatedly or e.g 4j to select 4 row

Sekarang yang harus Anda lakukan dengan pemilihan adalah memasukkan kunci:

'gc'

Ini akan mengomentari semua pilihan, untuk membatalkan komentar kunci kunci:

'gc'
Kingsley Ijomah
sumber
3

Berikut adalah satu-kapal dasar berdasarkan C-vdiikuti oleh Imetode yang diuraikan di atas.

Perintah ini ( :Comment) menambahkan string yang dipilih ke awal setiap baris yang dipilih.

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

Tambahkan baris ini ke Anda .vimrcuntuk membuat perintah yang menerima argumen tunggal dan menempatkan argumen di awal setiap baris dalam pilihan saat ini.

Misalnya jika teks berikut dipilih:

1
2

dan Anda menjalankan ini :Comment //:, hasilnya adalah:

//1
//2
bgran
sumber
3

Dimulai dengan ide-ide dalam jawaban di sini, saya memulai fungsi komentar saya sendiri. Ini mengaktifkan dan menonaktifkan komentar. Itu dapat menangani hal-hal seperti //print('blue'); //this thing is bluedan hanya mengubah komentar pertama. Selain itu menambahkan komentar dan ruang tunggal di mana spasi pertama bukan dan tidak di awal baris. Secara tradisional itu tidak perlu menyalin spasi putih, tetapi menggunakan zoom (: h \ zs untuk bantuan) untuk menghindari pekerjaan ekstra ini, ketika mengomentari dan membuat indentasi baris. Semoga ini membantu beberapa minimalis di luar sana. Saran diterima.

" these lines are needed for ToggleComment()
autocmd FileType c,cpp,java      let b:comment_leader = '//'
autocmd FileType arduino         let b:comment_leader = '//'
autocmd FileType sh,ruby,python  let b:comment_leader = '#'
autocmd FileType zsh             let b:comment_leader = '#'
autocmd FileType conf,fstab      let b:comment_leader = '#'
autocmd FileType matlab,tex      let b:comment_leader = '%'
autocmd FileType vim             let b:comment_leader = '"'

" l:pos   --> cursor position
" l:space --> how many spaces we will use b:comment_leader + ' '

function! ToggleComment()
    if exists('b:comment_leader')
        let l:pos = col('.')
        let l:space = ( &ft =~ '\v(c|cpp|java|arduino)' ? '3' : '2' )
        if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
            let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ?  1 : 0 )
            execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
            let l:pos -= l:space
        else
            exec 'normal! 0i' .b:comment_leader .' '
            let l:pos += l:space
        endif
        call cursor(line("."), l:pos)
    else
        echo 'no comment leader found for filetype'
    end
endfunction

nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>
xnoremap <Leader>t :'<,'>call ToggleComment()<CR>
mikrofon
sumber
1
Saya telah membuat versi yang sedikit berbeda dari solusi Anda yang juga mengembalikan posisi kursor, saya ingin pendapat Anda tentang itu. pada github
SergioAraujo
Keren. Anda dapat mengedit posting saya dan menambahkan solusi Anda (karena kesamaan)!
mike
Ini telah berubah untuk menghindari backslashing c, cpp, java dan menggunakan pemisah lain dalam substitusi untuk menghindari E488. Juga perubahan spasi untuk java, cpp karena komentar memiliki tiga karakter, // plus spasi, ini dilakukan oleh l: space.
SergioAraujo
3

Saya menggunakan comments.vim dari Jasmeet Singh Anand (ditemukan di vim.org),

Ia bekerja dengan C, C ++, Java, PHP [2345], proc, CSS, HTML, htm, XML, XHTML, vim, vimrc, SQL, sh, ksh, csh, Perl, tex, fortran, ml, caml, ocaml, vhdl, haskel, dan file normal

Ini komentar dan tanda komentar pada file sumber yang berbeda dalam mode normal dan visual

Pemakaian:

  • CtrlCuntuk komentar satu baris
  • CtrlXuntuk mengomentari satu baris
  • ShiftVdan pilih beberapa baris, lalu CtrlCberi komentar pada beberapa baris yang dipilih
  • ShiftVdan pilih beberapa baris, lalu CtrlXhapus komentar pada beberapa baris yang dipilih
Ronan
sumber
3

Metode tercepat dan paling intuitif dari mereka semua adalah untuk memetakan ulang )komentar (berjalan-jalan , dan kemudian untuk walk-up-uncommenting. Cobalah dan Anda tidak akan kembali.

Di Ruby atau Bash , dengan indentasi 2-ruang:

map ) I# <Esc>j
map ( k^2x

Dalam C / C ++ atau PHP , dengan indentasi 4-ruang:

map ) I//  <Esc>j
map ( k^4x

Kekurangannya adalah Anda kalah (dan )untuk pergerakan kalimat (tetapi dasbisa mengisi di sana), dan Anda akan sesekali kembali memilih dan mengganti atau CtrlVuntuk menangani bagian yang panjang. Tapi itu cukup langka.

Dan untuk C-style, komentar panjang paling baik ditangani dengan:

set cindent
set formatoptions=tcqr

... Yang menggabungkan dengan baik dengan menggunakan V[move]gquntuk mengulangi pembungkus kata.

eukras
sumber
2

Cuplikan sederhana ini dari .vimrc saya:

function! CommentToggle()
    execute ':silent! s/\([^ ]\)/\/\/ \1/'
    execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
endfunction

map <F7> :call CommentToggle()<CR>

Ini untuk // - Komentar, tetapi Anda dapat menyesuaikannya dengan mudah untuk karakter lain. Anda bisa menggunakan autocmd untuk menetapkan pemimpin seperti yang disarankan jqno.

Ini adalah cara yang sangat sederhana dan efisien bekerja dengan rentang dan mode visual secara alami.

Phil
sumber
2

Saya suka /* ... */(komentar C ansi), jadi ini trik saya untuk Anda. Anda dapat menyesuaikannya untuk digunakan dalam kasus yang berbeda, tentu saja.


Komentar dengan / * ... * /

Pilih teks (pergi ke awal, mulai blok visual, lompat dengan }):

<c-V>}

Ketik perintah yang akan diterapkan dalam seleksi

:norm i/* <c-v><esc>$a */

Perintah akan terlihat seperti: :'<,'>norm i /* ^[$a */

Lihat (i *) untuk detailnya.


Batalkan komentar pada / * ... * /

Pilih teks (seperti sebelumnya, atau dengan cara lain yang Anda suka):

<c-V>}

Ketik perintah yang akan diterapkan dalam seleksi

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

Perintah akan terlihat seperti: :'<,'>norm :s-\s*/\*\s*-^M$bbld$

Lihat (ii *) untuk detailnya.


Hasil

Efeknya adalah komentar baris demi baris:

Comment block
Comment block
Comment block

Menjadi (dan sebaliknya):

/* Comment block */
/* Comment block */
/* Comment block */

Lebih baik menyimpannya sebagai beberapa mapatau @regdi Anda .vimrc, karena banyak untuk mengetik. Jika Anda lebih suka satu /*dan */seluruh blok, gunakan:

Komentar dengan satu / * * / seluruh blok

Simpan di register dengan merekam, katakan qc,, lalu, di awal paragraf untuk berkomentar:

v}di/*  */<esc>hhhp

dan jangan lupa qlagi, untuk menyelesaikan catatan.

Lihat (iii *) untuk detailnya.


Hapus komentar satu / * * / dari satu blok

Simpan dalam register, katakan @u,. Letakkan kursor Anda di mana saja di dalam blok, dan:

?/\*<enter>xx/\*/<enter>xx

Simpan register dengan menyelesaikan qperintah.

Lihat (iv *) untuk detailnya.


Hasil

Efek adalah komentar tunggal untuk banyak baris:

Comment block
Comment block
Comment block

Menjadi (dan sebaliknya):

/* Comment block
Comment block
Comment block */

Penjelasan

(i *) Ini bekerja dengan menggunakan normyang menerapkan perintah yang sama berulang kali di setiap baris yang dipilih. Perintah cukup memasukkan a /*, menemukan ujung garis itu dan selesai dengan memasukkan a*/

:norm i/* <c-v><esc>$a */

(ii *) Ini juga digunakan normuntuk mengulang pencarian / ganti pada setiap baris. Cari spaces /* spacesdan ganti tanpa apa-apa. Setelah itu, temukan ujung kalimat, kembalikan dua kata, kanan huruf, hapus sampai akhir.

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

(iii *) Memilih paragraf dengan v}, menghapusnya, menyisipkan komentar membuka dan menutup, pindah ke tengah dan tempel blok yang dihapus.

v}di/*  */<esc>hhhp

(iv *) Di mana saja di tengah, temukan mundur a /*, hapus; menemukan maju */, menghapusnya.

?/\*<enter>xx/\*/<enter>xx
Dr Beco
sumber