Сначала найдите узор, который выбирает правильные линии. Если у вас есть :set hls
, это поможет определить совпадения. Я думаю, что-то вроде /#.*\/\/$
- это то, что вам нужно.
Затем закомментируйте выбранные строки с помощью
:g/<pattern>/s/^/# /
если #
закомментирует строку и не комментирует их с помощью
: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