tmux изменяет размер в фокусе

Я хотел бы иметь возможность указать дополнительный параметр размера для конкретной панели, чтобы он назначал новый размер при фокусировании панели и возвращал его при выходе. Так, например.

(Примечание [] представляет сфокусированный терминальный курсор)

________________
|$ ls  |       |
|a's   |       |
|dir   |       |
|$     |$ []   |
|______|_______|

Переключить фокус панели

_______________
|        |    |
|$ ls    |    |
|a's dir |    |
|$ []    |$   |
|________|____|

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

В этом примере ширина левой панели настроена на автоматическое переключение на 8 столбцов, когда она находится в фокусе, и она становится тоньше, когда теряет фокус. Обратите внимание, что содержимое по-прежнему видно (в конце концов, именно поэтому мы любим tmux), но мы все еще можем съесть наш пирог, позволив текущей активной панели автоматически расширяться, чтобы она всегда была достаточно большой, чтобы в ней можно было работать!

Я, вероятно, могу придумать несколько сложных привязок, чтобы автоматизировать применение resize-pane команд для этого, и сделать его достаточно сложным, чтобы удовлетворить мои пожелания. Но я надеялся, что для этого есть какая-то встроенная функция.

Было бы целесообразно отслеживать и разрешать модификацию вспомогательной четверки целых чисел для каждой панели. Они определяют количество resize-pane -L/D/U/R операций, выполняемых при фокусировке этой панели, и обратное направление при расфокусировке этой панели.

Могут быть и другие, более разумные формулировки этого.


person Steven Lu    schedule 02.06.2013    source источник
comment
Вы уже нашли способ сделать это?   -  person golfadas    schedule 12.11.2014
comment
к сожалению, нет, я сделал больше привязок, чтобы изменить размер еще быстрее, но теперь есть около 8 привязок для настройки размеров панели, и нет никакого поведения возврата, так что по-прежнему много ручной работы. И у меня пока не сформировалась привычка пользоваться новыми биндами. Так что нет.   -  person Steven Lu    schedule 12.11.2014


Ответы (2)


Нашел частичное решение ... У меня синхронизировано переключение панелей с vim, поэтому всякий раз, когда я переключаю панели переключения, я также изменяю размер tmux.

Это не оптимально, потому что tmux не проверяет текущий размер панели и не изменяет его размер соответствующим образом. В любом случае, это работает очень хорошо, так как вы можете дважды нажать ctr-h или ctrl-k, чтобы изменить размер панели.

Соответствующая конфигурация следующая:

# Sync panes with vi
bind -n C-h run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim(diff)?$' && tmux send-keys C-h) || tmux select-pane -L && tmux resize-pane -R 30"
bind -n C-l run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim(diff)?$' && tmux send-keys C-l) || tmux select-pane -R && tmux resize-pane -L 30"
bind -n C-j run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim(diff)?$' && tmux send-keys C-j) || tmux select-pane -D"
# Move panes up and down, wont resize
bind -n C-k run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)vim(diff)?$' && tmux send-keys C-k) || tmux select-pane -U"
person golfadas    schedule 19.11.2014

Извините, пока это только предположение, но я немного подумал об этом, и я думаю, что есть встроенная функциональность tmux, которая может поддерживать это, но это потребует некоторого/много сценариев.

Смотрите этот вопрос, который я разместил.

http://sourceforge.net/p/tmux/mailman/message/31221459/

По сути, похоже, что команда select-layout может (возможно!??!) использоваться для применения произвольной мутации к макету. Однако я не проверял, работает ли это.

Томас Адам предложил заглянуть в исходный код layout-custom.c, чтобы узнать больше о том, что происходит. Это примерно то, что я получил. Но если действительно возможно программно изменить макет и сгенерировать рабочие строки для передачи в select-layout, то это был бы очень хороший подход.

Обновление: Теперь я спросил об этом напрямую (может ли просто создание подходящей строки изменить размер до произвольных макетов), но еще не получил ответа от самого г-на Адама, но причина, по которой я подозреваю что это может работать, если мы можем сгенерировать строку, которая проходит контрольную сумму, заключается в том, что я могу изменить размер своих панелей любым способом и изменить их, как только я запишу строку (полученную командой list-windows), а затем после этого восстановлю до записан макет со строкой. Это означает, что нет какого-то явного действия, которое нужно предпринять, например, «сохранить» макет или что-то в этом роде, похоже, что контрольная сумма — это просто какой-то умный способ помочь предотвратить мусор / патологические строки, наносящие ущерб строке. интерпретатор, который выполняет перестановку макета панели.

Вам определенно нужно передать строку, которую нетривиально построить, чтобы это работало. Однако код для вычисления контрольной суммы и всего остального хорошо виден в layout-custom.c. Однажды я, вероятно, вернусь со сценарием оболочки (или просто программой на C, если можно вытащить код), который реализует подходящие преобразования. Должно быть весело.

Да, было бы здорово, если бы я провернул это и получил миленькую награду, но, к сожалению, сегодня вечером меня ждет Real WorkTM.

person Steven Lu    schedule 19.11.2014
comment
Это был все еще потрясающий ответ, награда за вас, и спасибо за информацию! - person golfadas; 20.11.2014
comment
Спасибо за шишку @spurra! У меня не было возможности углубиться в это, но это довольно высоко в моем списке вещей, с которыми можно возиться в tmux. На самом деле может быть в верхней части этого списка. Я надеюсь, что если кто-то еще пойдет по этому пути, он сможет прокомментировать результаты!!! - person Steven Lu; 07.05.2019