Экранирование обратной косой черты в .vimrc, чтобы :map работал с grep и \s

На моем .vimrc я использую это:

:map ,p :!clear; grep -E "def \|class " %

чтобы сопоставить ,p с grep, который предоставляет определение Python и иерархию классов, это работает очень хорошо.

Я безуспешно пытаюсь сделать то же самое, чтобы получить структуру vuejs.

Я получаю то, что мне нужно на Bash, с помощью этого grep:

$ grep -E '^\s+\S+: {|\() {$|<script>|import' /tmp/somevuejs.vue

Но когда я пытаюсь надеть его .vimrc:

:map ,j :!clear; grep -E '^\s+\S+: {|\() {$|<script>|import' %

Я получаю эту ошибку:

$ vim file.txt
Error detected while processing /home/me/.vimrc:
line   20:
E10: \ should be followed by /, ? or &

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

:map ,j :!clear; grep -E '^//\s+//\S+: {|\() {$|<script>|import' %
:map ,j :!clear; grep -E "^//\s+//\S+: {|\() {$|<script>|import" %
Стоит ли изучать 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
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

:help map-bar говорит, что вы не можете использовать | в сопоставлении, если вы каким-то образом не избежите его.

Ваше существующее сопоставление «работает», потому что его | правильно экранирован:

:map ,p :!clear; grep -E "def \|class " %
                              ^^

Ваше новое сопоставление не работает, потому что его многие | не экранированы:

:map ,j :!clear; grep -E '^\s+\S+: {|\() {$|<script>|import' %
                                    ^      ^        ^

Точная ошибка, о которой сообщает Vim, вызвана этой конструкцией:

{|\(

| рассматривается Vim как разделитель между двумя командами Vim, поэтому вы получаете одну команду Vim:

:!clear; grep -E '^\s+\S+: {

(которая в любом случае выполняет внешнюю команду borked), за которой следует вторая:

:\() {$|<script>|import' %

что на самом деле не имеет смысла. Это \ вызывает ошибку. Если вы избежите этого первого |, вы получите другую ошибку, вызванную вторым |, а затем еще одну, вызванную третьим |.

Избегайте этих |, чтобы ваше отображение «работало»:

:map ,j :!clear; grep -E '^\s+\S+: {\|\() {$\|<script>\|import' %
                                    ^^      ^^        ^^

Я поставил «работу» в кавычки, потому что эти сопоставления очень неуклюжи.

  1. Им нужен <CR> в конце, чтобы вам не пришлось нажимать Enter для выполнения команды:

    :map ,p :!clear; grep -E "def \|class " %<CR>
    :map ,j :!clear; grep -E '^\s+\S+: {\|\() {$\|<script>\|import' %<CR>
    
  2. Они должны быть ограничены нормальным режимом, если только вы действительно не хотите, чтобы они были определены для визуальных режимов, режимов выбора и режима ожидания оператора:

    :nmap ,p :!clear; grep -E "def \|class " %<CR>
    :nmap ,j :!clear; grep -E '^\s+\S+: {\|\() {$\|<script>\|import' %<CR>
    
  3. Поскольку вы, похоже, не используете другое сопоставление в своих сопоставлениях, лучше всего сделать их нерекурсивными:

    :nnoremap ,p :!clear; grep -E "def \|class " %<CR>
    :nnoremap ,j :!clear; grep -E '^\s+\S+: {\|\() {$\|<script>\|import' %<CR>
    
  4. И, поскольку вы находитесь в сценарии, вы можете безопасно удалить двоеточие:

    nnoremap ,p :!clear; grep -E "def \|class " %<CR>
    nnoremap ,j :!clear; grep -E '^\s+\S+: {\|\() {$\|<script>\|import' %<CR>
    

Это намного чище!

Теперь, я думаю, мы сохраним следующую загадку, а именно, почему вы используете для этого внешний инструмент вместо :help :global, для комментариев… или для другого вопроса.

Спасибо очень ясно; Что меня смутило в сообщении об ошибке, так это «E10: за \ должны следовать /, ? или &» относятся к «\», а не к «|»

user3313834 20.03.2022 21:24

Позвольте мне уточнить точную ошибку.

romainl 20.03.2022 22:06

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