Vim Ack, Ag: Поиск в каталоге файла, который вы редактируете.

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

В документальном фильме Акка говорится:

: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.

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

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

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


person Flov    schedule 16.01.2020    source источник


Ответы (4)


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

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

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

:h "=
:h i_CTRL-R

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

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

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

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

:grep pat %:h

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

:h 'grepprg'
:h :grep
person Peter Rincker    schedule 16.01.2020

Если в каталоге нет дочерних элементов (в противном случае выполняется рекурсивный поиск):

nnoremap <leader>f <Esc>:cd %:p:h<CR><Esc>:Ag<CR>

Где,

  • :cd %:p:h изменяет каталог на местоположение текущего файла
  • :Ag<CR> сразу переходит в окно интерактивного поиска, если у вас есть fzf-vim

Под «интерактивным поиском» я подразумеваю динамическую настройку вашего шаблона поиска (попробуйте подстановочный знак, проверьте, добавили ли вы больше ключевых слов, ...)

С другой стороны, если вам не нужен интерактивный поиск, вы уверены, что ищете, то:

nnoremap <leader>f <Esc>:cd %:p:h<CR><Esc>:Ag<Space>
person Xopi García    schedule 12.05.2020

Используйте :exe[cute]:

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

. (точка) означает конкатенацию строк.

person phd    schedule 16.01.2020
comment
Спасибо @phd, в моей настройке все работает без точки. Теперь мне просто нужно найти способ заставить его работать с помощью одной команды, чтобы я мог начать вводить поисковый шаблон. Я сопоставил команду с картой <Leader>a :exe 'Ack searchpattern' expand('%:p:h'), но мне все равно нужно прокрутить назад, чтобы вернуться с помощью курсоров к шаблону поиска. Любые идеи, как заставить это работать, чтобы курсор располагался в нужном месте? - person Flov; 17.01.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
person D. Ben Knoble    schedule 17.01.2020
comment
Я хотел бы использовать это, но, поскольку я ужасно не знаком с vimscripts, у меня возникли проблемы с его тестированием. Просто вставив это в мой файл vimrc, я получаю Function name does not match script file name - person Flov; 18.01.2020
comment
@Flov следует соглашению о функциях автозагрузки, поэтому вы помещаете функцию в ~/.vim/autoload/filename.vim. Справка по автозагрузке довольно хороша, но вы не знаете, куда смотреть, если не знаете, что это такое! Спасибо за внимание - person D. Ben Knoble; 18.01.2020