【问题标题】:Vim Ack, Ag: Search in directory of file that you are editing inVim Ack, Ag:在您正在编辑的文件目录中搜索
【发布时间】:2023-03-27 03:11:01
【问题描述】:

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

【问题讨论】:

    标签: vim ack ag


    【解决方案1】:

    表达式寄存器"= 将让您计算表达式并放置/粘贴输出。在命令行上使用<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
    

    【讨论】:

      【解决方案2】:

      如果目录没有其他子目录(否则是递归搜索):

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

      在哪里,

      • :cd %:p:h 将目录更改为当前文件的位置
      • :Ag&lt;CR&gt;如果有fzf-vim直接进入交互搜索窗口

      “交互式搜索”是指动态自定义搜索模式(尝试通配符,测试是否添加更多关键字,...)

      另一方面,如果您不需要交互式搜索,那么您确定要查找的内容,那么:

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

      【讨论】:

        【解决方案3】:

        使用:exe[cute]:

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

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

        【讨论】:

        • 感谢@phd 在我的设置中它可以在没有点的情况下工作。现在我只需要找到一种方法如何使它与单个命令一起工作,这样我就可以开始输入搜索模式了。我将命令映射到映射&lt;Leader&gt;a :exe 'Ack searchpattern' expand('%:p:h'),但我仍然需要向后滚动才能将光标返回到搜索模式。任何想法如何使这项工作使光标定位在正确的位置?
        【解决方案4】:

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

        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
        

        【讨论】:

        • 我想使用它,但由于我对 vimscripts 非常不熟悉,我无法测试它。只需将其粘贴到我的 vimrc 文件中即可得到Function name does not match script file name
        • @Flov 它遵循自动加载函数约定,因此您将函数放入 ~/.vim/autoload/filename.vim。自动加载的帮助非常好,但是如果你不知道那是什么,你就不知道去那里看看!感谢关注
        猜你喜欢
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-18
        • 2014-01-29
        • 1970-01-01
        • 2011-06-15
        • 2018-01-08
        相关资源
        最近更新 更多