Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在vim中打开与当前文件位于同一文件夹中的文件_Unix_Vim_Vi - Fatal编程技术网

Unix 在vim中打开与当前文件位于同一文件夹中的文件

Unix 在vim中打开与当前文件位于同一文件夹中的文件,unix,vim,vi,Unix,Vim,Vi,在vim中,当我打开一个缓冲区时,我通常需要在该文件所在的目录中加载另一个文件,但由于我通常不将cd放入其中,因此pwd是一个父文件夹,因此每次我都必须重新键入路径。这有捷径吗?还是将pwd更改为文件所在目录的方法 例如: cd /src vi lib/foo/file.js lib/foo有两个文件:file.js和file2.js 在第六章: :e file2.js # doesn't work 将此行添加到vimrc配置中 autocmd BufEnter * cd %:p:h %

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

例如:

cd /src
vi lib/foo/file.js
lib/foo有两个文件:
file.js
file2.js

在第六章:

:e file2.js  # doesn't work

将此行添加到
vimrc
配置中

autocmd BufEnter * cd %:p:h
%当前文件名
:p扩展到完整路径
:h头(最后一个路径组件已移除)

有关更多信息,请参见
:帮助展开

尝试以下操作:

:e %:p:h/file2.js

另一个选择是:

:e <Tab> 
:e

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

您可能知道,一旦进入vim,就可以使用

:cd lib/foo
:e <C-R>%
要更改为lib/foo

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

:cd %:p:h
你可以随时使用

:pwd
检查您当前的工作目录

当然,如果您忘记了要编辑的文件,只需点击“快捷键”前面的ctrl-g.

,您是否查看了
:Sex
命令?这将以拆分方式打开文件浏览器,以便轻松打开其他文件<代码>:Sex
默认为当前缓冲区的目录。如果我自己这么说的话,这是一个非常漂亮的功能。
我把它绑定到
;o
便于访问:

map ;o :Sex <CR>
map;o:性

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

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

autocmd BufEnter * lcd %:p:h

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

我的
中有以下三行代码。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>
map,e:e=expand(“%:p:h”)。"/" 
map,t:tabe=expand(“%:p:h”)。"/" 
映射,s:split=expand(“%:p:h”)。"/" 

现在
,e
在这个缓冲区上打开
、t
、s
的操作相同,但在一个新的选项卡/拆分窗口上。

一个简单的方法是使用autochdir设置。在您的.vimrc中尝试以下操作:

set autochdir
这将把vim的工作目录更改为您打开的文件的目录


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

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

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

使用autochdir的解决方案有其自身的缺陷。例如,由于标记是用相对路径定义的,或者在当前目录中需要Makefile或pom.xml,所以必须保持在当前目录中

你可以用

:cd lib/foo
:e <C-R>%
:e%
然后通过删除当前文件的名称修改路径并输入新文件。 或 使用地图

nnoremap <leader>e :edit <C-R>=fnamemodify(@%, ':p:h')<CR>/
nnoremap e:edit=fnamemodify(@%,':p:h')/
然后按\e或,e(取决于引线设置),您将收到打开当前文件所在目录的命令,您可以手动完成此命令,并可以使用ctrlD显示当前文件目录中的所有文件

或者。 你可以试试这个插件

钥匙
0f

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

这不起作用,因为我的工作目录不是我正在编辑的文件所在的目录。这很好,谢谢。现在来了解这个
%:p:h
的意思:)这个网站在查找vim资料时帮了我很多忙:请注意,这个功能可能会破坏插件,如:help'autochdir'中所述。太棒了。我希望文件能在另一个窗格中打开!哦,那是
:Ex
。我喜欢分裂,所以我这么想。我会编辑它的答案。呵呵,不,我知道,我的意思是保留拆分,但是当你打开一个文件时,它会在另一个窗格中打开,而不是在文件列表中。抱歉,如果这太迂腐了,但我想你的意思是“窗口”而不是“窗格”。只有当Vim是用netbeans集成或Sun visual workshop集成构建的时候,它才可用。前者比后者更常见,但两者都没有内置的情况并不少见。这就是为什么gregf的答案测试是否存在有效的“autochdir”选项。autochdir也是一个难题,因为它在尝试加载文件之前切换目录,因此如果在命令行上执行
gvim path/to/file.c
操作,它将cd放入path/to,然后尝试打开path/to/file.c,在不存在的位置为您提供空缓冲区:((无论如何,在Windows上是64位7.2。)这改变了我的生活。这是我最喜欢的解决方案。我不喜欢自动更改到当前文件目录的想法。我更喜欢在项目的根目录中打开vim,这意味着
:e
总是从顶部向下钻取。到目前为止,如果我想在同一目录中打开文件,请选择a如果是当前文件,我会使用打开netrw文件资源管理器的
:E
。使用
,E
映射感觉要快得多。您可以在当前目录中的文件之间进行切换,这太棒了。同意您的说法。此外,如果我不必更改目录,则总是会有
:cd%:h
我已经使用了两天,现在还没有你知道我在没有它的情况下是如何工作的。很好的提示。标签可以“递归地”找到。我们的标签在源根目录下的一个_标签/文件夹中。
set Tags=_标签/标签;c:/work
的意思是“直到你找到某个东西为止”