如何在源文件本身中获取源文件的当前路径

问题描述 投票:0回答:2

在 VIM 脚本文件中,您可以访问

<sfile>
,如本问题和答案中所示 所示。这个答案中的一些例子:

" Absolute path of script file:
let s:path = expand('<sfile>:p')

" Absolute path of script file with symbolic links resolved:
let s:path = resolve(expand('<sfile>:p'))

" Folder in which script resides: (not safe for symlinks)
let s:path = expand('<sfile>:p:h')

TMUX 支持使用

source-file
获取额外资源的能力(请参阅有关拆分 TMUX 配置文件的 StackOverflow 问题和答案)。

现在,回答我的问题。假设在我的

~/.tmux.conf
的示例中,我有如下一行

source-file ~/some-workspace-dir/my-tmux.conf

我希望能够在

my-tmux.conf
内引用与
my-tmux.conf
相关的文件。

如果我添加

run-shell "pwd"
,它只会指出位于
~/.tmux.conf
的主目录,而不是
~/some-workspace-dir
,即包含
my-tmux.conf
的目录。

我的问题是如何获取 TMUX 来源的文件的当前路径

source-file
(不解析来源文件)?

tmux
2个回答
2
投票

我建议将您调用的文件从 tmux 配置转换为 shell 脚本,并通过

run-shell
而不是
source-file
调用它 - 这样您就可以使用例如
dirname
/
basename
导出源文件的路径。

将 tmux 配置转换为 shell 脚本通常很简单,只需在每个命令前面加上 tmux 的路径前缀即可,即以 hello_world.tmux 开头:

command-prompt -p "enter a name: " "display-message 'hello %1!'"

...这变成了 hello_world.sh:

#!/bin/bash
/usr/local/bin/tmux command-prompt -p "enter a name: " "display-message 'hello %1!'"

这是一个演示实际反思的脚本:

#!/bin/bash
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
BASENAME=$(basename "$0")
tmux split-window -v
sleep 1
tmux send-keys -t :.1 "cat $CURRENT_DIR/$BASENAME"

如果您从 tmux 内部运行此 shell 脚本,它将确定自己在文件系统上的路径,然后在 tmux 内部创建一个新窗格,并向在该窗格内运行的 shell 发送一个 cat 命令,打印 shell 脚本自己的源代码。

这里是 Asciinema 截屏视频,演示了正在运行的脚本:https://asciinema.org/a/418522


1
投票

自首次回答以来,正确答案似乎已发生变化。 tmux 3.2 添加了一个选项,可以使问题变得微不足道 ^1 ^2。在您要查找的文件配置文件中(即:~/.tmux.conf 或 ~/.config/tmux/tmux.conf):

run-shell "#{d:current_file}/path/to/plugin.tmux"
#            | ^ crux of the issue
#            ^ dirname

tmux 的手册页表明给予

run-shell
的命令是使用 tmux 的模板语法 ^3 进行格式化的。 FORMATS 部分指示有一个名为
current_file
的变量,可用于定位当前正在执行的配置文件。此外,前缀
d:
可用于获取该文件的目录名。因此,
#{d:current_file}
将获取配置目录。

© www.soinside.com 2019 - 2024. All rights reserved.