автоматизировать заголовок окон экрана gnu

(есть одно возможное решение при переполнении стека: 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\\' понятия не имею...

(и почему этот экран прослушивает этот скрипт ?)

0
14.08.2018, 13:49
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'.

1
28.01.2020, 02:42

Теги

Похожие вопросы