Согласно странице руководства tmux, можно использовать %if
для условного запуска его команд. Поэтому я пытаюсь использовать его для масштабирования текущей панели, если она еще не масштабирована (иначе он бы ее не масштабировал).
Я попробовал несколько вариантов
%if '#{window_zoomed_flag}' resize-pane -Z %endif
безуспешно. Есть идеи?
Я видел несколько примеров, чтобы достичь того, что я пытаюсь сделать с помощью if-shell
, но я хотел бы сделать это только с помощью 'родных' команд tmux. Под 'родными' я подразумеваю не порождать другой процесс.
решение1
Я видел несколько примеров, чтобы достичь того, что я пытаюсь сделать с помощью
if-shell
, но я хотел бы сделать это только с помощью 'родных' команд tmux. Под 'родными' я подразумеваю не порождать другой процесс.
if-shell
может или не может породить оболочку. Смотрите описание:
if-shell [-bF] [-t target-pane] shell-command command [command]
(псевдоним:
if
)Выполнить первую команду
command
, еслиshell-command
возвращает успех, или вторую команду в противном случае. Перед выполнениемshell-command
расширяется с использованием правил, указанных в разделе ФОРМАТЫ, включая те, которые относятся кtarget-pane
. С-b
, shell-command запускается в фоновом режиме.Если
-F
задано,shell-command
то не выполняется, но считается успешным, если не пусто и не равно нулю (после раскрытия форматов).
(источник)
Любая обозначенная команда command
является командой tmux, ей не нужна оболочка. shell-command
нужна оболочка, если -F
не указано. Не каждый тест может быть выполнен с помощью, -F
но в вашем случае это просто. Это не породит другой процесс:
tmux if-shell -F '#{window_zoomed_flag}' '' 'resize-pane -Z'
Чтобы убедиться, что if-shell -F
не создается никаких дополнительных процессов, выполните следующие действия:
- Работайте внутри tmux, поэтому сервер tmux существует. Вам понадобятся две панели; создайте их заранее.
Сохраните PID сервера tmux:
pid="$(pgrep 'tmux: server')"
На всякий случай проверьте, что переменная не пустая:
echo "$pid"
Используйте
strace
, чтобы указать, создает ли сервер новые процессы (см.этот ответ):strace -e fork,vfork,clone,execve -fb execve -p "$pid"
Выберите другую панель и вызовите:
tmux if-shell -F '#{window_zoomed_flag}' '' 'resize-pane -Z' # now similar command to unzoom tmux if-shell -F '#{window_zoomed_flag}' 'resize-pane -Z'
Посмотрите, что
strace
напечатано. Вывода быть не должно.* Это означает, что дополнительный процесс не был порожден.Для сравнения, это эквивалентные команды без
-F
, они создают оболочки:tmux if-shell '[ #{window_zoomed_flag} -eq 1 ]' '' 'resize-pane -Z' # now similar command to unzoom tmux if-shell '[ #{window_zoomed_flag} -eq 1 ]' 'resize-pane -Z'
Каждая команда будет
execve("/bin/sh", …
отображаться в выводеstrace
.
* Если только вы не используете хук, вызванный масштабированием или изменением размера панели, и хук порождает другой процесс. Временно удалите хук, чтобы он не мешал тесту.