Комментирование c ++ кодов в Vim - PullRequest
2 голосов
/ 09 января 2012

Я хочу отобразить \ c, чтобы прокомментировать текущую строку в vim (добавьте '//' перед первым непустым в строке) и \ d, чтобы удалить '//' в начале строки (раскомментируйте).

Я добавил эти две строки в свой vimrc:

imap \c <Esc>:s/^/\/\/ <CR>j$a

imap \d <Esc>:s/^\/\/ /<CR>j$a

, но когда я вызываю это в этой строке:

    for (int i = 0; i < n; i++)

, тогда он преобразуетсяв:

//    for (int i = 0; i < n; i++)

, но я хочу преобразовать его в:

    // for (int i = 0; i < n; i++)

одна из причин, по которой я хочу это, заключается в том, что когда я хочу, чтобы vim делал отступ в этой строке, он добавляетдополнительная вкладка в начале строки и преобразовать ее в:

    //    for (int i = 0; i < n; i++)

что мне делать?Я думал, что ^ относится к первому непустому символу строки, но это не так.

PS: я нашел эти две команды, но я не знаю, что они делают.не могли бы вы объяснить их мне (потому что мне нужно их запомнить, и их легче запомнить, когда я узнаю, кто они).если какая-то часть из них не нужна, пожалуйста, скажите мне:

imap \c <ESC>:s,^\(\s*\)[^/ \t]\@=,\1// ,e<CR>j$a

imap \d <ESC>:s,^\(\s*\)// \s\@!,\1,e<CR>j$a

Ответы [ 3 ]

3 голосов
/ 09 января 2012

Даже если команда ^ в нормальном режиме переходит к первому непустому, ^ в шаблоне (то есть в командах :s, :g, :v, :sort) означает начало линия. Смотри :help /^

Используйте I для вставки сначала непустого и A для добавления после последнего символа.

Использование:

inoremap \c <c-o>I//<esc>jA
inoremap \d <esc>^2xjA

Однако есть хорошие плагины, которые делают эту работу. комментарий Тима Поупа или NERD Commenter . Смотрите их документацию.

2 голосов
/ 09 января 2012

Об этих командах, которые вы нашли:

imap \ c: s, ^ (\ s *) [^ # \ t] \ @ =, \ 1 //, ej $ a

Давайте начнем с сопоставления с шаблоном, сравнивая его с вашим :s/^/\/\/ <CR>j$a.

  • :s, в точности эквивалентен :s/ - вы можете выбрать нестандартный разделитель, где он делает выражение более читабельным, поэтому здесь использование , вместо / означает меньшее экранирование и отсутствие путаницы между комментариями // и сепаратор
  • ^(\s*) соответствует началу строки (так же, как у вас) и любой начальный пробел, захватывая пробел, чтобы мы могли использовать его позже
  • [^# \t]\@= просто требует какой-либо символ, кроме пробела, табуляции или # до конца строки, но не захватывает его (т. Е. Этот символ не будет заменен)
  • ,\1// , заменяет соответствующую строку на начальный пробел (\1 - это то, что было захвачено группой (\s*)), за которой следует //

Например:

^    void foo();

должно соответствовать так: ^(\s*)[^# \t]\@= -> ^( )(v@=)void foo();, то есть первая группа соответствует начальному пробелу, а следующее выражение соответствует, но не использует v из void. Затем \1// расширяется до:

^    // 

и окончательный результат замещения:

^    // void foo();`

(начало строки я пометил ^, поскольку отступы неоднозначны в противном случае)

2 голосов
/ 09 января 2012

Я рекомендую использовать плагин Enhanced Commentify . Затем вы можете добавить это в ваш ~/.vimrc файл:

let g:EnhCommentifyRespectIndent = 'yes'

и это даст вам поведение, которое вы после. В визуальном режиме выберите область кода, которую вы хотите прокомментировать, и введите \c. Чтобы раскомментировать, используйте \C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...