0

我希望能够搜索仅驻留在我在 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')

4

4 回答 4

2

表达式寄存器"=将让您评估表达式并放置/粘贴输出。在命令行上使用<c-r>将插入寄存器中的内容。

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

如需更多帮助,请参阅:

:h "=
:h i_CTRL-R

使用:grep代替:Ack

您可以设置'grepprg'为使用 silver searcher 或其他类似 grep 的工具,例如 ripgrep。

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

:grep理解%:h作为参数。这意味着您可以执行以下操作:

:grep pat %:h

如需更多帮助,请参阅:

:h 'grepprg'
:h :grep
于 2020-01-16T16:02:34.707 回答
1

如果目录没有更多的孩子(否则是递归搜索):

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>
于 2020-05-12T18:30:09.107 回答
0

使用:exe[cute]

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

.(dot) 表示字符串连接。

于 2020-01-16T16:12:47.767 回答
0

对于这样的情况,我有一点映射:%%插入当前文件的目录。

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
于 2020-01-17T20:40:53.187 回答