Ответ 1
Вы просто префикс их с обратной косой чертой
:!echo %
выводит текущее имя файла буфера
:!echo \%
печатает одиночный символ "%"
Я использую 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"
в строке состояния окна результатов и отображать ожидаемые результаты. Кавычки, похоже, также требуются.
Вы просто префикс их с обратной косой чертой
:!echo %
выводит текущее имя файла буфера
:!echo \%
печатает одиночный символ "%"
По-видимому, вам нужно несколько раз убежать, как упоминалось в проблема ack.vim:
:Ack \\\#foo
Это ошибка в 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 ...>
Я действительно не тестировал его...
У меня есть одно дополнение к @sehe answer: когда вы делаете !...
или system('...')
, vim сам не обрабатывает ...
, а вызывает оболочку, например: {shell} {shellcmdflag} {shellxquote}...{shellxquote}
. Для вызова ack это будет что-то вроде ["/bin/bash", "-c", "ack -H --nocolor --nogroup --literal #body"]
, поэтому bash будет игнорировать все после --literal
, потому что #
является символом комментария. Это не будет сделано для '#body'
, потому что комментарии внутри этой строки не возможны.