Vim'deki yorum / yorum satırlarının hızlı bir yolu nedir?


1168

Vi bir açık Ruby kod dosyası var, satırları ile yorum var #:

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

Diyelim ki ilk def ... endbölümdeki tüm satırları açmak istiyorum . Vim'de bunu yapmanın etkili bir yolu nedir?

Genel olarak, yorum ve yorum satırları için kolay ve akıcı bir yol arıyorum. Burada Ruby koduyla uğraşıyorum, ancak JavaScript ( //) veya Haml ( -#) olabilir.


20
Kabul edilen cevap, bir eklenti kullanmadan yorumlama / yorumlama bloklarının nasıl gerçekleştirileceği hakkında ayrıntılı talimatlara sahip cevaplardan biriyle değiştirilmelidir. Bugün için kabul cevap temelde bir üçüncü taraf eklenti için sadece bir bağlantıdır.
faintsignal

En iyi oylanan cevap herhangi bir eklentiden bahsetmez, @rationalis yorumunuz yanıltıcıdır, lütfen düzeltin ya da kaldırın, teşekkür ederim.
bonobo

Yanıtlar:


180

Kullandığım inek Commenter komut . Kodunuzdaki yorumları kolayca yorumlamanızı, açmanızı veya değiştirmenizi sağlar.

Yorumlarda belirtildiği gibi :

kullanımı karışan herkes için varsayılan lider "\" dir, bu yüzden 10 \ cc on satır yorumlayacak ve 10 \ cu bu on satırın açıklamasını kaldıracaktır


İlginç! Ben Doc okuyun ve bir "seksi yorum" olduğunu bulmak - sadece "\ cs" kullanın. Ruby için, karma etiketleri yerine birden çok satırı yorumlamak için =beginve =endöğelerini kullanır.
Hegwin

Bir eklenti yüklemeyi gerektirdiğinden, vim ile yapmanın en hızlı yolu olmadığını düşünüyorum. Ayrıca en iyi cevap zaten daha fazla oy aldı, ancak çözüm olarak işaretlenmedi.
whirmill

136
Burada durma. En çok oy verilen cevaplar herhangi bir eklenti gerektirmeden aşağıdadır. stackoverflow.com/a/15588798/2117868 ve stackoverflow.com/a/1676690/2117868
kuttumiah

@whirmill Bence "en iyi" gerçekten kullanım durumuna bağlıdır. Yorumları hayatımda bir kez değiştirmek istersem görsel blok modu daha hızlıdır. Ancak bir eklenti yüklemeyi umursamadığımda ve yorumları değiştirmek için mümkün olduğunca az tuş vuruşu yapmak ve yorum eklemek veya kaldırmak arasında işlemi ayırt etmek zorunda kalmazsam - o zaman bu "en iyi cevap" olabilir.
Carolus

@Carolus Sorunun, "hızlı yol nedir" yerine "en iyi yol nedir" ile başlasaydı sizinle anlaşmış olurdum.
kasırga

2541

Bu görevler için çoğu zaman bloğu seçimini kullanıyorum .

İmlecinizi ilk #karakterin üzerine getirin, CtrlV(veya CtrlQgVim için) tuşuna basın ve en son yorum yapılan satıra kadar aşağı inin ve tuşuna basın x, tüm #karakterler dikey olarak silinir .

Bir metin bloğunu yorumlamak neredeyse aynıdır:

  1. İlk olarak, yorum yapmak istediğiniz ilk satıra gidin, tuşuna basın CtrlV. Bu, editörü VISUAL BLOCKmoda sokacaktır.
  2. Ardından ok tuşunu kullanarak son satıra kadar seçin
  3. Şimdi ShiftI, editörü INSERTmoda geçirecek olan düğmesine basın ve ardından düğmesine basın #. Bu, ilk satıra bir karma ekleyecektir.
  4. Sonra tuşuna basın Esc(bir saniye verin) ve #seçilen diğer tüm satırlara bir karakter ekleyecektir .

Varsayılan olarak debian / ubuntu ile birlikte gelen vim'in soyulmuş sürümü : s/^/#için, üçüncü adımı yazın (her satırın ilk karakterinin kalan vurgusu ile kaldırılabilir :nohl).

Görsel referans için iki küçük ekran kaydı.

Yorum Yap: Yorum Yap

uncomment: uncomment


87
Varsayılan olarak CTRL + V'dir. Gvim'in windows sürümü Ctrl + Q kullanır çünkü Ctrl + V zaten yapıştırmak için kullanılır.
R. Martinho Fernandes

8
@amindfv Ctrl + V, n(burada n sayı satırları - 1'dir), j, n(burada n yorum karakteri dizisi uzunluğu sayısı - 1), l, x.
michael.bartnett

27
Bunu '//' ile nasıl yaparsın?
Ocak'ta AustinT

74
O saniyeyi beklememek için Esc'i iki kez tıklayabilirsiniz;)
Ahmed Hegazy

44
Bu benim için işe yaramadı. Shift-I basit ekleme moduna geçti.
Geremia

826

Vim'deki blokları yorumlamak için:

  • Esc(düzenleme veya diğer modlardan çıkmak için) tuşuna basın
  • hit ctrl+ v(görsel blok modu)
  • İstediğiniz satırları seçmek için / ok tuşlarını kullanın (her şeyi vurgulamaz - sorun değil!)
  • Shift+ i(başkent I)
  • istediğiniz metni girin, örn. %
  • basın EscEsc

Vim'deki blokları açmak için:

  • Esc(düzenleme veya diğer modlardan çıkmak için) tuşuna basın
  • hit ctrl+ v(görsel blok modu)
  • önerilecek satırları seçmek için / ok tuşlarını kullanın.

    Birden fazla karakter seçmek istiyorsanız, birini kullanın veya şu yöntemleri birleştirin:

    • daha fazla metin seçmek için sol / sağ ok tuşlarını kullanın
    • metin parçalarını seçmek için shift+ / ok tuşunu kullanın
    • normal silme düğmesi gibi aşağıdaki silme tuşlarına tekrar tekrar basabilirsiniz

  • gerekirse karakterleri silmek için dveya tuşuna basınx

34
@amelia: Yorum kısayolu benim için çalışmıyor. Shift + i beni ekleme moduna götürüyor. Vim versiyonuna bağlı mı?
user3527975

7
Neden bir saniye sürüyor?
Conor Patrick

24
Bu yanıta sahip olduğum tek sorun, ok tuşlarını kullanmanızı söylemesi .
cozyconemotel

6
Bunun yerine Esc tuşuna iki kez basın. :)
Aaron Alphonsus

21
İlk başta yorumları etkinleştirmek benim için işe yaramadı ama okuduktan sonra bir kez daha iyi çalıştı: 1. seçim için V değil Ctrl-V kullandığınızdan emin olun 2. eklerken sadece tek bir satırı değiştirdiğinizde görünecektir 3. tüm ekler sonunda Esc tuşuna bastığınızda olur
timurb

333

Bazen eklentilerimin ve .vimrc'nin bana yardımcı olamayacağı uzak bir kutuya kabuklandım veya bazen NerdCommenter yanlış anlıyor (örn. HTML içine gömülü JavaScript).

Bu durumlarda, düşük normaralıklı bir alternatif, belirtilen aralıktaki her satırda rastgele vim komutları çalıştıran yerleşik komuttur. Örneğin:

Şununla yorum # :

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

Bu, her satırın başına "#" ekler. Yazdığınızda: aralığın doldurulacağını unutmayın, bu yüzden gerçekten:'<,'>norm i#

Uncommenting # :

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

Bu, her satırın ilk karakterini siler. // gibi 2 karakterlik bir yorum :norm xxkullansaydım, her iki karakteri de silmek isterdim .

Yorumlar OP sorusundaki gibi girintiliyse, silme işleminizi şu şekilde sabitleyebilirsiniz:

:norm ^x

yani "ilk boşluk olmayan karaktere git, sonra bir karakteri sil". Blok seçiminden farklı olarak, bu tekniğin yorumlarda eşit olmayan girinti olsa bile çalışır!

Not : normKelimenin tam anlamıyla sadece normal vim komutlarını yürüttüğünden, yalnızca yorumlarla sınırlı değilsiniz, ayrıca her satıra bazı karmaşık düzenlemeler de yapabilirsiniz. Komut dizinizin bir parçası olarak kaçış karakterine ihtiyacınız varsa, ctrl-v yazın ve sonra kaçış tuşuna basın (veya daha da kolay, hızlı bir makro kaydedin ve ardından her makroda bu makroyu yürütmek için normu kullanın).

Not 2 : Kendinizi normçok fazla kullanırsanız elbette bir eşleme de ekleyebilirsiniz . Örneğin, ~ / .vimrc içine aşağıdaki satırı koymak, görsel seçiminizi yaptıktan sonra yazmak ctrl-nyerine yazmanıza izin verir:norm

vnoremap <C-n> :norm

Not 3 : Bare-bones vim'de bazen normderlenmiş komut bulunmaz , bu nedenle bilenmiş sürümü kullandığınızdan emin olun, yani tipik olarak / usr / bin / vim, / bin / vi değil

(Bu yanıta dahil edilen iyileştirmeler için @Manbroski ve @rakslice'a teşekkürler)


Ben bu cevabı okumak için kaydırıncaya kadar gitmek için bir yol olduğunu düşündüm stackoverflow.com/a/1676690/850996 CTRL + V (SHIFT + V ile satır seçiminin aksine) kullanarak blok seçimi yorum üzerinde çok daha güzel kontrol sağlar karakter ekleme işlemi gerçekleşir.
Shyam Habarakada

2
@Shyam ctrl-v tekniği, yalnızca blok seçimi için özel komutlarla birlikte diğer cevapların çoğunun önerdiği şeydir; ancak şahsen daha kolay olduğunu açıkladığım "norm" tekniğini buluyorum çünkü norm komutunun yanında yeni bir sözdizimi getirmiyor, bu yüzden vim hakkında bildiklerimi tekrar kullanabiliyorum.
Magnus

2
Girintili bir bloğu açığa çıkarmak için söylemek yararlıdır :norm ^x. Bu yöntem genel olarak bölge seçimleriyle çalışma avantajına sahiptir (örneğin vi{kıvırcık parantezlerin içinde seçim yapacaktır). Bu tür metin nesne seçicileri ile çalışmaz Visual Block.
ivan-k

1
Ah, sadece anladım - centos 6'da /bin/vivim 7.2, ama bundan farklı bir yapı /usr/bin/vimve bunun gibi özelliklere sahip.
rakslice

3
Bu açık ara en iyi cevap. Özellikle vipbir paragraf seçmek için ile birleştirildiğinde .
meh

121

Bende aşağıdakiler var .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>

Artık ,ccbir satırı yorumlamak ve bir satırı kaldırmak için yazabilirsiniz ,cu(hem normal hem de görsel modda çalışır).

(Yıllar önce bir web sitesinden çaldım, bu yüzden artık nasıl çalıştığını tamamen açıklayamam :). Açıklandığı yerde bir yorum var .)


kullanmam gereken kısayol nedir? Ben vim kod kendisinden emin olamaz!
gideon

normal veya görsel modda, geçerli satırı yorumlamak için ", cc" (3 karakter sırası) ve geçerli satırı yorumlamak için ", cu" kullanın.
Dan

8
bunu sevdim :)! Teşekkürler! Bir yan not açıklamak zor bulamıyorum. a) bir komutu yeniden eşleştirir (özyinelemesiz [buna bakın] ( stackoverflow.com/questions/3776117/… ), bu yüzden şimdi tuşuna bastığınızda, cc: ... şey yürütülür. b) şimdi bu temelde bir sed (s) / what / towhat / where) komutunu ^ (satır başlangıcı) açmış olduğunuz dosya türüne göre doğru ayarlanmış yorum karakterine değiştirerek c) komutlardan çıktılarını bastırdıkları sessiz şeyler için olduğu gibi. d): nohlsearch, sed aramasını vurgulamasını durdurur
ramrunner

14
Bu, otomatik komutları yüklemek için doğru yol değildir. Bir grubun içinde olmalılar, yoksa vim'e birden çok kez eklenecek ve çok yavaşlamaya neden olacaklar. Bkz . Learnvimscriptthehardway.stevelosh.com/chapters/14.html . Bu soruya cevabımı ekledim.

Güzel. Bu, bir blok seçiminiz olduğunda nasıl yorum yapılacağına dair soruya verilen gerçek bir cevaptır.
Erwin Rooijakkers

119

Vim'de yorum yapılacak satırları belirtin:

Satır numaralarını göster:

:set number

sonra

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

veya bu:

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

11
Her satırın ilk karakterini değiştirdiğiniz için, sonunda "g" ye ihtiyacınız yok
Magnus

1
Gömülü kutulardaki bazı vimler (openwrt gibi) görsel moda sahip değil ... Yani bu harika bir şey :)
kim0

neden :%s/^/#/gtüm satırları yorumlayacağını açıklayabilir misin ? Yüzde işaretini merak ediyordum%
Bin

18
Ve bu satırları açmak için şunu yazabilirsiniz: 5,17s / ^ # /
Iraklis Moutidis

Harika! Gerçekten gibi blok seçimi ile güzel çalışır: va{veya varyakut için.
Artur Małecki

58

İşte nasıl yaparım:

  1. Yorum yapmak istediğiniz ilk satırdaki ilk karaktere gidin.

  2. Hit Ctrl+ qGVIM veya Ctrl+ vVIM, sonra dışarı yorum yapmak hatlarda ilk karakteri seçmek için aşağı gidin.

  3. Sonra tuşuna basın cve yorum karakterini ekleyin.

Uncommenting aynı şekilde çalışır, yorum karakteri yerine bir boşluk yazmanız yeterlidir.


44
cilk karakteri de siler. CMS'nin cevabı doğru, yani tuşuna basıp Iyorum karakterlerini yazıp Esc(bu windows
vim'de

6
Bu çalışma, 'r' hariç, üçüncü adımda 'c' değil, basılmalıdır.
David Baucum

alternatif olarak, bastıktan ESCsonra iki kez basabilirsiniz cve bu hile yapmalıdır
nihiser

Tüm bu seçenekler satırdaki ilk karakterin tahrip edicidir.
Josiah

36

Oldukça iyi çalışan ve kolayca genişletilebilen benim .vimrc dosyama basit bir ek ile geldim. Comment_map ve yorum liderine yeni bir dosya türü eklersiniz.

Normal ve görsel modlara bir eşleme ekledim, ancak istediğiniz her şeyi yeniden eşleştirebilirsiniz. Sadece 'geçiş' tarzı bir fonksiyona sahip olmayı tercih ederim. Bir ayı birden fazla eşleme vb.

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>

Not:

Dosya türlerine / yüklemeye herhangi bir geri arama veya kanca kullanmıyorum, çünkü Vim'in başlangıcını .vimrcstatik fonksiyon / haritadan daha yavaşlattılar , ancak bu benim tercihim. Ben de basit ve performanslı olmaya çalıştım. Otomatik komutları kullanırsanız, bunları bir otomatik komut grubuna koyduğunuzdan emin olmanız gerekir; aksi takdirde geri çağrılar, dosya başına yüklenen dosya başına birden çok kez eklenir ve çok fazla performans düşüşüne neden olur.


1
Vim'de tamamen yeniyim, eşlenen işlevi değiştirmek için hangi düğmeye basmalıyım? <leader><Space>En alttaki bu deklarasyon nedir ?
Jens Kohl

2
<Lider> yerine <,> gibi bir anahtar kullanabilirsiniz. Ardından, SPACE tuşuna bastığınızda satırın yorum durumu arasında geçiş yapılır. Lider, lideriniz ne olursa olsun, Vim'in varsayılan <leader> \ 'dır, ancak kendinizinkini "let mapleader =', '" gibi ayarlayabilirsiniz

Büyük cevap, bir sıkıntı olsa da, zaten bazı yorumları olan blokları yorumlamak, yorum yapılmamış satırlar için yorumda bulunacak. Örneğin, QtCreator yalnızca boş olmayan satırların başında yorum varsa yorum kaldırır, aksi takdirde önde gelen bir yorum ekleyin.
ideasman42

1
Ben kullanarak biraz farklı bir sürüm yaptım \zsve \zeregex hile, kod biraz daha küçük oldu. burada
SergioAraujo

33

Yorumları aç / kapat

İhtiyacınız olan tek şey yorumları değiştirmekse , tpope ile yorumu yorumlamayı tercih ederim .

resim açıklamasını buraya girin

Kurulum

patojen:

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

VIM-plug:

Plug 'tpope/vim-commentary'

Vundle:

Plugin 'tpope/vim-commentary'

Daha fazla özelleştirme

Bunu .vimrc dosyanıza ekleyin: noremap <leader>/ :Commentary<cr>

Artık Sublime ve Atom gibi Leader+ tuşlarına basarak yorumları değiştirebilirsiniz /.


Teşekkürler! gelecekte bir html içinde yorum css destekleyecek mi?
Dan Oak

25

Metin dikdörtgenlerini seçmek için Ctrl-V tuşunu kullanın: ilk #karaktere gidin , Ctrl+ yazın V, bir kez sağa gitme ve sonra aşağı, yorumların sonuna kadar. Şimdi şunu yazın x: Tüm #karakterleri ve ardından bir boşluk sildiğiniz .


18

İşte benim bir bölümü .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>

Normal ve görsel modda bu, ,icyorum eklemek ve ,rcyorumları kaldırmak için basmamı sağlar.


Bu yeni başlayanlar için kendi yazmayı öğrenmeleri için çok yararlıdır .vimrc.
44'te havalı

3
mapnormal ve görsel modları kapsar, bu yüzden vmaphatlara ihtiyacınız yoktur
doubleDown

Daha iyi bir yer var after/ftplugin/ruby.vim.
Santosh Kumar

ayrıca kullanın <leader>icve<leader>rc
Hans Kristian

15

7.4 vim kullanıyorum ve bu benim için çalışıyor.
3 satır yorum / uncommenting varsayalım.

Yorum yapmak:

satırın başında sekme / boşluk yoksa:
ctrl + Vo jjjzamanshift + I (cappital i) sonra// o esc esc
hat tırnağı / boşluk varsa, üstünde veya takas için yapabileceği hala başlayan c:
ctrl + Vo zaman jjjo cdaha sonra //oesc esc

yorumsuz için:

satırların başında sekme / boşluk yoksa:
ctrl + Vo jjjzaman ll (lower cap L)sonrac

satırların başında sekme / boşluk varsa, bir boşluk bırakıp esc
ctrl + V bırakıpjjj o ll (lower cap L)daha sonra co spacesonraesc



9

Önümdeki 30 cevapla, daha kolay bir çözüm vermeye çalışacağım: #Satırın başına a ekleyin . Sonra bir satır aşağı gidin ve nokta ( .) tuşuna basın . Tekrarı için, do j, ., j, ., vb ... yorumsuz için, kaldırmak #(eğer vurabilir xüzerinde #) ve ters kullanarak yapmak k, .vb ...


1
Yeni başlayanların bile anlayabileceği ve kullanabileceği çok basit bir cevap. Bununla birlikte, yorum yapmak için büyük miktarlarda satırlarda oldukça yavaş çalışır. Bu sorunu I#<Esc>jgidermek için ara belleğe yazabilirsiniz - diyelim ki c- ve sonra yapın 10@cya da size uygun sayıda satır.
Daerdemandt

9

Vi'de aşağıdaki üç satırı nasıl açabilirim:

#code code
#code
#code code code

İmleci sol üst #sembolün üzerine getirin ve tuşuna basın CtrlV. Bu sizi görsel blok moduna geçirir. JÜç çizginin tümünü seçmek için aşağı oka veya üç kez basın . Sonra tuşuna basın D. Tüm yorumlar kaybolur. Geri almak için tuşuna basın U.

Vi'de aşağıdaki üç satır nasıl yorumlanır:

code code
code
code code code

İmleci sol üst karakterin üzerine getirin, tuşuna basın CtrlV. Bu sizi görsel blok moduna geçirir. Üç satırı da seçmek için veya tuşuna Jüç kez basın . Sonra tuşuna basın:

I//Esc

Bu bir başkent I, // ve Escape.

Tuşuna bastığınızda ESC, seçilen tüm satırlar belirttiğiniz yorum sembolünü alır.


1
"sol üst" karmayı kaçırırsanız, imleci görsel modda "diğer tarafa" hareket ettirmek için o tuşuna basabilirsiniz .
dylnmc

Bunun en iyisi olduğunu düşünüyorum. Üçüncü taraflara gerek yok, sadece yerli vim kullanın
Ardi Nusawan

en iyi cevap, basit ve herhangi bir üçüncü taraf olmadan
aze

8

Evet, bu soruya zaten 33 (çoğunlukla tekrarlayan) cevap var.

İşte Vim'deki çizgilerin nasıl yorumlanacağına dair başka bir yaklaşım: hareketler . Temel fikir, yip2 satır yazarak veya silerek bir paragraf sormakla aynı yöntemi kullanarak satırları yorumlamak veya yorumunu kaldırmaktır.dj .

Bu yaklaşım aşağıdakileri yapmanıza izin verecektir:

  • ccjsonraki 2 satırın yorumunu yapmak ve cukonları kaldırmak;

  • cci{bir bloğu yorumlamak ve cui{onu engellemek için;

  • ccipbir paragrafın tamamını yorumlamak ve cuiponu kaldırmak.

  • ccGher şeyi son satıra kadar yorumlamak ve cuggher şeyi ilk satıra kadar kaldırmak.

Tek ihtiyacınız olan , hareketler üzerinde çalışan 2 işlev ve her işlev için 2 eşlemedir. İlk olarak, eşlemeler:

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>

( g@Operatör ve operatorfuncdeğişken hakkındaki kılavuza bakın .)

Ve şimdi fonksiyonlar:

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

Yukarıdaki düzenli ifadeleri, #olması gereken yere göre zevkinize uyacak şekilde değiştirin:


"tamamen yeni [...] hareketler" biraz üstte görünüyor: Her ikisi de bu cevabın önündeki t_comment ve vim-commuler eklentileri, hareketleri kullanarak yorum yapmanıza izin veriyor.
Zengin

İyi şeyler! Upvoted. (Ayrıca daha önce kullandığım eklenti yerine bu yaklaşımı kullanmaya başlayabileceğimi düşünüyorum, bu yüzden yazdığınız için teşekkürler!)
Zengin

7

Satır numaralarını zaten biliyorsanız, n,ms/# //işe yarayacaktır.


gerçekten bu muhtemelen şöyle olmalıdır: n, ms / ^ \ s. # // Çünkü önde gelen beyaz alana sahip olabilirsiniz ve hash'ı biriyle takip etmeyebilirsiniz
Skip Huffman

7

İlk ve son satırları (ma ve mb) işaretlerim ve sonra şunu yaparım: 'a,' bs / ^ # //


6

Kullandığım EnhancedCommentify . İhtiyacım olan her şeyi yorumlar (programlama dilleri, komut dosyaları, yapılandırma dosyaları). Görsel mod bağlamaları ile kullanıyorum. Yorum yapmak istediğiniz metni seçin ve co / cc / cd tuşuna basın.

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

5

Phil ve jqno'nun cevabını birleştirdim ve boşluklarla untoggle yorumları yaptım:

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>

5

tpopeDenilen bu hayat değiştiren eklenti varvim-commentary

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

Bu eklenti şunları sağlar :

  • Akıl sağlığı
  • Girintili yorumlar
  • Boş / gereksiz satırları yorumlamaz

Kullanımı :

  • Vundle (veya sanırım Patojen) ile kurun.
  • Metninizi vurgulayın ve simgesine basın :.:<,'>
  • Buraya Yorum yazın :<,'>Commentaryve tuşuna basın Enter.
  • Boom. Yaptığın tomurcuk.

vim-commentary(tüm tpope eklentileri gibi) deyimsel vim olma bonusu vardır. gc= "yorum yaz", gcap= "paragraf yaz yorum", vb.
goldenratio

Bu, Jim Stewart'ın Tim Pope cevabının bir düzenlemesi olabilir mi?
jdk1.0

5

Bu cevap, eklentileri yükleyemiyorsanız ancak yorum karakterlerinizin mevcut girinti düzeylerini takip etmesini istiyorsanız en yararlıdır.

Bu cevap bir yapıştırmak için doğru kodu göstermek burada 1'e) 'dir .vimrcalmak için vim 7.4+açıklamak için 1 görsel modunda kısayol ve 2) ile girinti düzeyini korurken uncommenting / yorumlama bloğunu yapmak. İşte kod:

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>

Nasıl çalışır:

  • let b:commentChar='//': Bu vim'de bir değişken oluşturur. bburada, bu durumda, şu anda açılmış bir dosyayı, yani tampon içerdiği kapsamı, ifade eder. Yorum karakterleriniz dizelerdir ve tırnak işaretleri içine alınmalıdır; tırnak işaretleri, yorumlar arasında geçiş yapılırken değiştirilecek öğenin bir parçası değildir.

  • autocmd BufNewFile,BufReadPost *...: Otomatik komutlar farklı şeyleri tetikler, bu durumda bunlar yeni bir dosya veya okuma dosyası belirli bir uzantıyla sona erdiğinde tetiklenir. Tetiklendiğinde, commentChardosya türüne bağlı olarak değiştirmemizi sağlayan aşağıdaki komutu yürütün . Bunu yapmanın başka yolları da var, ama acemiler için daha kafa karıştırıcılar (benim gibi).

  • function! Docomment(): Fonksiyonlar ile başlayan tarafından ilan edilir functionve ile biten endfunction. İşlevler büyük harfle başlamalıdır. !Bu fonksiyon olarak tanımlanan önceki işlevleri üzerine yazar olmasını sağlar Docomment()bu sürümü ile Docomment(). Olmadan, !hatalar vardı, ama bunun nedeni vim komut satırı üzerinden yeni işlevler tanımlamak olabilir.

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e': Execute komutu çağırır. Bu durumda, tüm tampon veya vurgulanan bölüm substitutegibi bir aralık alabilen (varsayılan olarak bu geçerli satırdır) yürütüyoruz . bir satırın başlangıcına ve ardından herhangi bir miktarda boşlukla eşleşecek şekilde regex olur (bu satırdan sonra (eklenir ). Beri burada, dize birleştirme için kullanılan kutu tırnak sarılmış edilemez. bağımsız değişkenlerle eşleşen karakterden (bu örnekte ve ) a ile başlayarak kaçmanıza olanak tanır . Bundan sonra, tekrar%'<,'>^\s*&.escape()escape()commentChar\/\substitute .ebayrağı. Bu bayrak sessizce başarısız olmamıza izin verir, yani belirli bir hatta bir eşleşme bulamazsak, bağırmayacağız. Bir bütün olarak, bu satır bir yorum karakteri ve ardından ilk metinden hemen önce boşluk bırakmamızı sağlar, yani girinti seviyemizi koruruz.

  • execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e': Bu bizim son muazzam uzun emrimize benziyor. Bu benzersiz \volan, bizim (), kaçmak zorunda kalmamızı 1sağlayan ve bizim ile yaptığımız grubu ifade eden var (). Temel olarak, herhangi bir miktarda boşlukla başlayan bir çizgiyi ve ardından yorum karakterimizi ve ardından herhangi bir boşluk alanını eşleştiriyoruz ve yalnızca ilk boşluk kümesini koruyoruz. Yine, ebu satırda bir yorum karakteri yoksa sessizce başarısız olalım.

  • let l:line=getpos("'<")[1]: Bu, yorum karakterimizde yaptığımız gibi bir değişkeni ayarlar, ancak lyerel kapsamı ifade eder (bu işleve yerel). getpos()bu durumda vurgulamanın başlangıcını [1]ve sütun numarası gibi diğer şeyleri değil, yalnızca satır numarasını önemsediğimiz anlamına gelir.

  • if match(getline(l:line), '^\s*'.b:commentChar)>-1: nasıl ifçalıştığını biliyorsun . match()ilk şeyin ikinci şeyi içerip içermediğini kontrol eder, bu yüzden vurgulamaya başladığımız satırı yakalarız ve boşlukla başlayıp yorum karakterimizle başlayıp başlamadığını kontrol ederiz. match()bunun doğru olduğu ve -1eşleşme bulunmayan dizini döndürür . Yana ifdeğerlendirir tüm sıfırdan farklı sayılar gerçek olamayacak kadar, bunun daha -1 büyük olup olmadığını görmek için bizim çıkış karşılaştırmak gerekir. Karşılaştırma vimnedir getiri 0 yanlış ancak ve 1 doğruysa, ifdoğru değerlendirmek görmek istiyor.

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>: vnoremapaşağıdaki komutu görsel modda eşleme anlamına gelir, ancak yinelemeli olarak eşleme (yani başka şekillerde kullanabilecek diğer komutları değiştirmez). Temel olarak, bir vim acemi iseniz, her zaman bir noremapşeyleri kırmadığınızdan emin olmak için kullanın . <silent>"Kelimelerinizi istemiyorum, sadece eylemleriniz" anlamına gelir ve komut satırına hiçbir şey yazdırmamasını söyler. <C-r>eşleme yaptığımız şeydir, bu durumda ctrl + r (bu durumda normal modda "yeniden yapmak" için normalde Cr'i kullanabileceğinizi unutmayın). C-ubiraz kafa karıştırıcıdır, ancak temel olarak görsel vurgulamanın izini kaybetmemenizi sağlar ( bu cevaba komutunuzu istediğimiz şeyle başlatır ). göre düğmeye basmak anlamına gelir .'<,'>call burada , vim'e adlandırdığımız işlevi yürütmesini söyler ve<cr>entercall function() komut satırına ve yerine geçmek için yerine basmamız gerekiyor (neden olduğundan emin değilim, ama her neyse).

Her neyse, umarım bu yardımcı olur. Bu vurgulanan şey alacak v, Vya da C-v, ilk satır yorumladı check eğer, evet eğer, tüm vurgulanan satırları uncomment çalışın ve eğer, her bir satırın açıklama karakterlerin bir kat daha ekleyin. İstediğim davranış bu; Sadece bloktaki her satırın yorumlanıp yorumlanmadığını değiştirmek istemedim, bu yüzden konu hakkında birden fazla soru sorduktan sonra benim için mükemmel çalışıyor .



3

Vim-yorumu tpope ile kullanabilirsiniz ( https://github.com/tpope/vim-commentary ) aşağıdaki gibi kullanabilirsiniz:

Tuşuna basarak görsel moda girin

'v'

Ardından

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

Şimdi seçim ile tek yapmanız gereken enter tuşlar:

'gc'

Bu, tüm seçimi dışarıda bırakacak repead anahtarlarına yorum yapacaktır:

'gc'

3

Burada temel temel bir liner C-vve ardından I, yukarıda ana hatları belirtilen yöntemle.

Bu komut ( :Comment) seçilen bir dizeyi seçilen herhangi bir satırın başına ekler.

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

.vimrcTek bir bağımsız değişkeni kabul eden ve bağımsız değişkeni geçerli seçimdeki her satırın başına yerleştiren bir komut oluşturmak için bu satırı ekleyin .

Örneğin, aşağıdaki metin seçilirse:

1
2

ve bunu çalıştırırsanız: :Comment //sonuç:

//1
//2

3

Buradaki cevaplardaki fikirlerden başlayarak kendi yorum fonksiyonumu başlattım. Yorumları açar ve kapatır. //print('blue'); //this thing is blueİlk yorumu beğenir ve sadece değiştirir. Dahası, satırın en başında değil, ilk beyaz olmayan alanın olduğu yerde yorumlar ve tek bir boşluk ekler. Buna ek olarak, boşlukları gereksiz yere kopyalamaz, ancak yorum yaparken ve girintili satırlar oluştururken bu fazladan çalışmayı önlemek için yakınlaştırmaları (: yardım için h \ zs) kullanır. Umarım bazı minimalistlere yardımcı olur. Öneriler bekliyoruz.

" 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>

1
Çözümünüzün imleç konumunu da geri yükleyen biraz farklı bir versiyonunu yaptım, bu konuda görüşlerinizi almak istiyorum. üzerinde github
SergioAraujo

Güzel. Yazımı düzenleyebilir ve çözümünüzü ekleyebilirsiniz (benzerlik nedeniyle)!
mike

Ters eğik çizgi c, cpp, java ve E488'den kaçınmak için başka bir ayırıcı kullanmaktan kaçındı. Ayrıca java, cpp için boşluk değişiklikleri yorumlarda üç karakter, // artı boşluk olduğundan, bu l: boşluk tarafından yapılır.
SergioAraujo

3

Jasmeet Singh Anand'dan comments.vim kullanıyorum (vim.org bulunur),

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 ve normal dosyalar

Hem normal hem de görsel modda farklı kaynak dosyalarda yorum yapar ve yorum kaldırır

Kullanımı:

  • CtrlCiçin açıklama tek bir satır
  • CtrlXiçin BM-Yorum tek bir satır
  • ShiftVve birden çok satır seçin, ardından CtrlCseçilen birden çok satıra yorum yapmak için
  • ShiftVve birden çok satır seçin, ardından CtrlXseçilen birden çok satırın yorumunu kaldırmak için

3

En hızlı ve en sezgisel yöntem ), satırların aşağıya doğru yorumlanması için yeniden eşlemektir ve daha sonra( da yürürken- eşlemektir. Deneyin ve geri gitmeyeceksiniz.

Gelen Yakut veya Bash 2-alan girintiler ile:

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

İçinde C / C ++ veya PHP , 4-alan girinti ile:

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

Dezavantajları kaybetmeniz (ve )cümle hareketi için (ancak dasorayı doldurabilir) ve bazen seç ve değiştir veyaCtrlV uzun bölümleri ele çekileceksiniz. Ama bu oldukça nadir.

Ve C stili için, uzun yorumlar en iyi şekilde ele alınır:

set cindent
set formatoptions=tcqr

... hangi V[move]gqsözcük kaydırma yeniden yapmak için kullanımı ile iyi birleştirir .


2

Bu basit snippet benim .vimrc'den:

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

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

Bu // - Yorumlar içindir, ancak diğer karakterler için kolayca uyarlayabilirsiniz. Jqno'nun önerdiği gibi bir lider ayarlamak için autocmd'yi kullanabilirsiniz.

Bu, aralıklarla ve görsel modla doğal olarak çalışmanın çok basit ve etkili bir yoludur.


2

Seviyorum /* ... */(C ansi yorumları), işte burada sizin için bir numara. Elbette, farklı durumlarda kullanmak için uyarlayabilirsiniz.


/ * ... * / ile yorum yapın

Metni seçin (başlangıca gidin, görsel bloğu başlatın, ile atlayın }):

<c-V>}

Seçimde uygulanacak komutu yazın

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

Komut şöyle görünecektir: :'<,'>norm i /* ^[$a */

Ayrıntılar için bkz. (İ *).


/ * ... * /

Metni seçin (önceki gibi veya istediğiniz gibi):

<c-V>}

Seçimde uygulanacak komutu yazın

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

Komut şöyle görünecektir: :'<,'>norm :s-\s*/\*\s*-^M$bbld$

Ayrıntılar için bkz. (İi *).


Sonuç

Etkisi, satır satır yorumlar:

Comment block
Comment block
Comment block

Olur (ve tersi):

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

Bazıları mapveya @regsizin olarak kaydetmek daha iyidir .vimrc, çünkü yazacak çok şey var. Tekli /*ve */tüm bloğu tercih ediyorsanız , şunu kullanın:

Tek bir / * * / tüm blokla yorum yapma

qcYorum yapmak için bir paragrafın başlangıcında , örneğin, ile kayıt yaparak bir kayıt defterine kaydedin :

v}di/*  */<esc>hhhp

ve qrekoru bitirmek için tekrar unutma .

Ayrıntılar için bkz. (İii *).


Bir bloktan tek / * * / işareti çıkar

Diyelim ki sicile kaydedin @u. İmlecinizi bloğun içinde herhangi bir yere koyun ve:

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

Tamamlayarak kaydı kaydedin qKomutu .

Ayrıntılar için bkz. (İv *).


Sonuç

Efekt, birden çok satır için tek bir yorumdur:

Comment block
Comment block
Comment block

Olur (ve tersi):

/* Comment block
Comment block
Comment block */

açıklamalar

(i *)norm Aynı komutu seçilen her satıra tekrar tekrar uygulayarak çalışır . Komut basitçe a ekler /*, bu satırın sonunu bulur ve bir*/

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

(ii *) Ayrıca normher satırda arama / değiştirme işlemini tekrarlamak için de kullanılır . Ara spaces /* spacesve hiçbir şey tarafından değiştirin. Bundan sonra, satırın sonunu bulur, iki kelime geri, bir harf sağa, sonuna kadar sil.

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

(iii *) Paragrafı seçer v}, siler, açık ve kapalı bir yorum ekler, ortasına taşır ve silinen bloğu yapıştırır.

v}di/*  */<esc>hhhp

(iv *) Ortada herhangi bir yerde, geriye doğru a bulur /*, siler; ileri bulur a */, siler.

?/\*<enter>xx/\*/<enter>xx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.