Vim: yeni satırda otomatik yorum


9

Yorum yaptığım için yeni bir satır başlattığımda Vim otomatik olarak bir yorum ekler, çünkü ayarladım formatoptions=tcroql. Örneğin (imleç *):

// this is a comment*

ve vurduktan sonra <Enter>(ekleme modu) veya o(normal mod) şununla kaldım:

// this is a comment
// *

Bu özellik, uzun çok satırlı yorumlar yazarken çok kullanışlıdır, ancak genellikle tek satırlık bir yorum istiyorum. Şimdi yorum serisini bitirmek istersem birkaç seçeneğim var:

  • isabet <Esc>S
  • <BS>üç kez vur

Her ikisi de üç tuş vuruşu sağlar, bununla birlikte ele alındığında, <Enter>yeni bir satır için dört tuş vuruşu anlamına gelir, bence çok fazla. İdeal olarak, sadece <Enter>bırakılmak için ikinci kez vurmak istiyorum :

// this is a comment
*

Çözümün farklı girinti seviyeleriyle de çalışması önemlidir, örn.

int main(void) {
    // this is a comment*
}

isabet <Enter>

int main(void) {
    // this is a comment
    // *
}

isabet <Enter>

int main(void) {
    // this is a comment
    *
}

Sanırım bu özelliği birkaç yıl önce bazı metin editörlerinde gördüm ama hangisi olduğunu hatırlamıyorum. Vim'de bunu benim için yapacak bir çözümün farkında olan var mı? Kendi çözümümü nasıl atacağımıza dair doğru yönde işaretçiler de çok hoş karşılanıyor.


3
Bir anahtar akorundaki otomatik olarak eklenen yorum işaretlerini silmek için ekleme modunda ctrl-u kullanabilirsiniz.
Etan Reisner

1
@EtanReisner aslında daha iyi, ama benim için çok fazla bir tuş vuruşu çok yaygın bir durum çünkü :)
Patrick Oscity

İstediğiniz davranışı elde etmek için tekrar enter tuşuna basmak istediğinizi söylediniz, ancak ctrl-u çok mu fazla? Sizin için ctrl-u'yu otomatik olarak gerçekleştirmek için ekleme modunda <enter> <enter> eşlemesini deneyebilirsiniz, ancak <enter> tuşuna bir kez (başka bir şeye çarpmadan) basarsanız gecikme yaşanır.
Etan Reisner

Ek olarak, yalnızca yorum yapılan satır boşsa tetiklenmelidir. <Enter> tuşuna basıldığında gözle görülür bir gecikme de kabul edilemez.
Patrick Oscity

Sadece inandığım başka tuşlara basmazsanız gecikir çünkü vim hala başka bir tuşa basmayı planlamamanız için beklemek zorunda kalacaktır. Bu kontrolü yapmak için bir işlev kullanabilirsiniz, ancak bunu yapmak özellikle kolay olmayabilir.
Etan Reisner

Yanıtlar:


4

Bunu dene:

function! EnterEnter()
  if getline(".") =~ '^\s*\(//\|#\|"\)\s*$'
    return "\<C-u>"
  else
    return "\<CR>"
  endif
endfunction

imap <expr> <CR> EnterEnter()

Teşekkürler harika görünüyor! Eve geldiğimde deneyeceğim. Normal ifadeyi yorum işaretleri dilini bağımsız olarak eşleştirmek için genişletmenin bir yolunu biliyor musunuz? Bilgiler sözdizimi dosyalarında veya başka bir yerde bulunmalıdır. Belki bunun için sözdizimi özelliğini kaldırabilirim ...
Patrick Oscity

C
dilinde

Açıkçası, bu fonksiyon hiç de genel değildir. Bkz :h 'comment've :h format-comment'.
romainl

Fonksiyonu klasik dışında #yakut ve "vimscript ile çalışmak üzere değiştirildi //. Gerçekten için her şeyi yapmaya mantıklı değil *çünkü C tarzı çok satırlı yorumların gerekir ile sona */neyse.
romainl

Hmm, belki <CR><CR>çok satırlı yorumu bitirmek için kullanılabilir ...
romainl

3

Vim'den normal ifadeyi oluşturarak @ romainl'in rastgele dillerle çalışmak için verdiği cevabı genişlettim &commentstring:

function! s:IsOnlyComment(getlineArg)
  let commentRegex='^\s*'.substitute(&commentstring,'%s','\\s*','').'$'
  return strlen(matchstr(getline(a:getlineArg), commentRegex)) > 0
endfunction

function! SmartEnter()
  if s:IsOnlyComment('.')
    return "\<Esc>S"
  else
    return "\<CR>"
  endif
endfunction

inoremap <expr> <CR> SmartEnter()

Ancak, hiç bir şey hatırlayamıyorum <CR>, bu sadece işe yaramaz. Şimdilik <CR><CR>bu sorun çözülene kadar kullanıyorum .


1
Neden <Esc>S? <C-u>ekleme modundan çıkmadan da aynısını yapar. Her neyse, bir sürü şey yapan <CR>ve SmartEnter()cevabımı gönderdikten sonra sadece dün yeniden adlandırılan özel bir fonksiyonum vardı ;-). Ayrıca &commentstringgenellikle sadece bir form içerdiğinden ve "linewise" veya "blockwise" ( /*%s*/C, //%sJavascript, vb.) Olabileceği için doğru seçim olduğundan emin değilim .
romainl

2

R 'formatoptions' dan çıkarın. Bu seçenek bunu yapar. Kapatmak, asla sizin için vim almamanız anlamına gelir, bu da onları gerçekten istediğinizde önde gelen yorum işaretlerini eklemeniz gerektiği anlamına gelir, ancak bu takastır.


2
Aslında istiyorum buna bayılıyorum, Vim benim için açıklama işaretleri ekleyin. Ama ben de yorumdan çıkmak için hızlı bir yol istiyorum. Yine de cevabınız için teşekkürler.
Patrick Oscity

Normal mod 'o' komutu için, 'r' den kaldırılmalıdırformatoptions
elig
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.