Запустить команду tmux, если текущее окно не увеличено с помощью %if

Запустить команду tmux, если текущее окно не увеличено с помощью %if

Согласно странице руководства 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не создается никаких дополнительных процессов, выполните следующие действия:

  1. Работайте внутри tmux, поэтому сервер tmux существует. Вам понадобятся две панели; создайте их заранее.
  2. Сохраните PID сервера tmux:

    pid="$(pgrep 'tmux: server')"
    
  3. На всякий случай проверьте, что переменная не пустая:

    echo "$pid"
    
  4. Используйте strace, чтобы указать, создает ли сервер новые процессы (см.этот ответ):

    strace -e fork,vfork,clone,execve -fb execve -p "$pid"
    
  5. Выберите другую панель и вызовите:

    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'
    
  6. Посмотрите, что straceнапечатано. Вывода быть не должно.* Это означает, что дополнительный процесс не был порожден.

  7. Для сравнения, это эквивалентные команды без -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.


* Если только вы не используете хук, вызванный масштабированием или изменением размера панели, и хук порождает другой процесс. Временно удалите хук, чтобы он не мешал тесту.

Связанный контент