Комментарий и раскомментируйте код CSS с Vmap в Vim - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь комментировать и раскомментировать файл css с помощью vmap

, когда выбираю строки в файле css и комментирую их с помощью 'xx'

autocmd BufEnter *.css vmap  xx  :s/\%V\s*\(\S.*$\)\%V/\/* \1 *\//g <CR>

Он отлично работает

Но когда я пытаюсь vmap 'xu' раскомментировать код CSS,

autocmd BufEnter *.css vmap  xu  :s/\%V\/\*\|**\/\%V//g <CR>


'xx' comment =>   background-color => /*  background-color:red;  */
'xu' uncomment =>  /*  background-color */ => background-color

Сопоставление - попытка удалить '/*' and '*/' из выбранных мной строк в файле CSS.

Iполучил следующую ошибку:

E871: (NFA regexp) Can't have a multi follow a multi !
E61: Nested *
E476: Invalid command

Мне кажется, я не могу иметь 'или' оператор между '\% V и \% V', который является визуальным блоком в Vim.

Кто-нибудь знаеткак решить проблему

1 Ответ

0 голосов
/ 12 сентября 2018

проблема

Если вы проверите свое сопоставление, вы увидите, что оно не определено должным образом:

:vmap xu
v  xu            :s/\%V\/\*|**\/\%V//g <CR>

Внутри сопоставления разделитель команд | завершит команду сопоставления и, следовательно, должен быть экранирован. (Ср. :help map-bar). Обычно это делается через <Bar>, но также может быть сделано путем добавления \. Случайно, ваше регулярное выражение имело именно это, что позволило избежать ошибки определения отображения, но также повредило отображение.

vmap  xu  :s/\%V\/\*\<Bar>**\/\%V//g <CR>

Вы, вероятно, также должны последовательно избегать второго литерала *; это привело бы к другой ошибке ( шаблон не найден ) вместо E871:

vmap  xu  :s/\%V\/\*\<Bar>\**\/\%V//g <CR>

autocmd

... работает, но не так, как обычно. Vim имеет обнаружение типа файла , и из коробки обнаруживает *.css как filetype=css для вас. Нет необходимости дублировать эту информацию в ваш autocmd. Вместо этого вы можете подключиться к событию FileType:

autocmd FileType css vmap  xu  :s/\%V\/\*\<Bar>\**\/\%V//g <CR>

Альтернатива autocmds

Я бы порекомендовал помещать любые параметры, сопоставления и специфичные для типов файлов autocmds в ~/.vim/ftplugin/{filetype}_whatever.vim (или {filetype}/whatever.vim; ср. :help ftplugin-name) вместо определения лотов :autocmd FileType {filetype}; он чище и лучше масштабируется; требует, чтобы у вас было :filetype plugin on, хотя. Настройки, которые переопределяют вещи в плагинах по умолчанию для файловых типов, должны вместо этого идти в ~/.vim/after/ftplugin/{filetype}.vim.

Более мелкие исправления

  • Вы должны использовать :vnoremap вместо :vmap; делает отображение невосприимчивым к переназначению и рекурсии.
  • После редактирования файла CSS отображение также будет активным в любом другом буфере, поскольку он является глобальным . Добавьте аргумент <buffer>, чтобы ограничить его буфером (CSS).
  • Вы можете использовать другой разделитель для :substitute; он избегает экранирования / в шаблоне и делает его немного более читабельным.

Окончательная рекомендация

Я бы добавил в ~/.vim/ftplugin/css_mappings.vim следующее:

vnoremap <buffer> xu :s#\%V/\*\<Bar>\**/\%V##g <CR>

Или используйте плагин

(Если вы не являетесь минималистом, который избегает плагинов за определенную плату, или если вы сделали это только для обучения.)

Обратите внимание, что есть несколько плагинов для комментариев, которые делают это очень хорошо, и они являются общими (и часто расширяемыми), поэтому они работают для любого типа файла:

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