Я хотел бы искать с использованием текущего имени файла в этом файле. Я уже знаю получение текущего имени файла, используя :call expand("%:p:h")
. Поэтому я хотел бы использовать некоторую команду, например, /call expand("%:p:h")
для поиска. Я пробовал это, но не смог, потому что vim разбирает эту функцию в буквальном смысле.Как искать, используя значение, возвращаемое функцией
ответ
Как правило, для вставки в командной строке (или только в режиме вставки) значение, возвращаемой некоторой функции, вы должны использовать следующий:
Ctrl + R= function_name() Введите
Кстати, вы сказали, что expand("%:p:h")
возвращает текущее имя файла, но это не так: на самом деле он возвращает полный путь к текущему файлу, withou t имя_файла. Чтобы получить только имя файла без пути, вы должны использовать expand("%:t")
. Пожалуйста, прочитайте :help expand
, чтобы получить дополнительную информацию.
EDITED: В вашем случае, вы можете использовать решение с поиска регистр@/
что @ib предложил: это безопасный способ. Но если мне нужно просто найти имя файла в буфере, и если мое имя файла не содержит специальных символов, я бы использовал Ctrl + R= вместо этого.
Таким образом, все выражение для поиска текущего файла, является:
/\V
Ctrl + R=expand('%:t')
ВведитеВведите
P.S.
\V
в начале поискового образца означает «очень номагический» режим. Вы можете прочитать об этом здесь: :help \V
Если имя текущего файла не содержит символы, которые должны быть экранированы из-за синтаксиса шаблона Vim (см :help pattern
), то можно просто ввести
/
Ctrl + R%
В противном случае нужно подготовить текущее имя файла, поместить его в последний регистр поиска ,
:let @/ = '\V' . escape(expand('%:p:h'), '\')
и выдает команду поиска вручную с помощью n
/N
, /
Введите или ?
Введите. Чтобы уменьшить типизацию, отображениями, объединяющими эти этапы, могут быть введены .
nnoremap <expr> <leader>f/ ExpandSearch('/')
nnoremap <expr> <leader>f? ExpandSearch('?')
function! ExpandSearch(dir)
let @/ = '\V' . escape(expand('%:p:h'), '\')
return a:dir . "\r"
endfunction
Существует также похож на Ctrl + R% но более общая команда Функция расширения линии, регистр экспрессии. Можно ввести Ctrl + R= при редактировании шаблона поиска, введите выражение (см :help expression
), и результат его оценки будет вставляется прямо в том месте, где Ctrl + = нажатий клавиш был нажат. К сожалению, помимо обычных проблем с экранированием выше с атомом \V
и вызовом escape()
, этот способ расширения создает новый . Так как имя пути вставлено в интерактивном режиме, необходимо также вывести символ, который используется для запуска команды поиска (/
или ?
). К сожалению, это невозможно защитить вхождения обоих этих символов независимо от направление поиска: экранирование ?
в прямом поиске преобразует вопрос знак в \?
атом, искажающий узор.
Там есть функция в Vim называется search()
, который будет перемещать курсор на ваш шаблон:
:call search(expand("%:p:h"))
Там другая функция называется matchadd()
, который подчеркнет ваш шаблон:
:call matchadd('Search', expand("%:p:h"))
Если имя файла содержит специальные символы , например .*[]
, вы должны позвонить по телефону escape()
:
:call search(escape(expand("%:p:h"), '.*[]'))
search({pattern} [, {flags} [, {stopline} [, {timeout}]]]) *search()*
Search for regexp pattern {pattern}. The search starts at the
cursor position (you can use |cursor()| to set it).
matchadd({group}, {pattern}[, {priority}[, {id}]])
Defines a pattern to be highlighted in the current window (a
"match"). It will be highlighted with {group}. Returns an
identification number (ID), which can be used to delete the
match using |matchdelete()|.
escape({string}, {chars}) *escape()*
Escape the characters in {chars} that occur in {string} with a
backslash. Example:
:echo escape('c:\program files\vim', ' \')
results in:
c:\\program\ files\\vim
Also see |shellescape()|.
Опасайтесь использования этой команды: Если текущее имя файла содержит специальный символ, мешающий синтаксису шаблона поиска Vim, команда работает неправильно! –
Вызов функции 'search()' уступает использованию команд поиска. Например, шаблон поиска не запоминается в последнем регистре поиска, поэтому переход к следующему/предыдущему вхождению шаблона невозможен с использованием команд 'n' /' N' по умолчанию. То же самое относится к добавлению пользовательских шаблонов подсветки с помощью команды ': match' или' matchadd() '. –
Обратите внимание, что имя файла в последней команде не выполнено правильно! Например, если это имя файла содержит обратную косую черту, оно может значительно исказить шаблон. –
При использовании регистра выражения при вводе шаблона поиска удобная опция, результат * не * тот же.Поскольку вы вставляете имя пути в интерактивном режиме, даже если вы избегаете последовательности обратного слэш с помощью 'escape (expand ('%'), '\')' (другие ловушки отменены «очень номагическим» режимом, это правильно), вы необходимо избежать символа, который используется для начала поиска ('/' или '?'). И вот улов: нельзя защищать вхождения обоих этих символов независимо от направления поиска! (Escape из '?' В прямом поиске преобразует знак вопроса в ''? Атом.) –
Я использовал 'expand ("%: t ")' в своем выражении, и я объяснил, почему я это сделал. Этого уже достаточно, чтобы сказать, что результат не тот. И в этом случае почти никогда не нужно что-то скрывать с помощью '\ V'. Ну, но следующее выражение абсолютно равно тому, что вы предположили: '/ \ V = escape (expand ('%: p: h'), '\') ' и, ну, я действительно не понимаю почему вы предлагаете избегать символов '' \ '', потому что Vim всегда использует«/»« путь »(как на моих машинах Windows, так и на Linux). Если мне нужно убежать, я бы избежал символов '/? ''. –
На самом деле выражение поиска из вашего последнего комментария делает * not * одинаковым в каждом случае. Легко видеть: например, откройте файл '/ tmp/test'. Команда поиска, которую вы предлагаете, будет искать пустой шаблон (в отличие от этой команды из моего ответа)! –