Tmux刷新来自fish shell别名的客户端调用

时间:2017-11-16 03:45:44

标签: tmux fish

我希望在tmux开始后立即刷新htop窗格标题,因此我在config.fish中添加了别名:

alias h "htop;tmux refresh-client -S"

但它什么都没做。我也试过延迟:

alias h "htop;sleep 0.1;tmux refresh-client -S"

这也没有做任何事情 - tmux仅在默认间隔后仍然刷新,这对我来说太长了,你只能将它减少到1秒而不是更少。

我做错了什么,甚至可能我想做什么?

1 个答案:

答案 0 :(得分:1)

当我们从等式中删除alias时,可能会更容易看到这一点:

echo banana; sleep 5s; echo sausage

将回复" banana",等待5秒钟,然后再打印"香肠",所以

htop; tmux refresh-client -S

将运行htop,等到它完成然后然后运行tmux refresh-client -S,此时鱼将再次成为前台进程。

需要做的是让shell与tmux集成。现在,显然tmux有OWASP XSS Prevention Cheat Sheet的转义序列,所以

printf '\ekhtop\e\\' # \e is \033 - the escape character

将窗口标题更改为" htop"。

Fish有函数可以绑定的事件,比如

function tmux_name --on-event fish_preexec
    printf '\ek%s\e\\' "$argv" # the argument for preexec is the commandline about to be executed
end

将tmux窗口名称始终设置为命令行。当命令完成时,它不会重置它,所以我们需要第二个函数

function tmux_reset_name --on-event fish_postexec
     # $argv for postexec is also the commandline
     # so we can't use it. Just hardcode "fish".
     printf '\ek%s\e\\' fish 
end

这不是完美的或任何东西 - 即使是非常短的命令,它仍然会设置标题,即使是长命令也可以使用完整的命令行(可能只使用$ argv [1]会更好)。

请注意,必须在config.fish中定义这些函数或由它明确提供的文件(或〜/ .config / fish / conf.d /),因为函数文件是自动加载的,所以鱼赢了。知道这件事。