(есть одно возможное решение при переполнении стека: https://stackoverflow.com/a/51769020/9497573)
Я пытаюсь сделать заголовок моих окон на экране автоматически равен пути к рабочему каталогу ПЛЮС запущенному процессу, если он есть ( например: npm start или vim file.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#^.*:...##')
, потому что это выбирает команду запущен процесс
, но он не работает, как будто процесс не был захвачен ни историей
, ни пс
...возможно, precmd
запускается до запуска действия, поэтому я пробовал другие функции, такие как preexec
или zshaddhistory
, но безуспешно...
, как я могу захватить запущенный процесс, чтобы поместить его в заголовок?
Я нашел это: Экран GNU: изменение имени нового окна, которое дает возможность сделать что-то близкое, изменив файл .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()
) (источник: 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 (печать рабочего каталога) и равно чему-то с предыдущей переменной внутри, но я не знаю, что означает знак доллара перед чем-то в скобках
- если [[ $TERM == экран* ]]; затем напечатайте f
, если экран программного обеспечения запущен, затем напечатайте
-'\ek%s\e\\'
понятия не имею...
(и почему этот экран прослушивает этот скрипт ?)
Это ${(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'
.