Vim Ack, Ag: поиск в каталоге файла, который вы редактируете в - PullRequest
0 голосов
/ 16 января 2020

Я хочу иметь возможность искать файлы, которые находятся только в каталоге файла, который я открыл внутри vim.

Документальный фильм Ack говорит:

:Ack[!] [options] {pattern n} [{directory}]                               *:Ack*

Search recursively in {directory} (which defaults to the current
directory) for the {pattern}.  Behaves just like the |:grep| command, but
will open the |Quickfix| window for you. If [!] is not given the first
occurrence is jumped to.

On VimFandom Я обнаружил, что могу получить текущий каталог файла с помощью echo expand('%:p:h'), но как я могу получить это для оценки в команде Ack?

Мне нужно что-то вроде этого:

:Ack searchpattern expand('%:p:h')

Ответы [ 3 ]

2 голосов
/ 16 января 2020

Регистр выражений, "=, позволит вам оценить выражение и вставить / вставить вывод. Использование <c-r> в командной строке вставит содержимое из регистра.

:Ack pat <c-r>=expand('%:p:h')<cr>

Для получения дополнительной информации см.

:h "=
:h i_CTRL-R

Использование :grep вместо :Ack

Вы можете установить 'grepprg' на использование поисковика серебра или другого инструмента, похожего на grep, например, ripgrep.

set grepprg=ag\ --vimgrep\ $*
set grepformat=%f:%l:%c:%m

:grep понимает % и :h в качестве параметров. Это означает, что вы можете сделать:

:grep pat %:h

Для получения дополнительной помощи см .:

:h 'grepprg'
:h :grep
0 голосов
/ 17 января 2020

У меня есть небольшое сопоставление для таких случаев: %% вставляет каталог текущего файла.

cnoremap <expr> %% filename#command_dir('%%')

И определение функции:

function filename#command_dir(keymap) abort
  if getcmdtype() isnot# ':'
    return a:keymap
  endif
  let l:dir = expand('%:h')
  return empty(l:dir) ? '.' : (dir.'/')
endfunction
0 голосов
/ 16 января 2020

Использование :exe[cute]:

:exe 'Ack searchpattern ' . expand('%:p:h')

. (точка) означает объединение строк.

...