在 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 配置转换为 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
自首次回答以来,正确答案似乎已发生变化。 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}
将获取配置目录。