Как я могу избежать символов% и # в команде Vim? - PullRequest
11 голосов
/ 15 апреля 2011

Я использую 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" в строке состояния окна результатов и выведет ожидаемые результаты.Цитаты, похоже, тоже нужны.

Ответы [ 4 ]

10 голосов
/ 15 апреля 2011

Вы просто ставите перед ними обратную косую черту

:!echo %

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

:!echo \%

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

4 голосов
/ 08 апреля 2014

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

:Ack \\\#foo
2 голосов
/ 15 апреля 2011

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

2 голосов
/ 15 апреля 2011

Это ошибка в 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 ...>

Я действительно не проверял это ...

...