Комментируйте и раскомментируйте код css с помощью vmap в Vim

Я пытаюсь комментировать и раскомментировать файл 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.

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

Чего вы пытаетесь достичь с помощью этих двух звездочек?

romainl 12.09.2018 19:52

Если вы попытаетесь удалить '/ *' и '* /' из файла css, вам понадобится регулярное выражение (две звездочки), чтобы сопоставить их, не спрашивайте меня, почему, поскольку я понятия не имею, как работает реализация механизма Regex

Aron Lee 12.09.2018 23:25

Этот ** является причиной вашей проблемы. Это означает "любое число предыдущего атома любое число предыдущего атома", что бессмысленно. Если вы хотите сопоставить «любое количество *», вам нужно экранировать первый *: \**.

romainl 13.09.2018 07:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта проблема

Если вы проверите свое сопоставление, вы увидите, что оно определено не так, как ожидалось:

: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

Я бы рекомендовал поместить любые настройки, сопоставления и автоматические команды для конкретных типов файлов в ~/.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>

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

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

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

спасибо, инго, у тебя всегда есть ответ на мою проблему с vim :)

Aron Lee 12.09.2018 23:20

Я стараюсь избегать использования плагинов прямо сейчас, так как я устанавливал много плагинов раньше, и мой Vim работал очень медленно, и мне пришлось удалить их все, так как у меня нет возможности понять, какой плагин вызывает такую ​​медлительность vim. Я просто пишу все от руки и знаю, что делать, если у меня возникнут проблемы с моим Vim.

Aron Lee 12.09.2018 23:23

Это компромисс между изобретением колеса (часто неудачно) и раздуванием системы слишком большим количеством плагинов. Дело не в количестве плагинов; это сильно зависит от того, что они делают. Особенно много :autocmd при частых событиях могут снизить производительность. Небольшой скрипт плагина с интенсивным использованием скриптов автозагрузки получает бонусные баллы за быстрый запуск. Для этих плагинов для комментаторов они в основном просто определяют пару сопоставлений, так что все должно быть в порядке.

Ingo Karkat 13.09.2018 08:34

Другие вопросы по теме