TMUX 窗格选项卡,或 'locking/freezing' 窗格就地拆分
TMUX pane tabs, or 'locking/freezing' pane splits in place
使用 tmux 时,我通常会在顶部拆分打开一个编辑器,在底部打开一个 shell。现在,我正在写一个 python 脚本,在拆分的下半部分我找不到在 ipython
和 bash
之间来回切换的方法:最好的我能做的是在这两者之间创建一个嵌套拆分,共享屏幕的下半部分。现在看起来像下面这样。
窗格中是否有选项卡 之类的东西,所以我可以在 bash/ipython 之间来回切换,同时保持编辑器 locked/frozen 在最佳?现在必须在为 shell 提示之一切换到新选项卡或使用这些微小的拆分之间做出选择是不理想的。 Tmux 非常灵活,似乎有一种方法可以实现这种简单的窗格锁定。谢谢
使用嵌套的 tmux 会话解决。我的解决方案基于 nested-tmux 的精简版本。我启动一个嵌套会话,然后在该嵌套会话中使用选项卡。要启动嵌套会话,我使用以下脚本 tmux-nested.sh
(改编自 nested-tmux 存储库):
#!/bin/sh
TMUX_PARENT=$(basename "$TMUX")
TMUX_PARENT="${TMUX_PARENT%%,*}"
export TMUX_PARENT
_SOCK="r$RANDOM"
tmux -L "$_SOCK" new-session -s "$_SOCK"
这会创建一个带有套接字的嵌套会话,给定一个随机文件名(硬编码值不允许多个嵌套会话,比如在父会话的不同选项卡中)。
在我的 .tmux.conf
文件中,我在启动时添加了以下行以更改嵌套会话的 tmux 前缀:
# nested session logic
if-shell '! [ -z "$TMUX_PARENT" ]' 'set-option -g prefix C-b'
(我的正常前缀是反引号)
编辑:
我将此功能扩展为更强大的实现,可以在下面找到:
# Nest tmux sessions
tmux_nested() {
local usagestring='usage: tmux-nested [-n | -a nested-session-# | -l]'
if [[ -z $TMUX ]]; then
# ensure invoked within active session
echo "'tmux_nested' should be invoked inside an active tmux session"
return 1
fi
# read flags and check for number of existing nested sessions
local nested session_name
nested=$(tmux list-sessions -F '#{session_name}' | \
ggrep -P '^nested[\d]+' --color=never | sort -V)
while getopts ':lna:' opt; do
case $opt in
l)
[[ -z $nested ]] && nested="No nested sessions running"
echo "$nested" && return 0;;
n)
# if new session requested: create, set <C-b> tmux prefix, and attach
for (( i = 1;; i++ )); do
# get lowest available numeric value for new session name
if ! tmux has-session -t "nested$i" 2> /dev/null; then
session_name="nested$i" && break
fi
done
tmux new-session -ds "$session_name"
tmux send-keys -t "$session_name" \
"tmux set prefix C-b" ENTER "clear" ENTER
env TMUX='' tmux attach -t "$session_name"
return $?;;
a)
# attach to specified session if requested
session_name="nested${OPTARG}"
if ! env TMUX='' tmux attach -t "$session_name"; then
echo "Try 'tmux_nested -l'?" && return 1
fi;;
*) echo "$usagestring" && return 1;;
esac
done
# incorrect invocation, report incorrect invocation and exit
echo "$usagestring" && return 1
}
使用 tmux 时,我通常会在顶部拆分打开一个编辑器,在底部打开一个 shell。现在,我正在写一个 python 脚本,在拆分的下半部分我找不到在 ipython
和 bash
之间来回切换的方法:最好的我能做的是在这两者之间创建一个嵌套拆分,共享屏幕的下半部分。现在看起来像下面这样。
窗格中是否有选项卡 之类的东西,所以我可以在 bash/ipython 之间来回切换,同时保持编辑器 locked/frozen 在最佳?现在必须在为 shell 提示之一切换到新选项卡或使用这些微小的拆分之间做出选择是不理想的。 Tmux 非常灵活,似乎有一种方法可以实现这种简单的窗格锁定。谢谢
使用嵌套的 tmux 会话解决。我的解决方案基于 nested-tmux 的精简版本。我启动一个嵌套会话,然后在该嵌套会话中使用选项卡。要启动嵌套会话,我使用以下脚本 tmux-nested.sh
(改编自 nested-tmux 存储库):
#!/bin/sh
TMUX_PARENT=$(basename "$TMUX")
TMUX_PARENT="${TMUX_PARENT%%,*}"
export TMUX_PARENT
_SOCK="r$RANDOM"
tmux -L "$_SOCK" new-session -s "$_SOCK"
这会创建一个带有套接字的嵌套会话,给定一个随机文件名(硬编码值不允许多个嵌套会话,比如在父会话的不同选项卡中)。
在我的 .tmux.conf
文件中,我在启动时添加了以下行以更改嵌套会话的 tmux 前缀:
# nested session logic
if-shell '! [ -z "$TMUX_PARENT" ]' 'set-option -g prefix C-b'
(我的正常前缀是反引号)
编辑: 我将此功能扩展为更强大的实现,可以在下面找到:
# Nest tmux sessions
tmux_nested() {
local usagestring='usage: tmux-nested [-n | -a nested-session-# | -l]'
if [[ -z $TMUX ]]; then
# ensure invoked within active session
echo "'tmux_nested' should be invoked inside an active tmux session"
return 1
fi
# read flags and check for number of existing nested sessions
local nested session_name
nested=$(tmux list-sessions -F '#{session_name}' | \
ggrep -P '^nested[\d]+' --color=never | sort -V)
while getopts ':lna:' opt; do
case $opt in
l)
[[ -z $nested ]] && nested="No nested sessions running"
echo "$nested" && return 0;;
n)
# if new session requested: create, set <C-b> tmux prefix, and attach
for (( i = 1;; i++ )); do
# get lowest available numeric value for new session name
if ! tmux has-session -t "nested$i" 2> /dev/null; then
session_name="nested$i" && break
fi
done
tmux new-session -ds "$session_name"
tmux send-keys -t "$session_name" \
"tmux set prefix C-b" ENTER "clear" ENTER
env TMUX='' tmux attach -t "$session_name"
return $?;;
a)
# attach to specified session if requested
session_name="nested${OPTARG}"
if ! env TMUX='' tmux attach -t "$session_name"; then
echo "Try 'tmux_nested -l'?" && return 1
fi;;
*) echo "$usagestring" && return 1;;
esac
done
# incorrect invocation, report incorrect invocation and exit
echo "$usagestring" && return 1
}