![Vim - 状态栏和链接](https://linux22.com/image/55618/Vim%20-%20%E7%8A%B6%E6%80%81%E6%A0%8F%E5%92%8C%E9%93%BE%E6%8E%A5.png)
鉴于这种情况:
cd ~/temp
ln -s /var/lib/alsa alsa
cd alsa
pwd -> /home/<username>/temp/alsa
但是如果我在 的目录输出中打开某个文件pwd
,vim
状态行会显示:
/var/lib/alsa/asound.state
我怎样才能让它显示pwd
结果,而不是点击链接?
我在用着:
set statusline=%F%=%m\ %y\ \%r\ %1*\ \%l\:\%c\ \%2*\ \ \%p%%\ \
答案1
您不能直接使用 vim 执行此操作,vim 始终会解析链接以查找实际文件的名称。
从:h E773
:
For symbolic links Vim resolves the links to find the name of the actual file.
The swap file name is based on that name. Thus it doesn't matter by what name
you edit the file, the swap file name will normally be the same.
您可以使用外部命令获取当前工作目录以及%f
状态行。
尝试:
set statusline=%{system('echo\ -n\ $\(pwd\ -L\)')}/%f%=%m\ %y\ \%r\ %1*\ \%l\:\%c\ \%2*\ \ \%p%%\ \
了解更多信息:
:h E773
:h todo.txt
:h version7.txt
答案2
@Gnouc 的答案是正确的方向,但你不能从内部调用外部命令状态行评估!这将在每次光标移动和键入字符时生成一个新进程,并降低 Vim 的性能(正如您所经历的)。
最好将其分为两部分::autocmd
每当当前缓冲区发生变化时更新变量,以及在状态行本身中非常有效地消耗该变量:
set statusline=%{exists('b:actualCwd')?b:actualCwd:getcwd()}/%f%=%m\ %y\ \%r\ %1*\ \%l\:\%c\ \%2*\ \ \%p%%\ \
autocmd BufEnter * let b:actualCwd = system('echo -n $(pwd -L)')