自动化 gnu 屏幕窗口的标题

自动化 gnu 屏幕窗口的标题

(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#^.*:...##')这选择了正在运行的进程的命令

但它不起作用,就好像该进程没有被捕获historyps...可能precmd在操作启动之前运行,所以我尝试了其他功能,例如preexeczshaddhistory没有任何运气...

如何捕获正在运行的进程并将其放入标题中?

第一个发布的问题

我找到了这个: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'详情请参阅。

相关内容