Как искать, используя значение, возвращаемое функцией - PullRequest
2 голосов
/ 30 декабря 2011

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

Ответы [ 3 ]

1 голос
/ 30 декабря 2011

В 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()|.
1 голос
/ 30 декабря 2011

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

Ctrl + R = function_name () Enter

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

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

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

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

PS

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

1 голос
/ 30 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...