我希望在tmux
开始后立即刷新htop
窗格标题,因此我在config.fish
中添加了别名:
alias h "htop;tmux refresh-client -S"
但它什么都没做。我也试过延迟:
alias h "htop;sleep 0.1;tmux refresh-client -S"
这也没有做任何事情 - tmux
仅在默认间隔后仍然刷新,这对我来说太长了,你只能将它减少到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 /),因为函数文件是自动加载的,所以鱼赢了。知道这件事。