2011-12-30 4 views
2

Я хотел бы искать с использованием текущего имени файла в этом файле. Я уже знаю получение текущего имени файла, используя :call expand("%:p:h"). Поэтому я хотел бы использовать некоторую команду, например, /call expand("%:p:h") для поиска. Я пробовал это, но не смог, потому что vim разбирает эту функцию в буквальном смысле.Как искать, используя значение, возвращаемое функцией

ответ

1

Как правило, для вставки в командной строке (или только в режиме вставки) значение, возвращаемой некоторой функции, вы должны использовать следующий:

Ctrl + R= function_name() Введите

Кстати, вы сказали, что expand("%:p:h") возвращает текущее имя файла, но это не так: на самом деле он возвращает полный путь к текущему файлу, withou t имя_файла. Чтобы получить только имя файла без пути, вы должны использовать expand("%:t"). Пожалуйста, прочитайте :help expand, чтобы получить дополнительную информацию.

EDITED: В вашем случае, вы можете использовать решение с поиска регистр@/ что @ib предложил: это безопасный способ. Но если мне нужно просто найти имя файла в буфере, и если мое имя файла не содержит специальных символов, я бы использовал Ctrl + R= вместо этого.

Таким образом, все выражение для поиска текущего файла, является:

/\VCtrl + R=expand('%:t')ВведитеВведите

P.S.

\V в начале поискового образца означает «очень номагический» режим. Вы можете прочитать об этом здесь: :help \V

+1

При использовании регистра выражения при вводе шаблона поиска удобная опция, результат * не * тот же.Поскольку вы вставляете имя пути в интерактивном режиме, даже если вы избегаете последовательности обратного слэш с помощью 'escape (expand ('%'), '\')' (другие ловушки отменены «очень номагическим» режимом, это правильно), вы необходимо избежать символа, который используется для начала поиска ('/' или '?'). И вот улов: нельзя защищать вхождения обоих этих символов независимо от направления поиска! (Escape из '?' В прямом поиске преобразует знак вопроса в ''? Атом.) –

+1

Я использовал 'expand ("%: t ")' в своем выражении, и я объяснил, почему я это сделал. Этого уже достаточно, чтобы сказать, что результат не тот. И в этом случае почти никогда не нужно что-то скрывать с помощью '\ V'. Ну, но следующее выражение абсолютно равно тому, что вы предположили: '/ \ V = escape (expand ('%: p: h'), '\') ' и, ну, я действительно не понимаю почему вы предлагаете избегать символов '' \ '', потому что Vim всегда использует«/»« путь »(как на моих машинах Windows, так и на Linux). Если мне нужно убежать, я бы избежал символов '/? ''. –

+0

На самом деле выражение поиска из вашего последнего комментария делает * not * одинаковым в каждом случае. Легко видеть: например, откройте файл '/ tmp/test'. Команда поиска, которую вы предлагаете, будет искать пустой шаблон (в отличие от этой команды из моего ответа)! –

1

Если имя текущего файла не содержит символы, которые должны быть экранированы из-за синтаксиса шаблона 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(), этот способ расширения создает новый . Так как имя пути вставлено в интерактивном режиме, необходимо также вывести символ, который используется для запуска команды поиска (/ или ?). К сожалению, это невозможно защитить вхождения обоих этих символов независимо от направление поиска: экранирование ? в прямом поиске преобразует вопрос знак в \? атом, искажающий узор.

1

Там есть функция в 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()|. 
+0

Опасайтесь использования этой команды: Если текущее имя файла содержит специальный символ, мешающий синтаксису шаблона поиска Vim, команда работает неправильно! –

+0

Вызов функции 'search()' уступает использованию команд поиска. Например, шаблон поиска не запоминается в последнем регистре поиска, поэтому переход к следующему/предыдущему вхождению шаблона невозможен с использованием команд 'n' /' N' по умолчанию. То же самое относится к добавлению пользовательских шаблонов подсветки с помощью команды ': match' или' matchadd() '. –

+0

Обратите внимание, что имя файла в последней команде не выполнено правильно! Например, если это имя файла содержит обратную косую черту, оно может значительно исказить шаблон. –