当存在符号链接时,在VIM中获取逻辑路径

8

我有以下的设置:

mkdir /1
mkdir /1/2
mkdir /1/2/3
ln -s /1/2/3 /1/3

如果我执行cd /1/3,然后执行pwd,我会得到/1/3。如果我使用pwd -P,我可以得到/1/2/3,或者使用pwd -L强制得到/1/3
在VIM中,我想要得到/1/3路径。如果我打开一个文件/1/3/foo.txt,并且使用像fnamemodify(bufname(winbufnr(0)), ':p:h')这样的命令,它会返回/1/2/3。如何让它给我与pwd相同的目录?

你可能想编辑一下你所尝试做的事情的“为什么”,因为我认为vim的行为是正确的。 - dwc
这是一个复杂的构建系统(基于ClearCase),其中主要源代码位于 /code/comp/subcomp/src 等位置,但工作树却在 /tree/tree1/build/comp 等位置。 - Mikeage
2个回答

9

除了通过system('pwd -L')之外,似乎您无法解决此问题。根据vim_use邮件列表,Vim现在会自动解析符号链接。

请参阅:h E773周围的文本以了解原理;如果Vim按符号链接而不是解析后的文件名进行操作,则可以使用两个不同名称的缓冲区打开相同的文件,并且Vim将变得混乱,试图找出交换文件应该位于何处。还请参见:h version7.txt:

Unix:通过符号链接编辑文件时,交换文件将使用符号链接的名称。现在使用实际文件的名称,以便检测到两次编辑同一文件。


好的,跟进问题。如果我使用“vim 1/3/foo.txt”运行vim,如何使用system('pwd -L')?如果我使用cd %:p:h更改目录,我已经跳转到符号链接/1/2/3/中了。 - Mikeage
如果你使用 :cd 命令进入了该目录,我不确定此时是否还有其他可行的操作。你可以执行一些可怕的命令,例如 system('cd "' . expand('%:h') . '"; pwd -L'),在进入 Vim 之前进行操作,但是我不确定你使用这个命令的目的是什么,这可能并不足够。 - Brian Carper
我理解其中的原因,但是我已经设置了 set noswapfile,而且我更喜欢获取文件的逻辑路径而不是物理路径。 - Matt

1

简短回答:

您可以使用挂载绑定来替代符号链接。请参见man mount

详细回答:

我有一个类似的问题,因为我有一个指向已挂载分区的短符号链接。

/e -> /media/iam/ext4test

我还有一个符号链接 ~/.vimrc -> /e/configs/.vimrc
当我尝试进入包含目录中的Netrw时遇到了麻烦(我停留在~,但我无法找到一个稳定的方法来避免这种情况,同时保持使用书签等的愿望)。
我的解决方案是,在考虑更改挂载点之后,您可以添加挂载点。因此,在unlink e之后,我使用mount --bind /media/iam/ext4test /e
现在,如果我在/e/configs/.vimrc中并使用:edit .(或:e.等),它将使我进入包含目录中的Netrw。

编辑:

mount --bind命令会进行瞬态更改。对于永久绑定挂载,我将以下内容添加到/etc/fstab中,
# <file system>      <mount point>  <type>  <options>  <dump>  <pass>
/media/iam/ext4test  /e             none    bind       0       0

一般来说,这可能是一个有用的替代方案,但它需要 root 权限,并且不适用于许多不同的映射。在原始问题的情况下,这是一个构建系统,位于共享服务器上,可能托管五十甚至五百个源树,因此它并不相关。 - Mikeage
我有点懒,本应该提出一个新的问题并回答,但是你的问题至少包含了我正在使用的一些搜索词。由于我的答案的一部分在这里,也就是说,Vim与我期望的行为方式不兼容,所以我把我的解决方法附加到了这个页面上。这里有一个笑话:你试过Emacs吗?它可能会按照你的预期处理符号链接。(尽管我不太合格考虑托管等问题。)开个玩笑,我相信你使用Vim有很多原因。 - Brady Trainor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接