【问题标题】:Opening files in the same folder as the current file, in vim在 vim 中打开与当前文件相同的文件夹中的文件
【发布时间】:2010-12-15 01:59:45
【问题描述】:

在 vim 中,当我打开缓冲区时,我经常需要在该文件所在的同一目录中加载另一个文件,但由于我通常不将 cd 放入其中,pwd 是父文件夹,所以我每次都必须重新输入路径。这有捷径吗?或者将 pwd 更改为文件所在目录的方法?

示例:

cd /src
vi lib/foo/file.js

lib/foo 有两个文件:file.jsfile2.js

在 vi 中:

:e file2.js  # doesn't work

【问题讨论】:

    标签: unix vim vi


    【解决方案1】:

    :Ex 的缩写 :Explore 完全符合您的要求。

    【讨论】:

    • 这似乎是最简单的解决方案。
    • 这可以让你创建一个新文件吗?
    • 在 Ex 中按 %,它会要求您提供一个新文件。 @JacobSharf
    • 我更喜欢:Sex
    【解决方案2】:

    我的.vimrc 上有以下三行:

    map ,e :e <C-R>=expand("%:p:h") . "/" <CR>
    map ,t :tabe <C-R>=expand("%:p:h") . "/" <CR>
    map ,s :split <C-R>=expand("%:p:h") . "/" <CR>
    

    现在,e &lt;some-file&gt; 在此缓冲区上打开。 ,t,s 做同样的事情,但在一个新的选项卡/拆分窗口上。

    【讨论】:

    • 这是我最喜欢的这里发布的解决方案。我不喜欢自动切换到当前文件目录的想法。我更喜欢在项目的根目录中打开 vim,这意味着 :e 总是从顶部向下钻取。到目前为止,如果我想打开与当前文件位于同一目录中的文件,我会使用:E,它会打开 netrw 文件资源管理器。使用 ,e 映射感觉更快。您可以通过标签浏览当前目录中的文件,这很棒。
    • 同意你的看法。另外,如果我永远不必更改目录,那么总会有:cd %:h
    • 我已经用了两天了,我不确定没有它我是如何工作的。很棒的提示。
    【解决方案3】:

    较新版本的 vim 内置了 autochdir 命令,如果没有,您可以回退到类似 BufEnter 的设置。

    " set vim to chdir for each file
    if exists('+autochdir')
        set autochdir
    else
        autocmd BufEnter * silent! lcd %:p:h:gs/ /\\ /
    endif
    

    【讨论】:

    • 如果您要这样做,那么为什么不在打开文件之前首先将cd 放到该目录。在打开文件后,它们在访问其他目录方面同样受到限制吗?下面的@hgmnz 解决方案更加优雅和灵活。
    【解决方案4】:

    一个简单的想法是使用 autochdir 设置。在你的 .vimrc 中试试这个:

    set autochdir
    

    这会将vim的工作目录更改为您打开的文件所在的目录。

    注意:我不确定是哪个版本添加了此功能。我从 vim 6 更新到 7.2 以使其正常工作。

    【讨论】:

    • 仅当 Vim 使用 netbeans 集成或 Sun 可视化车间集成构建时才可用。前者比后者更常见,但两者都没有内置并不罕见。这就是 gregf 的答案测试是否存在有效的“autochdir”选项的原因。
    • autochdir 也很痛苦,因为它会在尝试加载文件之前切换目录,因此如果在命令行上执行 gvim path/to/file.c 它将 cd 进入 path/to 然后尝试打开 path/ to/file.c,在不存在的位置为您提供一个空缓冲区。 :((无论如何,Windows 上是 64 位 7.2。)
    • 这改变了生活。
    【解决方案5】:

    尝试以下方法:

    :e %:p:h/file2.js
    

    【讨论】:

    • 这是最通用的解决方案的最短答案。了解 %:p:h/ 作为当前路径的快捷方式,有助于将其应用于可能需要当前路径的任何其他情况,例如 :r:w、...
    • :sp %:h/file2.js 似乎也有效。或者,可以使用:sp %&lt;tab&gt;,然后根据需要编辑文件名。
    • 似乎 %:p:h 是绝对路径,而 %:h 是当前文件目录的相对路径
    【解决方案6】:

    将此行添加到您的 vimrc 配置中

    autocmd BufEnter * cd %:p:h
    

    % 当前文件名
    :p 展开到完整路径
    :h head (最后一个路径组件被移除)

    更多信息请参见:help expand

    【讨论】:

    • 效果很好,谢谢。现在来了解%:p:h 的含义:)
    • 这个网站在查找 vim-stuff 时帮助了我很多:rayninfo.co.uk/vimtips.html
    • 请注意,此功能可能会破坏插件,如 ":help 'autochdir'" 中所述。
    【解决方案7】:

    使用 autochdir 的解决方案有其自身的缺陷。例如,您必须留在您所在的目录,因为标签是使用相对路径定义的,或者您需要当前目录中的 Makefile 或 pom.xml。

    你可以使用

    :e <C-R>%
    

    然后通过删除当前文件的名称来修改路径并输入新的。 要么。 使用地图

    nnoremap <leader>e :edit <C-R>=fnamemodify(@%, ':p:h')<CR>/
    

    然后按 \e,e(取决于领导者设置)您将收到命令您当前文件所在的打开目录,您可以手动完成此命令,并且可以使用 ctrlD 显示当前文件目录中的所有文件。

    或者。 你可以试试0scan插件。

    0f

    【讨论】:

    • 标签可以“递归”找到。我们在源根目录的 _tags/ 文件夹中有我们的标签。 set tags=_tags/tags;c:/work 的意思是“向上直到找到匹配 _tags/tags 的内容,但如果你点击 c:/work 就停止。所以如果我正在编辑 c:/work/project/main/src/lib/subdir/file.c (从该文件的目录中)它仍然可以找到我的标记文件 c:/work/project/main/_tags/tags
    【解决方案8】:

    你可能知道,一旦你在 vim 中,你就可以使用

    :cd lib/foo
    

    改成 lib/foo.

    另一方面,要切换到您当前正在编辑的文件的目录,请尝试

    :cd %:p:h
    

    你可以随时使用

    :pwd
    

    检查您当前的工作目录。

    当然,如果您忘记了正在编辑的文件,只需按 ctrl-g。

    【讨论】:

    【解决方案9】:

    所以 vim 有一个 :find 命令,它将使用变量 'path'。如果您的代码具有一致的目录结构,例如目录“src”下的所有源代码,那么您只需将其添加到“路径”变量即可。然后,当您执行 :find foo.js 时,它将搜索您的当前位置和路径变量中列出的文件夹。它基本上模拟了 bash 或其他一些 shell 使用 PATH 变量来查找要运行的适当二进制文件的方式。

    【讨论】:

      【解决方案10】:

      在“捷径”方面,您查看过:Sex 命令吗?这会在拆分中打开文件浏览器,以便您可以轻松打开其他文件。 :Sex 默认为当前缓冲区的目录。非常漂亮的功能,如果我自己这么说的话。
      我将它绑定到;o 以便于访问:

      map ;o :Sex <CR>
      

      如果您想将其保留在当前缓冲区中而不是创建拆分,也可以使用:Ex

      【讨论】:

      • 太棒了。我希望文件能在另一个窗格中打开!
      • 哦,那是:Ex。我爱分裂,所以我是这样想的。我会编辑它的答案。
      • 呵呵不,我知道,我的意思是保持拆分,但是当你打开一个文件时,它会在另一个窗格中打开它,而不是在文件列表中。
      • 对不起,如果这太迂腐了,但我认为你们的意思是“窗口”而不是“窗格”。
      【解决方案11】:

      我把它放在我的 .vimrc 文件中,它会将当前目录更改为缓冲区中的文件。这将为缓冲区设置当前目录,并在您切换缓冲区时更新。

      autocmd BufEnter * lcd %:p:h
      

      【讨论】:

        【解决方案12】:

        另一种选择是:

        :e <Tab> 
        

        这会在您的工作目录中的文件夹中循环。

        【讨论】:

        • 这行不通,因为我的工作目录不是我正在编辑的文件所在的目录。
        猜你喜欢
        • 2014-10-28
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-05
        • 1970-01-01
        • 2018-02-14
        相关资源
        最近更新 更多