Коментирайте / разкоментирайте множество фиксирани редове във vim

В моя код имам множество разпръснати редове, които ми помагат да отстранявам грешки в програмата си и ми показват какво се случва по време на изпълнение. Има ли лесен и бърз начин за коментиране и декоментиране (превключване) на тези фиксирани редове във vim? Мислех да маркирам тези редове със специален знак (напр. //) като този в python:

print "Debug!" # //   

и всеки път, когато се натисне специфичен пряк път, всички редове, които завършват с "# 'някакъв незадължителен описателен текст' //" се коментират или некоментират, съответно.

Разгледах NERD Commenter, но от това, което прочетох, редовете за коментиране/некоментиране трябва да се избират всеки път?


person efie    schedule 27.03.2014    source източник
comment
Какъв език използвате? Може би е по-добре да търсите някаква рамка за регистриране, която можете да включвате или изключвате, когато стартирате програмата. Или може би флаг на командния ред.   -  person FDinoff    schedule 28.03.2014
comment
Използвам python (току-що актуализирах отговора). Мислех да добавя и 'if (debugFlag == True): ...', но не ми харесва много, защото допълнително разширява кода с нещо, което няма нищо общо с логиката на програмата и (минимално) забавя програмата.   -  person efie    schedule 28.03.2014
comment
Python има рамка за регистриране. docs.python.org/2/library/logging.html Трябва да сте можете да го деактивирате доста лесно. Не бих се притеснявал от забавянето на програмата. Освен ако не сте установили (с профайлър), че изявленията на журнала всъщност са проблемът.   -  person FDinoff    schedule 28.03.2014


Отговори (1)


Първо намерете шаблон, който избира правилните линии. Ако имате :set hls, това ще ви помогне да откриете съвпаденията. Мисля, че нещо като /#.*\/\/$ е това, което искате.

След това коментирайте избраните редове с

:g/<pattern>/s/^/# /

if # ще коментира реда и ще ги декоментира с

:g/<pattern>/s/^# //

Сега искате една команда за превключване. Можете или да използвате променлива, за да следите състоянието на превключване, или можете да опитате да разберете текущото състояние, като изследвате редовете, които съвпадат. Използването на променлива изглежда по-просто.

Променливата може да бъде глобална, локална за буфера или локална за скрипта. Харесва ми да използвам локални променливи на скрипт, за да избегна претрупването на пространството от имена. В този случай използването на локална за скрипт променлива може да означава, че vim ще се обърка, когато превключвате буфери, така че нека използваме локална за буфер променлива, да кажем b:commentToggle.

При първото извикване на функцията тя забелязва, че променливата не е зададена, така че използвайте search(), за да потърсите ред, който започва с # (там има интервал!) и завършва с модела, който вече имаме. Флагът n означава да не премествате курсора, а w означава да обвивате края на файла (като търсене с 'wrapscan' набор). Функцията search() връща номера на реда (базиран на 1!), ако моделът е намерен, 0, ако не. Вижте :help search().

Това изглежда работи в малък тест:

fun! CommentToggle()
  if !exists('b:commentToggle')
    let b:commentToggle = !search('^# .*#.*\/\/$', 'nw')
  endif
  if b:commentToggle == 1
    g/#.*\/\/$/s/^/# /
  else
    g/#.*\/\/$/s/^# //e
  endif
  let b:commentToggle = !b:commentToggle
endfun
nnoremap <F4> :call CommentToggle()<CR>

Ако искате да поставите # пред първото непразно място, използвайте ^\s*# в командата search(); s/\ze\S/# / или s/\S/\1# / в първия :g ред; и s/^\s*\zs# // във втория :g ред. Вижте :help /\zs, :help /\ze и :help sub-replace-special.

person benjifisher    schedule 27.03.2014
comment
Това е Python, мисля, че използва # за коментари - person FDinoff; 28.03.2014
comment
Първо, много ви благодаря! Относно последния ви параграф: отварям файл 1, превключвам, за да вмъкна #, отварям файл 2, превключвам, за да вмъкна #, превключвам към файл 1, превключвам, за да премахна #. Това работи, но ако сега превключа към файл 2 и превключа, # не се премахва, но се добавя друг # и по-нататъшното превключване премахва само втория #. Това вероятно не е това, което сте възнамерявали? - person efie; 28.03.2014
comment
Освен това би било хубаво, ако # беше вмъкнат на мястото, където първоначално беше първият знак без интервал (за да се запази вдлъбнатината и да се направи по-приятно за окото), а не в началото. Опитах :g/#.*\/\/$/s/\S/# /, но проблемът е, че първият знак без празно пространство също се изтрива. - person efie; 28.03.2014
comment
Точно така, проблемът с превключването на буферите е по-сложен, отколкото си мислех в началото. Също така, ако запишете файл и се върнете към него по-късно. Ще подобря отговора. - person benjifisher; 29.03.2014