Как я могу избежать символов% и # в команде Vim?

Я использую Ack (https://github.com/mileszs/ack.vim) с флагом --literal для поиска по проектам в Vim. Я заметил, что всякий раз, когда я ищу строку с символами % или #, поиск не соответствует вещам, как я ожидал. Я провел некоторое исследование и обнаружил, что это потому, что Vim расширяет эти символы в командах (% - это текущий файл и # на что-то еще, не уверен, что).

Это довольно неприятное поведение при выполнении поиска, учитывая, что эти символы часто встречаются в коде. Есть ли способ избежать их, желательно автоматически, чтобы поиск работал так, как ожидалось? Мое текущее отображение: nnoremap <leader>al :Ack --literal<space>.

Пример

Скажем, что у меня есть селектор #body в файле CSS где-то, и я хочу его найти. Это те вещи, которые я пробовал (которые не сработали):

:Ack --literal #body
:Ack --literal \#body
:Ack --literal "#body"
:Ack --literal "\#body"

Любые идеи, почему экранирование не будет работать как обычно, или что это даже ищет? У меня не было таких примеров.

Решение

Я получил его для работы, дважды избегая символов. Например, :Ack --literal "\\#body" будет показывать :ack -H --nocolor --nogroup --column --literal "#body" в строке состояния окна результатов и отображать ожидаемые результаты. Кавычки, похоже, также требуются.

Ответ 1

Вы просто префикс их с обратной косой чертой

:!echo %

выводит текущее имя файла буфера

:!echo \%

печатает одиночный символ "%"

Ответ 2

По-видимому, вам нужно несколько раз убежать, как упоминалось в проблема ack.vim:

:Ack \\\#foo

Ответ 3

Это ошибка в ack.vim, так или иначе программа ack даже не вызывается, когда вы делаете :Ack --literal \#body

Однако я использовал

`strace -f -o-e trace=process gvim | tee /tmp/log`

И кажется, что выполнение :Ack --literal '\#body' (учитывайте дополнительные кавычки) работает как ожидалось:

[pid  3833] execve("/usr/bin/ack", ["ack", "-H", "--nocolor", "--nogroup", "--literal", "#body"], [/* 25 vars */] <unfinished ...>

Я действительно не тестировал его...

Ответ 4

У меня есть одно дополнение к @sehe answer: когда вы делаете !... или system('...'), vim сам не обрабатывает ..., а вызывает оболочку, например: {shell} {shellcmdflag} {shellxquote}...{shellxquote}. Для вызова ack это будет что-то вроде ["/bin/bash", "-c", "ack -H --nocolor --nogroup --literal #body"], поэтому bash будет игнорировать все после --literal, потому что # является символом комментария. Это не будет сделано для '#body', потому что комментарии внутри этой строки не возможны.