Как программно получить этот макет в tmux?

На самом деле вам нужно определить, есть ли у вас доступ для выполнения этих операций. Вместо этого считается плохой практикой проверять, являетесь ли вы пользователем root.

Если система настроена таким образом, чтобы пользователь, не являющийся -пользователем root, мог изменять кэш подкачки и удалять кэш страниц, почему этот пользователь не должен запускать ваш скрипт?

Вместо этого вы можете просто попробовать операцию и выйти с полезным сообщением, если она не удалась:

if ! ( swapoff -a && swapon -a )
then
  echo "Failed to clear swap (rerun as root?)" >&2
  exit 1
fi

if ! echo 1 > /proc/sys/vm/drop_caches
then 
  echo "Failed to free page cache (rerun as root?)" >&2
  exit 1
fi
1
22.11.2019, 18:38
1 ответ

it seems my requests are simply ignored

Непонятно, какие запросы игнорируются. Ваш скрипт вроде работает для меня, кажется, ничего не игнорируется, если я запускаю его заново, без уже запущенного сервера tmux. С уже запущенным сервером tmux возникают проблемы:

  • сеанс может уже существовать, и кто-то может (активно )его использовать,
  • окно может уже существовать,
  • ваши split-windowкоманды могут быть нацелены на другое (до -существующее )окно.

It seems to me that some layouts are simply not allowed.

Если ваша цель состоит в том, чтобы работать с уже имеющейся раскладкой и получить желаемую раскладку, выполняя что-то еще после , то это будет сложно, потому что вы не сможете легко получить желаемую вершину -правильно или нижняя -правая панель после весь левый столбец «33%» разделен на две панели «50%». Разделять нужно в другом порядке.

Один из способов узнать, каким может быть порядок, — это нарисовать макет на листе бумаги и вырезать его ножницами прямыми надрезами, проходящими с по , чтобы каждый разрез делил текущий кусок на два меньших. Или представьте, что вы разбиваете плитку шоколада.

Возможная схема для желаемого макета выглядит так:

+---------------------+
|       1             |
|22222221             |
|   3   1             |
|   3   1#############|
|   3   1             |
|22222221             |
|       1             |
+---------------------+

Цифры указывают, в каком порядке нужно резать. Разрез, отмеченный #, представляет собой несколько разрезов в правом столбце, вы можете делать их в любом порядке после 1, до или после 2или 3. Эти #разрезы не важны для проблемы. Важно то, что вам нужно сделать два разреза 2(в любом порядке )после 1и перед3. Ваш сценарий выполняет разрез 3без создания 2, и тогда нет простого способа получить то, что вы хотите.

Существует split-window -f, он создает новую панель, охватывающую всю высоту окна или всю ширину окна, вместо разделения одной панели.Хотя это обеспечивает некоторую гибкость и позволяет создавать панели в другом порядке, это не поможет вам получить желаемый макет из полученного макета; и это не сделает возможным большее количество макетов.


Для сравнения, это действительно невозможная компоновка, я думаю:

+---------------------+
|       #             |
|       #             |
|       ##############|
|       |       |     |
|       |       |     |
|---------------|     |
|               |     |
+---------------------+

На самом деле вы можете разрезать его ножницами, но не tmux, потому что, по крайней мере, первый разрез ножницами должен сгибаться, чтобы получились два отдельных листа бумаги. Пример первого разреза нарисован с помощью символов #. Можно интерпретировать как два не "сквозных" разреза, так что для tmux такая интерпретация ничего не меняет, все равно нельзя.


Это пример скрипта, который у меня работает в tmux 2.3. Замечания и улучшения перечислены в виде примечаний под кодом; пожалуйста, прочтите их перед запуском скрипта.

#!/bin/sh

session="$USER"
window="$session:1"

lines="$(tput lines)"
columns="$(tput cols)"

tmux -2 new-session -d -x "$columns" -y "$lines" -s "$session" 'echo "step -1"; bash'
tmux new-window -t "$window" -n 'Logs' 'echo "step 0"; bash' || exit

tmux split-window -t "$window"             -h -p 67    -d 'echo "step 1";  bash'
tmux split-window -t "$window"             -v -p 10 -b -d 'echo "step 2a"; bash'
tmux split-window -t "$window"             -v -p 22    -d 'echo "step 2b"; bash'
tmux split-window -t "$window"             -h -p 50       'echo "step 3";  bash'
tmux split-window -t "$window.{top-right}" -v -p 55    -d
tmux split-window -t "$window.{top-right}" -v -p 64
tmux select-pane  -t "$window.{bottom-right}"
tmux split-window -t "$window"             -v -p 67
tmux split-window -t "$window"             -v -p 50

tmux select-window -t "$window"

# Attach to session
tmux -2 attach-session -t "$session"

Примечания:

  • Шебанг /bin/sh, здесь не нужен Баш.
  • Привыкайте к двойному -заключению переменных в кавычки . Лучше постоянно цитировать независимо от того, нужно ли вам это, чем забыть цитировать, когда это действительно имеет значение.
  • Я использовал строчные имена для переменных .
  • Я использовал tputдля определения размера текущего терминала. Затем new-session -d -x … -y …использует правильные значения. Но :
    • В моих первоначальных тестах это казалось ненужным, все работало без -xили -y
    • … хотя согласно моему местному руководству это должно быть необходимо.
    • В любом случае, если сессия уже существует, определяется ее размер и new-session -d -x … -y …не будет иметь никакого значения. Вы можете столкнуться с искаженными пропорциями макета после прикрепления и изменения размера панелей. Есть команды и опции tmux, которые могут помочь (resize-window, window-size, default-size), хотя и не в моем стареньком tmux, поэтому я не буду вдаваться в подробности.
    • tputоперанды linesи colsне требуются POSIX. См. этот ответ для альтернатив.
  • Если окно не может быть создано, скрипт завершает работу.
  • Каждый split-windowнацелен на правое окно. Если бы сеанс существовал или кто-то присоединился в это время и изменил окно, текущее окно не было бы тем, что вы предполагаете. Чтобы быть еще более надежным, каждый split-windowдолжен явно нацеливаться на соответствующую панель. Обратите внимание, что select-paneпередsplit-window(или перед resize-pane, как в вашем скрипте ), не очень надежен в общей настройке, когда многие клиенты могут взаимодействовать с одним и тем же сервером tmux :каким-то другим клиентом (пользователем или скрипт )мог выбрать другую панель между этими двумя командами.
  • Я не изменяю размеры панелей. Я создаю их с правильными процентами в первую очередь. Опция -p, которую я использую, работает в моем старом tmux. В документации говорится, что новый синтаксис похож на split-window -l 20%, а resize-paneтакже может работать с процентами. Я не знаю, понимает ли новейший tmux split-window -p. В документации эта опция больше не упоминается, она может быть устаревшей и не поддерживаться или может быть сохранена для совместимости; Я не могу проверить этот (отзыв или отредактировать ).
  • split-windowпринимает проценты, относящиеся к доступному пространству, то есть к старому размеру панели, которая вот-вот сожмется, чтобы освободить место для новой панели (по крайней мере, так это работает в моем старом tmux с-p). Вот почему числа, подобные 22, появляются (20/ (20+70 )≈ 22 ). Согласно документации resize-paneиспользует проценты от размера окна.
  • Я использую или не использую -d, чтобы остаться в текущей панели или сделать новую текущую, в зависимости от того, какую панель мне нужно настроить для следующей split-window.
  • Когда мне нужно указать/выбрать панель, которая соответствует токену, например {top-right}, я использую токен.
  • Я не использую send-keysдля запуска команд. Как правило, не используйте send-keysдля запуска команд. Любой (?)Команда tmux, которая создает новую оболочку внутри tmux, может вместо этого запускать команду оболочки. В примере сценария echo "step 0"; bashесть такая команда оболочки. Он включает bashв конце, поэтому панель не закрывается, когда фактическая команда(echo)завершается. Альтернативой является опция remain-on-exit. Ваши шелл-команды(watch)могут работать бесконечно долго, так что вам могут не понадобиться такие трюки. Выполнение команды оболочки с send-keys, как вы это делаете в своем сценарии, имеет смысл, если команда влияет на оболочку, в которой она выполняется, и ваша цель — интерактивно работать в оболочке, подготовленной таким образом. Например. команда может устанавливать переменные или запускать сценарий; или вы хотите иметь возможность прервать watchи сохранить его в истории оболочки. В любом другом случае "правильный" способ - передавать команды с помощью split-window, respawn-paneили какой-либо подобной команды tmux.

Дополнительное примечание:

  • cat /proc/cpuinfo | grep "MHz" | …— бесполезное использование cat. Лучшие способы:

    </proc/cpuinfo grep "MHz" | …
    grep "MHz" /proc/cpuinfo  | …
    
4
27.01.2020, 23:22

Теги

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