Я пытаюсь следовать правилу 80 столбцов при написании кода, моя текущая настройка tmux разделена 50/50 по горизонтали. Мне нравится иметь vim в левой панели, а в правой панели у меня разделение 75/25, где я запускаю другие вещи.
На моем мониторе 50% имеет ширину 76 столбцов, но на дисплее моего ноутбука она составляет 123 столбца.
Я хотел бы максимально увеличить пространство для других команд. Есть ли способ установить его ровно на 80 столбцов (или около того) при запуске рабочего пространства?
В настоящее время я настраиваю свое рабочее пространство следующим образом:
bind C-w source-file ~/dotfiles/scripts/tmux_work_layout
этот файл содержит:
selectp -t 0 # Select pane 0
splitw -h -p 50 # Split pane 0 vertically by 50%
selectp -t 1 # Select pane 1
splitw -v -p 25 # Split pane 1 horizontally by 25%
selectp -t 0 # Select pane 0
решение1
Я нашел код для принятого ответа полезным, но я использую tmux 1.8, и это, похоже, встроенная функция. Из страниц руководства tmux в разделе split-window: The -l and -p options specify the size of the new pane in lines (for vertical split) or in cells (for horizontal split), or as a percentage, respectively.
Таким образом, простое использование -l вместо -p должно дать нужный вам эффект. Например:
split-window -h -l 80
Аналогичное решение для resize-pane
описаноздесь.
решение2
Вы хотите чего-то подобного?
Добавить в файл и сделать исполняемым с помощью chmod +x filename
. вызвать с помощью eg
./sizetmux # Default hardcoded size
./sizetmux 85 # Specify width
Чтобы запустить его из исходного файла:
if-shell /path/to/script/sizetmux 80
Код:
#!/bin/bash
# Wanted pane width 0 - default 80, or pass argument 1 as wanted width
pw0=80
[[ "$1" =~ ^[0-9]+$ ]] && pw0="$1"
# This could be done nicer, but, anyhow: getting current width of pane 0
pw0_cur_w=$(tmux list-panes | awk -F"[ x:\\\[\\\]]+" '/^0:/{print $2}')
# Resize according to current width
if [[ "$pw0_cur_w" -eq "$pw0" ]]; then
echo "OK $pw0"
elif [[ "$pw0_cur_w" -gt "$pw0" ]]; then
((w = pw0_cur_w - pw0))
echo "$w less"
tmux resize-pane -L -t 0 "$w"
elif [[ "$pw0_cur_w" -lt "$pw0" ]]; then
((w = pw0 - pw0_cur_w))
echo "$w more"
tmux resize-pane -R -t 0 "$w"
fi
Также необходимо учитывать, например, номера строк в vim, возможно, 85?
Редактировать, возможно, немного лучше (не так много беспорядка) (послеpw0_cur_w=$(tm ...
((w = pw0_cur_w - pw0))
if [[ "$w" -ge 0 ]]; then
dir="L"
echo "$w less"
else
dir="R"
((w *= -1))
echo "$w more"
fi
[[ "$w" -gt "0" ]] && tmux resize-pane -"$dir" -t 0 "$w"
решение3
Простой способ сделать это — использовать макет main-vertical с Cb M-4 или Cb : selectl main-vertical. Он разработан для emacs, поэтому левая панель имеет 81 столбец, вам нужно будет изменить параметр main-pane-width, чтобы он стал равен 80.
решение4
С момента публикации вопроса и последнего ответа ситуация изменилась. В tmux есть хуки, которые можно использовать для сохранения фиксированной ширины главной панели.
например я использую следующий псевдоним:
alias work-bftp="tmux attach -t work-bftp || tmux new -s work-bftp -d 'bash' \; set -g default-command bash \; split-window -h \; set-option -t work-bftp main-pane-width 80 \; selectl main-vertical \; set-hook -t work-bftp window-layout-changed 'selectl main-vertical;' \; attach;"
для создания main-vertical
окна на основе макета, где основная панель используется для использования vim шириной 80 столбцов в первом окне. Это использует window-layout-changed
событие для перерисовки окна с желаемым размером.
Я попробовал, и это работало некоторое время, client-resized
в том числе и с событиями, но в один прекрасный день перестало работать при операциях по развертыванию окна терминатора/эмулятора.
Однако при таком подходе есть одна проблема: префикс -z больше не работает для первого окна.