Pertanyaan Apa cara cepat untuk mengomentari / menghapus tanda komentar di Vim?


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

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 semua baris di awal def ... end bagian. Apa cara yang efisien untuk melakukannya di Vim?

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


835
2017-11-04 21:06


asal


Jawaban:


Saya menggunakan Naskah NERD Commenter. Ini memungkinkan Anda mengomentari, menghapus komentar, atau mengaktifkan komentar dengan mudah di kode Anda.

Seperti yang disebutkan di komentar:

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


155
2017-11-04 21:33



Untuk tugas-tugas yang saya gunakan sebagian besar waktu seleksi blok.

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

Untuk komentar blok teks hampir sama:

  1. Pertama, pergi ke baris pertama yang ingin Anda komentari, tekan CtrlV. Ini akan menempatkan editor di VISUAL BLOCK mode.
  2. Kemudian gunakan tombol panah dan pilih hingga baris terakhir
  3. Sekarang tekan Bergesersaya, yang akan menempatkan editor INSERT mode lalu tekan #. Ini akan menambahkan hash ke baris pertama.
  4. Lalu tekan ESC (berikan sebentar), dan itu akan memasukkan a # karakter pada semua garis terpilih lainnya.

Untuk versi stripped-down dari vim dikirim dengan debian / ubuntu secara default, ketik : s/^/# pada langkah ketiga sebagai gantinya.


1734
2017-11-04 21:16



Untuk mengomentari blok di vim:

  • tekan ESC (untuk meninggalkan editing atau mode lainnya)
  • memukul ctrl+v (mode blok visual)
  • gunakan tombol panah atas / bawah untuk memilih garis yang Anda inginkan (itu tidak akan menyorot semuanya - tidak apa-apa!)
  • Bergeser+saya (modal saya)
  • masukkan teks yang Anda inginkan, mis. %
  • tekan ESCESC

Untuk menghapus blok komentar di vim:

  • tekan ESC (untuk meninggalkan editing atau mode lainnya)
  • memukul ctrl+v (mode blok visual)
  • menggunakan / tombol panah untuk memilih garis ke tanda komentar.

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

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

  • tekan d atau x untuk menghapus karakter, berulang kali jika perlu

671
2018-03-23 15:54



Kadang-kadang saya dikupas ke kotak remote di mana plugin saya dan .vimrc tidak dapat membantu saya, atau kadang-kadang NerdCommenter salah (mis. JavaScript tertanam di dalam html).

Dalam kasus ini alternatif berteknologi rendah adalah built-in norm perintah, yang hanya menjalankan perintah vim sewenang-wenang di setiap baris dalam rentang yang ditentukan. Sebagai contoh:

Berkomentar dengan  #:

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

Ini menyisipkan "#" di awal setiap baris. Perhatikan bahwa ketika Anda mengetik: rentang akan diisi, sehingga akan benar-benar terlihat seperti :'<,'>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 melakukannya :norm xx untuk menghapus kedua karakter.

Jika komentar di-indentasi seperti pada pertanyaan OP, maka Anda dapat mengaitkan penghapusan Anda seperti ini:

:norm ^x

yang berarti "pergi ke karakter non-ruang pertama, lalu hapus satu karakter".

Catatan: Sejak norm secara harfiah hanya mengeksekusi perintah vim biasa, Anda tidak terbatas hanya pada komentar, Anda dapat melakukan beberapa pengeditan rumit untuk setiap baris. Jika Anda membutuhkan karakter escape sebagai bagian dari urutan perintah Anda, ketik ctrl-v lalu tekan tombol escape.

Catatan 2: Anda tentu saja dapat menambahkan pemetaan jika Anda menggunakannya norm banyak. Misalnya menempatkan baris berikut di ~ / .vimrc memungkinkan Anda mengetik ctrl-n dari pada :norm setelah membuat seleksi visual Anda

vnoremap <C-n> :norm

Catatan 3: Vim Bare-bones terkadang tidak memiliki norm perintah 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 dimasukkan ke dalam jawaban ini)


210
2018-04-14 14:44



Saya memiliki yang berikut di saya .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 bisa mengetik ,cc untuk memberi komentar pada baris dan ,cu uncomment a line (berfungsi baik dalam mode normal maupun visual).

(Saya mencurinya dari beberapa situs web beberapa tahun yang lalu, jadi saya tidak bisa sepenuhnya menjelaskan cara kerjanya :). Ada sebuah komentar di mana dijelaskan.)


102
2017-11-04 21:14



Tentukan garis mana untuk berkomentar di vim:

Ungkapkan nomor baris:

:set number

kemudian

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

atau ini:

:%s/^/#/        will comment out all lines in file

82
2017-11-05 18:07



Di sini adalah bagaimana saya melakukannya:

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

  2. Memukul Ctrl+q di GVIM atau Ctrl+v di VIM, lalu turun untuk memilih karakter pertama di baris untuk berkomentar.

  3. Lalu tekan c, dan tambahkan karakter komentar.

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


47
2017-11-04 21:13



Saya telah datang dengan tambahan sederhana untuk file .vimrc saya yang bekerja dengan 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 ulang ke 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 hook ke jenis file / loading, karena saya menemukan mereka memperlambat startup Vim lebih dari .vimrc fungsi statis / peta tidak tetapi itu hanya preferensi saya. Saya juga mencoba membuatnya sederhana dan tampil baik. Jika Anda menggunakan autocommands Anda harus memastikan untuk menempatkannya dalam grup autocommand atau yang lain callback ditambahkan ke filetype beberapa kali per-file dimuat dan menyebabkan banyak penurunan kinerja.


28
2018-06-04 20:24



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


22
2017-11-04 21:11