Я пытаюсь комментировать и раскомментировать файл 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.
У меня следующая ошибка:
E871: (NFA regexp) Can't have a multi follow a multi !
E61: Nested *
E476: Invalid command
Мне кажется, я НЕ МОГУ иметь оператор 'или' между '\% V и \% V', который является визуальным блоком в Vim.
Кто-нибудь знает как решить проблему
Если вы попытаетесь удалить '/ *' и '* /' из файла css, вам понадобится регулярное выражение (две звездочки), чтобы сопоставить их, не спрашивайте меня, почему, поскольку я понятия не имею, как работает реализация механизма Regex
Этот **
является причиной вашей проблемы. Это означает "любое число предыдущего атома любое число предыдущего атома", что бессмысленно. Если вы хотите сопоставить «любое количество *
», вам нужно экранировать первый *
: \**
.
Если вы проверите свое сопоставление, вы увидите, что оно определено не так, как ожидалось:
: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>
... работает, но не так, как обычно. Vim имеет определение типа файла и сразу же определяет *.css
как filetype=css
для вас. Нет необходимости дублировать эту информацию в вашем autocmd. Вместо этого вы можете подключиться к событию FileType
:
autocmd FileType css vmap xu :s/\%V/\*\<Bar>\**/\%V//g <CR>
Я бы рекомендовал поместить любые настройки, сопоставления и автоматические команды для конкретных типов файлов в ~/.vim/ftplugin/{filetype}_whatever.vim
(или {filetype}/whatever.vim
; см. :help ftplugin-name
) вместо определения множества :autocmd FileType {filetype}
; он чище и лучше масштабируется; однако требуется, чтобы у вас был :filetype plugin on
. Настройки, которые отвергать в подключаемых модулях типов файлов по умолчанию, должны вместо этого идти в ~/.vim/after/ftplugin/{filetype}.vim
.
:vnoremap
вместо :vmap
; это делает отображение невосприимчивым к повторному отображению и рекурсии.<buffer>
, чтобы ограничить его буфером (CSS).:substitute
; он избегает экранирования /
в шаблоне и делает его немного более читаемым.Я бы поместил в ~/.vim/ftplugin/css_mappings.vim
следующее:
vnoremap <buffer> xu :s#\%V/\*\<Bar>\**/\%V##g <CR>
(Если вы не являетесь минималистом, который избегает плагинов за определенную плату, или если вы сделали это только для обучения.)
Обратите внимание, что есть несколько плагинов для комментаторов, которые делают это очень хорошо, и они являются общими (и часто расширяемыми), поэтому они работают с любым типом файлов:
спасибо, инго, у тебя всегда есть ответ на мою проблему с vim :)
Я стараюсь избегать использования плагинов прямо сейчас, так как я устанавливал много плагинов раньше, и мой Vim работал очень медленно, и мне пришлось удалить их все, так как у меня нет возможности понять, какой плагин вызывает такую медлительность vim. Я просто пишу все от руки и знаю, что делать, если у меня возникнут проблемы с моим Vim.
Это компромисс между изобретением колеса (часто неудачно) и раздуванием системы слишком большим количеством плагинов. Дело не в количестве плагинов; это сильно зависит от того, что они делают. Особенно много :autocmd
при частых событиях могут снизить производительность. Небольшой скрипт плагина с интенсивным использованием скриптов автозагрузки получает бонусные баллы за быстрый запуск. Для этих плагинов для комментаторов они в основном просто определяют пару сопоставлений, так что все должно быть в порядке.
Чего вы пытаетесь достичь с помощью этих двух звездочек?