Комментировать / раскомментировать несколько фиксированных строк в vim

В моем коде есть несколько разрозненных строк, которые помогают мне отлаживать мою программу и показывают, что происходит во время выполнения. Есть ли простой и быстрый способ прокомментировать и раскомментировать (переключить) эти фиксированные строки в vim? Я подумал о том, чтобы пометить эти строки специальным знаком (например, //), как это в python:

print "Debug!" # //   

и каждый раз, когда нажимается конкретный ярлык, все строки, заканчивающиеся на "#" некоторый необязательный описательный текст '// ", комментируются или раскомментируются соответственно.

Я посмотрел на NERD Commenter, но, судя по тому, что я прочитал, строки, которые нужно прокомментировать / раскомментировать, нужно выбирать каждый раз?


person efie    schedule 27.03.2014    source источник
comment
На каком языке ты говоришь? Возможно, было бы лучше поискать какую-то структуру ведения журнала, которую вы можете включать или выключать при запуске программы. Или, может быть, флаг командной строки.   -  person FDinoff    schedule 28.03.2014
comment
Использую питон (только что обновил ответ). Я тоже подумал о добавлении '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/^/# /

если # закомментирует строку и не комментирует их с помощью

: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
Это питон, я думаю, он использует # для комментариев. - 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