(got one possible solution on stack overflow : https://stackoverflow.com/a/51769020/9497573)
编辑为更准确
我尝试使屏幕中窗口的标题自动等于工作目录的路径加如果有一个(例如:npm 启动或者vim 文件.js)
为此,我在我的中添加了这些行.zshrc
:
precmd () {
local action = action_to_define
if [[ $TERM == screen* ]]; then
printf -Pn '\ek%~ $action\e\\'
fi
}
这(以某种方式)将路径作为标题发送到屏幕(参见斯特凡·查泽拉斯的回答)
如果存在,该变量action
将打印正在运行的程序
我尝试过,local action= $(history | tail -1 | sed 's#[0-9 ]*##') | grep vim
因为这选择了历史记录中最后一个命令的提示(就像识别history !!
该选项时所做的那样!!
,这不是出于某种原因......)
因为local action= $(ps -lr | tail -1 | sed 's#^.*:...##')
这选择了正在运行的进程的命令
但它不起作用,就好像该进程没有被捕获history
或ps
...可能precmd
在操作启动之前运行,所以我尝试了其他功能,例如preexec
或zshaddhistory
没有任何运气...
如何捕获正在运行的进程并将其放入标题中?
第一个发布的问题
我找到了这个:GNU Screen:新窗口名称更改它提供了一种通过修改 .zshrc 文件来完成某些操作的方法,并从屏幕手册的这一部分获取解释:https://www.gnu.org/software/screen/manual/screen.html#Dynamic-Titles
但是它只显示文件夹,而不显示文件,而且我不明白所解释的内容,所以我无法适应我的需要:这不仅仅是打印目录,还打印工作文件
到目前为止我对 .zshrc 文件脚本的理解:
precmd () {
local tmp='%~'
local HPWD=${(%)tmp}
if [[ $TERM == screen* ]]; then
printf '\ek%s\e\\' $HPWD
fi
}
-precmd ()
是一个在每个提示之前执行的函数(也可以是chpwd ()
)(src:http://tldp.org/HOWTO/Xterm-Title-4.html)
-local
表示变量具有局部作用域(src:https://stackoverflow.com/questions/13667284/how-do-i-keep-functions-variables-local-to-my-zshrc)
- tmp='%~'
tmp 是一个等于字符串 '%~' 的变量,它引用 $HOME 目录(但为什么用这个变量分解下一个变量??)
- HPWD=${(%)tmp}
HPWD是一个变量,它与pwd(打印工作目录)有关,并且等于里面前面的变量,但我不知道括号前面的美元符号是什么意思
-if [[ $TERM == screen* ]]; then printf
如果软件屏幕正在运行则打印
-'\ek%s\e\\'
不知道...
(那个屏幕怎么会听这个脚本?)
答案1
那是${(flag)tmp}
哪里(flag)
参数扩展标志(参见info zsh 'flags, parameter expansion'
。%
参数扩展标志打开迅速扩张当变量展开时$tmp
。
%~
在提示扩展中扩展到当前工作目录,但替换/home/you
为~
.
请注意,您不需要临时变量,您可以这样做${(%):-%~}
甚至更简单:
print -Pn '\ek%~\e\\'
其中-P
选项print
还打开提示扩展(请参阅info zsh print
)。
precmd
请注意,您也可以直接在提示中添加该字符串,而不是使用:
PROMPT=$'%{\ek%~\e\\%}$ '
␛kTITLE␛\
是 GNU 屏幕识别的转义序列,用于设置标题。info screen -n 'Dynamic Titles'
详情请参阅。