当前位置: 首页 > news >正文

思考:(linux) tmux 超级终端快速入门的宏观思维

tmux 工具集合 
GitHub - rothgar/awesome-tmux: A list of awesome resources for tmux  

要点:

  • 习惯性思维的变换
  • 与宿主机之间的双向复制、粘贴
  • 手动备份全部窗口,以及还原
  • 自定义窗格提示信息
  • TPM 插件的安装思想
  • 别名

   

  • 在有些场景里,可能无法取代通用终端?为止?

tmux 目前在各大 linux 发行版中,都默认安装了。这也许是目前最好用的终端了?

但是,由于它默认是为键盘用户设计的;因此,如果要使用鼠标,还需要做进一步的配置。

  • 官方提供了鼠标的基本配置命令,但是,需要用户自己在 .tmux.conf 配置文件中开启。
  • 使用第三方插件,需要安装插件官方的说明来安装和配置。
  • tmux 官方提供了许多的用于功能扩展的基础配置接口语句,类似于 API 接口函数,比如鼠标开启设置,默认没有开启鼠标。这些可以由用户自己,或者第三方插件开发者进行功能扩展的主要参考依据。

思维变换:

  • prefix 前缀(默认 Ctrl+b,也可自定义):相当于 Shift,Ctrl,Alt 之类的功能键。使用命令前缀来取代通常的功能按键的好处:避免与系统、或其他 app 发生快捷键冲突。
  • 必选:tmux-plugins / tmux-resurrect ,可以将当前 tmux 的所有场景进行备份和还原。prefix +Ctrl+s / prefix +Ctrl+r 备份/还原。这个插件可以持久化直到窗格所使用的历史命令,虽然 tmux 官方也有相关的命令,只不过有些简陋而已。
  • tmux-plugins 有许多的插件,使用 TPM 的好处是不需要一个一个地下载和配置。只要在 ~/.tmux.conf 中设置好了;然后,在 tmux 终端里操作prefix --> Shift+i(大写 I),下载和安装就可以自动完成了(安装过程需要连接到 github)。

  • 复制与粘贴的思维:tmux 自有剪切板,只能在 tmux 的各个会话,窗口,窗格之间进行使用。如果 tmux 要与宿主机之间进行双向的复制与粘贴,还需要自行解决。
    在 tmux 终端里,prefix+Ctrl+c 指将 tmux 剪切板的内容拷贝到系统剪切板。在宿主机里,还需要 Ctrl+v才能完成粘贴的操作。
    prefix +Ctrl+v 指将系统剪切板的内容,拷贝到 tmux 当前有效的光标处(如果当前在 tmux 中的光标不在有效位置,在粘贴不成功)。

  • 鼠标复制操作:鼠标选择文本,放开左键后,直接就已经完成的文本的复制了。点击滚轮键,即粘贴。

    ## 鼠标操作。tmux 官方本身就具有的功能,但是,需要用户自己开启了,才能使用。
    # 启用鼠标和 vi 键位(可选)
    set -g mouse on
    set-window-option -g mode-keys vi
  • 手动复制粘贴操作:Tmux 的两种键位操作模式为 ‌vi 模式‌ 和 ‌emacs 模式‌,用于控制文本编辑、复制粘贴等操作。
    复制文本 Ctrl+b ---松开,再按---> [(开口向右)--- vi 模式下按空格 ---> 然后,开始用方向键选择需要复制的文本 ---> 敲 enter 结束复制。
    粘贴:在有效光标处按 Ctrl+b ---松开,再按---> ](开口向左)。
     vi 模式需要用户自己在 .tmux.conf 里开启。默认是  ‌emacs 模式。

    ##  ~/.tmux.conf 中设置默认模式。全部注释掉,就是默认的 emasc 模式。
    # 设为 vi 模式
    set-window-option -g mode-keys vi
    # 设为 emacs 模式
    set-window-option -g mode-keys emacs
    


     

需要关注:

  • 可选:tmux-continuum 自动备份、恢复插件,可能是版本不兼容,OS 定时服务,或是其他问题,没有安装成功。无关紧要的,因为可以使用手动的方式进行动备份、恢复。
  •  tmux-yank 插件:Tmux plugin for copying to system clipboard. Works on OSX, Linux and Cygwin. 好像只是单向的。最后是直接采用 sh 脚本来实现。

  • 虽然可以自定义 prefix,将 Ctrl+b 改为其他的。但是,好像没有必要吧?
    如果想追求快捷,就使用别名好了。只需要创建几个别名就可以了,其他的都可以使用鼠标来操作。

  • tmux 这个工具火,所以有许多人为它提供了第三方插件扩展。但未必就是自己所需要的。工具而已,在漂亮它还是工具。

理解 Session、Window、Pane 关键区别

概念作用类比
会话(Session)管理多个窗口的集合浏览器“用户配置文件”
窗口(Window)同一会话中的不同任务标签页浏览器“标签页”
窗格(Pane)同一窗口中的分屏终端终端“分屏”

掌握这三者的关系,可以高效利用 Tmux 管理复杂的终端工作流!

备注:

说实话,英文有几十万、上百万的词汇,中文字少,翻译过来的概念就变成了4不象,难以理解。“会话”这个概念就是一个怪胎,不容易理解。

说白了,Session、Window、Pane 的本质,就是一种窗口的管理模式、或方式而已。

  • 为什么需要会话?本质上,相当于软件开发工具 IDE 中的项目管理,暂且叫会话项目吧?它的好处就是在管理多个项目时,可以让其中一个项目处在激活状态,其他项目处在非激活状态。在同一个会话中的各个窗口都是有一定关系的,或者人为地认为它们有关系。
    特点:每一个会话项目都是独立的,关闭或打开不会影响其他的会话项目,就像在 IDE 中的项目管理那样。每个项目,每个会话,都是一个独立的被管理对象。
  • 为什么需要窗口?就像在同一个项目中,可以有多个源文件,每打开一个源文件,这个源文件就独占了当前的窗口。也可以通过标签图标来切换不同的源文件显示到当前的窗口。
  • 为什么需要窗格?在打开一个源文件之后,可能还需要打开其他的子窗口,如变量显示窗口,信息输出端口等等。窗格的效果也是如此。

与 IDE 不同,Session、Window、Pane 的具体用途,完全是由用户自己来定义。

从窗口管理的角度来说,Session、Window、Pane 就是一种窗口的组织和管理方式而已。从使用的角度来说,任何一个窗口或窗格的用途,可以是一样的。只不过将窗格定义为完全一样的用途,有时是没有什么意义的?

tmux 有一种模式,可以让 N个窗口实现完全一样的操作(需要开启),好处是所有的终端端口,分别连接到不同的服务器,在一个窗格里执行 apt update,那么,所有窗格都在执行相同的命令。

  • 会话?相同与 VSCode 中的不同文件夹,每个文件夹最好就是被解释、被作为是一个独立的项目。
  • 窗口?同栏浏览。在同一个标签菜单栏中进行浏览。通过在 tmux 的底部标签菜单,可以同时浏览到不同的窗口名称标签。每个窗口,相当于在 IDE 中的不同源文件标签菜单。
    类似于 firefox 浏览器中的网页标签,每一个标签对应于一个完整的网页,只不过 firefox网页标签默认在顶部,而 tmux 窗口标签默认在底部。
  • 窗格?同窗浏览。一个窗口被分割成几个子窗口。比如:docker build ,docker run ,docker log 等等,分别单独占用一个窗口;这样做的好处:与通常用途的终端窗口来比较吧,普通终端运行完了docker build ,docker run ,docker log之后,要想再次进行 docker build ,那么,就要按3次?向上箭头,或者需要输入命令,太麻烦了;打开多个终端,或多个标签,相比之下也麻烦。如果在输入了一堆命令之后,再想回到之前输入过的某个命令,就更麻烦了。多窗口终端解决了这个痛点。

其他说明

  • 使用设置到 ~/.bashrc 中的自定义别名,高效输入命令。当然,最好采用专门的别名文件。
    ## ~/.bashrc
    ## 加载目录下所有别名文件
    for file in ~/aaa-my-all/my-alias/*; doif [ -f "$file" ]; then. "$file"fi
    done
    
  • 其他更多的功能,在一般使用场景里,应该不需要吧?
  • 其他命令格式,以后再补充。反正网络上很容易就找到;

在不同窗格中的标识问题

  Easy Bash Prompt Generator  

用途:手动自定义 tmux 各个窗格的不同提示符

简单用途没有必要使用 如 Starship 工具吧?

## ~/.bashrc## 手动设置。其他工具设置,由于版本等问题,安装配置,麻烦? 
custom_terminal‌_prompt() {# "$1" 这里使用自定义内容local container_name="$1"# echo "custom_shell_prompt"export PS1="\[\e[33m\]"$1"\[\e[m\]:\[\e[32m\]\w\[\e[m\] \n \$ "  # 可替换为下面“可选设置”中的某条语句
}
alias ctp='custom_terminal‌_prompt'## 注意,上面的函数,到此结束。不要复制下面的代码。
##===========================
## 可选设置
# 色号178(比172稍亮)
export PS1="\[\e[38;5;178;1m\]$1\[\e[m\]:\[\e[32m\]\w\[\e[m\] \n \$ "
# 色号172
export PS1="\[\e[38;5;172;1m\]$1\[\e[m\]:\[\e[32m\]\w\[\e[m\] \n>\$ "
# 色号166(更饱和的橙)
export PS1="\[\e[38;5;166;1m\]$1\[\e[m\]:\[\e[32m\]\w\[\e[m\] \n \$ "

用法:

# 在终端里输入
ctp 这里使用自定义内容 ctp dev
ctp log

  

将当前 tmux 所有的会话、窗口、窗格等等进行备份和恢复:还是使用插件方便

安装插件 tmux-plugins /tpm :Tmux Plugin Manager

 
GitHub - tmux-plugins/tmux-resurrect: Persists tmux environment across system restarts.   

1. 下载到指定的目录下

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

2. Reload TMUX environment so TPM is sourced: 刷新环境变量,类似于 source ~/.bashrc

# type this in terminal if tmux is already running
tmux source ~/.tmux.conf

3. Installing plugins  安装插件

上面提到的下载插件,只是下载了相当于是绿色软件而已。

  • 已经相当于是绿色软件了,为什么还需要安装:因为该 app 的成功运行,还需要创建有关的文件夹、文件,以及环境变量设置等等,
  1. Add new plugin to ~/.tmux.conf with set -g @plugin '...'
  2. Press prefix + I (capital i, as in Install) to fetch the plugin. (此步骤,需要在 tmux 终端里运行)

You're good to go! The plugin was cloned to ~/.tmux/plugins/ dir and sourced.

4. 在 .tmux.conf 的末尾,需要加入

# 官方:Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)

run '~/.tmux/plugins/tpm/tpm'

与宿主机之间的 复制、粘贴 功能:自己搞一个更方便。

## 例子## ~/.tmux.conf
# V0.21
## # type this in terminal if tmux is already running
# tmux source ~/.tmux.conf# 启用鼠标和 vi 键位(可选)
set -g mouse on
set-window-option -g mode-keys vi## ubuntu 只需要安装 sudo apt install xsel
## 虽然也可以使用 wl-copy ,但需要安装,没有必要安装那么多不同的剪切板。除非 xsel 不能用了?
# 绑定 Ctrl+B Ctrl+c 复制到系统剪贴板
bind C-c run-shell "\if tmux show-buffer > /dev/null 2>&1; then \if [ \"$XDG_SESSION_TYPE\" = wayland ] && command -v wl-copy >/dev/null; then \tmux save-buffer - | wl-copy; \else \tmux save-buffer - | xsel -i -b; \fi; \else \tmux display-message 'No content in tmux buffer!'; \fi"# 可选:绑定 Ctrl+B Ctrl+v 从剪贴板粘贴(反向操作)
bind C-v run-shell "\tmux set-buffer \"$(if [ \"$XDG_SESSION_TYPE\" = wayland ] && command -v wl-paste >/dev/null; then \wl-paste; \else \xsel -o -b; \fi)\"; \tmux paste-buffer"#### 启用插件 TPM 
# ------------------------
## 启用插件管理器
set -g @plugin 'tmux-plugins/tpm'
# 添加自动备份插件:确保 tmux-resurrect 在 tmux-continuum 之前加载:
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
## 启用自动恢复
## set -g @continuum-boot 'on' # 设置了,不成功 https://github.com/tmux-plugins/tmux-continuum/blob/master/docs/automatic_start.md
set -g @continuum-restore 'on'## 修改备份路径‌
# set -g @resurrect-dir '~/.tmux_backups'#### 最后:运行 TPM
run '~/.tmux/plugins/tpm/tpm'

resurrect 插件备份与恢复

路径搜索优先顺序:

这个目录需要用户自己创建,优先级高。当这个目录存在时,就不会再使用 ~/.local/share/tmux/resurrect/ ,这个 linux app 的惯用伎俩。

~/.tmux/resurrect/

默认安装时,使用这个目录,优先级低。

~/.local/share/tmux/resurrect/

如果需要备份,就打包 resurrect 这个目录好了。

last 这个链接文件,总是指向最新生成的 .txt 文件。修改这个链接文件的指向,可以恢复到指定的备份文件。一般没有必要吧?

一般 linux 发行版默认已经安装了 tmux。

可以

sudo apt install tmux

 如果必须的功能没有的话,也可以编译安装最新版的。

$ sudo make uninstall
[sudo] password for test: ( cd '/usr/local/bin' && rm -f tmux )  # 手动删除
## 安装 失败git clone https://github.com/tmux/tmux.git
cd tmux
sh autogen.sh
./configure && make
# ---------------sudo make install
make[1]: Entering directory '/home/test/aa/aa/tmux'/usr/bin/mkdir -p '/usr/local/bin'/usr/bin/install -c tmux '/usr/local/bin'
make  install-exec-hook
make[2]: Entering directory '/home/test/aa/aa/tmux'
if test xmdoc = xmdoc; then \sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1 \>./tmux.1.mdoc; \
else \sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1| \gawk -f ./mdoc2man.awk >./tmux.1.man; \
fi
/usr/bin/mkdir -p /usr/local/share/man/man1
/usr/bin/install -c -m 644 ./tmux.1.mdoc \/usr/local/share/man/man1/tmux.1
make[2]: Leaving directory '/home/test/aa/aa/tmux'
make[1]: Nothing to be done for 'install-data-am'.
make[1]: Leaving directory '/home/test/aa/aa/tmux'

tmux-3.5a

## 安装 ok# tmux-3.5a
#-----------------------sudo make install
[sudo] password for test: 
make[1]: Entering directory '/home/test/Downloads/aazzz/tmux-3.5a'/usr/bin/mkdir -p '/usr/local/bin'/usr/bin/install -c tmux '/usr/local/bin'
make  install-exec-hook
make[2]: Entering directory '/home/test/Downloads/aazzz/tmux-3.5a'
if test xmdoc = xmdoc; then \sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1 \>./tmux.1.mdoc; \
else \sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1| \gawk -f ./mdoc2man.awk >./tmux.1.man; \
fi
/usr/bin/mkdir -p /usr/local/share/man/man1
/usr/bin/install -c -m 644 ./tmux.1.mdoc \/usr/local/share/man/man1/tmux.1
make[2]: Leaving directory '/home/test/Downloads/aazzz/tmux-3.5a'
make[1]: Nothing to be done for 'install-data-am'.
make[1]: Leaving directory '/home/test/Downloads/aazzz/tmux-3.5a'

相关文章:

  • c++ using使用
  • 通信原理绪论
  • JDBC工具类的三个版本
  • 【python】json解析:invalid literal for int() with base 10: ‘\“\“‘“
  • 工厂节能新路径:精准节能的深度剖析
  • YOLO目标检测算法评估标准
  • C++STL——stack,queue
  • Python3(30) 正则表达式
  • 两数相加(2)
  • Profinet转CanOpen网关,打破协议壁垒的关键技术
  • 国内特殊车辆检测数据集VOC+YOLO格式4930张3类别
  • NVMe控制器IP设计之接口模块
  • Python核心编程深度解析:作用域、递归与匿名函数的工程实践
  • Python自动化-python基础(下)
  • C++中的static_cast:类型转换的安全卫士
  • 警备,TRO风向预警,In-N-Out Burgers维权风暴来袭
  • 基于Python的在线教育平台的设计与实现
  • 红黑树删除的实现与四种情况的证明
  • 探秘 Canva AI 图像生成器:重塑设计创作新范式
  • 编写第一个MCP Server之Hello world
  • 巴称巴控克什米尔地区11人在印方夜间炮击中身亡
  • 宇树科技王兴兴:第一桶金来自上海,欢迎上海的年轻人加入
  • 新城市志|上海再攻坚,营商环境没有最好只有更好
  • 美乌基金协议:美国搞了一套可在资源富集地区复刻的商业模式
  • 遇冰雹天气,西安机场新航站楼成“水帘洞”
  • 中国以优化营商环境为支点,为全球企业提供可预期市场环境