Görsel modda seçilen bir dizi satır nasıl yorumlanır?


35

Görsel modda seçilen satırlarda birden çokunu nasıl yorumlarım? Dile özgü hale nasıl getirebilirim?

Örneğin, ilk 4 satır seçiliyse:

def foo(a,b):
    for each in (a,b):
        print each
    return a+b
print "2"

Bir komutun / makronun çalışması bununla sonuçlanmalıdır (python'da):

#def foo(a,b):
#    for each in (a,b):
#        print each
#    return a+b
print "2"

Yanıtlar:


31

Dile özgü yorum yapmak istiyorsanız nerdcommenter gibi bir eklentiye ihtiyacınız olacak .

Alternatif olarak, asıl sorunuzu cevaplamamasına rağmen, yerleşik vim eylemlerini ve her dilin yorum karakteri hakkındaki bilgilerinizi kullanabilirsiniz ...

Seçenek # 1: V-blokları

  1. :1 Enter (Satır 1'e gidin)
  2. Ctrl-V (V-Blok modu)
  3. jjj (Aşağı 3 satır daha)
  4. Shift-I (Bloktan önce ekleme moduna gir)
  5. # ('#' Ekle)
  6. Esc (Normal moda dön)

Seçenek # 2: Değiştirme

:1,4s/^/#/

Yıkmak:

  1. : Ex komutu takip ediyor
  2. 1,4 1'den 4'e kadar olan hatlarda
  3. s vekil
  4. /ikame komutunun parçaları için ayırıcı.
    (Farklı bir karakter de kullanabilirsiniz, örneğin :)
  5. ^ çizginin başlangıcı
  6. / ayırıcı
  7. # python için yorum karakteri
  8. / son ayırıcı

Seçenek # 3: Bir makronun uygulamasını tekrarlayın ( kaynak )

  1. :1 Enter (Satır 1'e gidin)
  2. qa(Kayıt üzerine kayda başla a)
  3. Shift-I (Satırın başında ekleme moduna girin
  4. # (Satırın başına bir '#' ekleyin)
  5. Esc (Normal moda dön)
  6. q (Kaydetmeyi bırak)

  7. :2,4 normal @a( a2 ile 4 arasındaki satırlara kayıt olmak için kaydedilen makroyu yeniden çalıştırın )

    VEYA

    Çizgileri görsel modda seçebilir ve :otomatik olarak Ex çizgisini :'<,'>(görsel seçimin başlangıcından sonuna kadar olan bir aralık) doldurmak için isabet edebilir , sonra normal @ayazıp Enter( kaynak ) tuşuna basabilirsiniz .

Şimdi, ne zaman bir satır yorum yapmak istediğinizde, sadece abu satırlara kayıt olmak için kaydedilen makroyu yeniden çalıştırın :

:9,22 normal @a (comment out lines 9-22)

1
Seçenek 4: Eklenti
Cody Anket

:9,22 normal I#Cevabımı gereğince , neden tek bir komut için bir makro kullandığını anlamıyorum .
Ben,

Neden kullanmak istersin: 1 <enter>, gg kullanabiliyorken?
Tanath

@Tanath İlk satırdan yorum yapmak bu örneğe özgüdür. Yazar satır 9 ila 22 arasında yorum yapmak isterse gg kullanamazlar.
bsmith89

@Ben normalBu cevabı yazmadan önce komut hakkında hiçbir şey bilmiyordum . Haklısın; :9,22 normal I#de çalışacak.
bsmith89

26

Görsel Blok modunu ( CtrlV) kullanarak , satırların başlangıcını seçin. Ardından , bu satırların her birine karma karakteri eklemek için I#(bu büyük harf I) basın. Ardından Esc, Ekleme Modundan Normal Moda geri dönmek için düğmesine basın .


Bu benim için çalışmıyor. Yalnızca ilk satıra bir yorum ekler.
gon1332

İtiyor musun ctrl? Çünkü ctrl+vsadece farklı bir şey v.
Cody Poll,

@CodyPoll biliyorum. Her şey yolunda I. Tuşuna bastığımda I, #sadece ilk satırın önüne yerleştirilecek.
gon1332

@CodyPoll Tamam .. Ben sadece yatan hasta. Ben basın vermedi Escprosedür tarif sonra.
gon1332

@ gon1332 bildiğim kadarıyla Escsonunda basmaya ihtiyacınız var .
Gonçalo Ribeiro

18

Şu anda hangi dilde olursanız olun hızlı bir çözüme ihtiyacınız varsa ve metni görsel modda seçtiyseniz, o zaman

:norm 0i#

işi yapar. (Her hat için, normal modda, ilk sütuna ve ekleme gidin #. Kullanılması :norm I#ilk boşluk olmayan karakterden önce onu ekler, ne istediğinizi olmayabilir hangi.) Kullanılması :norm i#da olacak işi, çünkü :normbaşında başlar hat, ama bunu bilmiyorsanız daha az belirgin ve daha az net.

Elbette, bunu sık sık yapmak istiyorsanız, bir harita oluşturmak veya bir eklenti aramak isteyeceksiniz.


1
0'a gerek yoktur, çünkü varsayılan olarak, normalsatırın başında imleçle komut çalıştırılır.
nitishch

1
Tabii ki, satır numaraları,%, işaretleri bu komutla ön eklenebilir. Örnek:: 1,5norm i # (veya): 'a,' bnorm i # (veya):% 10 norm i #
SibiCoder

9

Otomatik olarak yapmak, vimrcdosyanıza aşağıdaki gibi bir şey eklemenizi gerektirir ( kaynak ):

au FileType haskell,vhdl,ada let b:comment_leader = '-- '
au FileType vim let b:comment_leader = '" '
au FileType c,cpp,java let b:comment_leader = '// '
au FileType sh,make let b:comment_leader = '# '
au FileType tex let b:comment_leader = '% '
noremap <silent> ,c :<C-B>sil <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:noh<CR>
noremap <silent> ,u :<C-B>sil <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:noh<CR>

,cBir bölgeyi yorumlamak ve bir bölgeyi yorumlamak için kullanma ,u. Bu, farklı diller için yorum sembollerini manuel olarak ayarlar.

İkinci seçenek tcomment , vim-yorum ya da comments.vim gibi bir eklenti kullanmaktır . Tcomment'i kendim kullanırım. Lütfen, sorunun konunun ötesinde olduğuna inandığım için sayfalarındaki kullanım ve kurulum talimatlarını okuyun.

vimrcDosyanızda bir kod parçasını saklamaktan çok daha kolay olduğu için bir eklenti kullanmanızı (yukarıdaki linklerden biri veya biri) kullanmanızı öneririm .

Düzenleme: Soru değiştiğinde manuel yolu kaldırdım ve aynı zamanda 200_success tarafından doğru yolu cevaplandı.


Ek bir eklenti önerisi: NERD Yorumlayıcısı - vim.org/scripts/script.php?script_id=1218
15

Not: Bu sadece satır içi yorumları destekler. Örneğin, ANSI C tanımıyor //(sadece /* */).
wchargin

Bu yaklaşımı sevsem de, yorumunu değiştirmenin bir yolu var mı?
ideasman42

1
@ ideasman42 Bunun yerine bir işlev yapmalı ve geçerli satırın bir yorumla başlayıp başlamadığını kontrol etmelisiniz ve ardından :scevapta alıntıda gösterilen komutlardan herhangi birine bağlı olarak kontrol ediniz . Kontrol kendisi gibi bir şey olurdu getline('.') =~ "^" . escape(b:comment_leader, '\/'). Gerçek rahatsızlık varsa, yorum yapın. Bu test edilmemiştir ve sadece bir örnek teşkil etmelidir.
tokoyami

5

Bunun için scrooloose / nerdcommenter kullanıyorum .

Bu eklenti ile çizgilerinizi görsel olarak seçebilir ve yorumları değiştirmek için leader+ tuşlarına cbasın. Dosya türüne bağlı olarak yorum yapmak için farklı semboller kullanır.


5

Satırları seçtikten sonra, sadece

:norm I#

:otomatik olarak '<,'>seçiminizin başlangıcından sonuna kadar olan bir komut satırına geçecektir ; normnormal mod komutunu çalıştırır ve bu aralıkta hareket eder; I#Satırın başına '#' ekleyen normal mod komutudur.


4

Bunun için büyük bir TComment hayranıyım ; sadece belirli bir dosya tipine dosya tipinde yorum yapabilirim, ancak blok açıklamaları destekleyen diller için satır başına blok - satır belirtebilirim.

    gc{motion}   :: Toggle comments (for small comments within one line 
                    the &filetype_inline style will be used, if 
                    defined)
    gcc          :: Toggle comment for the current line

Explicit commenting/uncommenting:

    g<{motion}   :: Uncomment region
    g<c          :: Uncomment the current line
    g<b          :: Uncomment the current region as block

    g>{motion}   :: Comment region
    g>c          :: Comment the current line
    g>b          :: Comment the current region as block

In visual mode:

    gc           :: Toggle comments
    gC           :: Comment selected text

Cevabınız için teşekkürler! Belki genişletebilir misiniz? Eklenti cevapları vermek iyidir, ama şu anda bu sadece bir eklentinin bağlantısı. En azından, ne yaptığı ve nasıl kullanılacağına dair temel bir açıklama cevapta bekleniyor. Ayrıca bu meta gönderisine bakın .
Martin Tournoij

Klavye kopyalamak / yapıştırmak aptalca görünüyor ama işte başlıyorsunuz; Ne yaptığını zaten açıkladım.
Collin Grady

3

Ben bulmak vim-yorum eklentisi bunu yapmak için uzak ve uzak en kolay yolu gereğidir. Bir çizgi aralığı seçin, sonra vurun gc. Açtığınız dosya türü için uygun bir yorum karakteri kullanır. Herhangi bir görsel seçim yapılmadan, gcuveya ile bitişik yorum satırlarının yorumlanmaması bile mümkündür gcgc.


2

Satırın başında 5 satıra önek eklemek istediğinizi varsayarsak, ardından Arama özelliğini kullanabilirsiniz :

:.,+5s/^/prefix_/g

veya satırların sonunda:

:.,+5s/$/suffix_/g

Veya dikey metin bloğu seçmek için görsel modu ( Ctrl+ v) kullanın, ardından ekleme moduna ( I) girin ve bir şeyler yazın ve Escdeğişiklikleri onaylayıp diğer satırlara uygulamak için tuşuna basın .

İlgili:


2

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 karakter dizileridir ve tırnak işaretleri içine alınmaları gerekir; tırnak işaretleri arasında yorumlar değiştirilirken kullanılanların bir parçası değildir.

  • autocmd BufNewFile,BufReadPost *...: Autocommands farklı şeyler tetikler, bu durumda bunlar yeni bir dosya veya okunan dosya belirli bir uzantıyla sona erdiğinde tetiklenir. Tetiklendikten sonra commentChar, dosya tipine bağlı olarak değişmemize izin veren aşağıdaki komutu uygulayın. Bunu yapmanın başka yolları da var, ancak acemiler için daha kafa karıştırıcı (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ım vardı ama bunun nedeni vim komut satırı üzerinden yeni fonksiyonlar tanımlamamdı.

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e': Yürüt komutu çağırır. Bu durumda, tüm arabellek veya vurgulanan bölüm substitutegibi bir aralığı (varsayılan olarak geçerli satır budur) alabilen yürütüyoruz . bir çizginin başlangıcına ve ardından herhangi bir miktarda boşluk bırakacak şekilde eşleştirilen regex'tir . Buradaki string bitiştirme için kullanılır, çünkü tırnak içine alınamaz. bağımsız değişkenlerle eşleşen karakterden kaçmanıza izin verir (bu durumda ve ), a ile hazırlanarak . Bundan sonra, dizgemizin sonuyla tekrar birleşiriz .%'<,'>^\s*&.escape()escape()commentChar\/\substituteebayrağı. Bu bayrak sessizce başarısız olmamızı sağlar, yani belirli bir satırda bir eşleşme bulamazsak, bağırmayacağız demektir. Genel olarak, bu satır, ilk metinden hemen önce bir boşluk bıraktıktan sonra bir yorum karakteri koymamıza izin verir, bu da girinti seviyemizi koruduğumuz anlamına gelir.

  • execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e': Bu son büyük emirimize benziyor. Buna özgü olan, bizden \vkaçmak zorunda olmadığımızdan emin olan ()ve bizim 1yaptığımız gruba atıfta bulunan biziz (). Temel olarak, herhangi bir miktarda boşlukla başlayan bir çizgiyi ve ardından yorum karakterimizi takip eden herhangi bir miktarda boşlukla eşleştiriyoruz ve yalnızca ilk boşluk kümesini tutuyoruz. Yine, ebu satırda bir yorum karakterimiz yoksa sessizce başarısız olalım.

  • let l:line=getpos("'<")[1]: Bu, yorum karakterimizde yaptığımız gibi bir değişken oluşturur, ancak lyerel kapsamı belirtir (bu işlev için yerel). getpos()Bu durumda, vurgulamamızın başlangıcını [1]ve sütun numarası gibi diğer şeyleri değil, sadece satır numarasını önemsiyoruz anlamına gelir.

  • if match(getline(l:line), '^\s*'.b:commentChar)>-1: nasıl ifçalıştığını biliyorsunuz . match()ilk şeyin ikinci şeyi içerip içermediğini kontrol eder, bu yüzden vurgulamaya başladığımız çizgiyi yakalarız ve yorum karakterimizin izlediği boşlukla başlayıp başlamadığını kontrol ederiz. match()bunun doğru olduğu dizini ve -1hiçbir eşleşme bulunamadığını 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 sonucu, vimeğer yanlış ise 0, eğer doğruysa 1, doğru ifolarak değerlendirmek istediğiniz şey budur .

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>: vnoremapşu komutu görsel modda eşlemek, ancak yinelemeli olarak eşlememek anlamına gelir (başka bir şekilde kullanabilecek diğer komutları değiştirmeyin). Temel olarak, meraklı bir acemi iseniz, her zaman bir noremapşeyleri kırmamaya dikkat edin. <silent>"Sözlerini, sadece davranışlarını istemiyorum" anlamına gelir ve komut satırına hiçbir şey yazdırmamasını söyler. <C-r>Bu durumda ctrl + r olan eşleme yaptığımız şey (bu eşleme ile normal modda hala normal olarak "yinele" için Cr'yi kullanabileceğinizi unutmayın). C-ubiraz kafa karıştırıcıdır, ancak temelde görsel vurgulamanızın izini kaybetmeyeceğinizden emin olmanızı sağlar ( bu cevaba göre emrinizle'<,'> istediğimiz şeyden başlamanızı sağlar ).callburada sadece vim'e bizim adlandırdığımız işlevi yerine getirmesini söyler <cr>ve enterdüğmeye basmayı ifade eder . Fonksiyonu çağırmak için bir kere basmalıyız (aksi halde call function()komut satırına yeni yazdık ve yerine geçenlerin başından sonuna kadar devam etmesi için tekrar vurmamız gerekiyor (neden olduğundan emin değiliz, ama ne olursa olsun).

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ış budur; Bloktaki her satırın yorumlanıp yorumlanmamasını değiştirmeyi istemedim, bu yüzden konuyla ilgili birden fazla soru sorduktan sonra benim için mükemmel çalışıyor .

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.