Първо намерете шаблон, който избира правилните линии. Ако имате :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