IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 在Git for windows(MSYS2)中实现tmux和windows剪切板的共享功能 -> 正文阅读

[开发工具]在Git for windows(MSYS2)中实现tmux和windows剪切板的共享功能

一直以来个人开发环境中linux下tmux和系统剪切板的共享功能都是通过xclip机制实现的,废话不多说直接贴在用的tmux配置文件吧:

# 显示vi-cope模式下的映射 tmux list-keys -t vi-copy
# 由于vim中C-b是上翻键的原始映射,为避免对vim产生影响,这里将tmux的快捷键前导修改为C-y
# unbind-key C-b
# set -g prefix C-y

# 设置开启光标事件功能, 配合vim-tmux-focus-events插件可以实现自动触发vim的FocusGained自动命令
# 注意:该配置会导致vim内部启动的terminal在切换tmux的Tab窗口时收到<Esc>[O, 需要在vim添加映射来处理这种情况
set -g focus-events on
set -g escape-time 0 # escape-time=0提高了esc键在vim中的反应速度,非常重要的配置
set -g mode-keys vi # tmux的复制模式使用vi模式以实现复制模式下操作和vim类似
set -g status-keys emacs # 状态栏使用emacs风格的按键映射
set -g status-interval 30 # 状态栏每30秒刷新一次
set -g display-time 1000 # 设置状态提示信息显示时间为1s
set -g wrap-search off # 关闭历史搜索时的自动循环搜索
set -g base-index 1 # index从1开始
set -g pane-base-index 1 # pane的索引从1开始
set -g renumber-windows on # 可以自动调节窗口index
set -g automatic-rename on # 远程终端的标题加入当前运行的程序名,vimdesktop需要用这个标题来切换快捷映射
set -g set-titles on # 设置窗口标题格式, 该格式需要被vimd使用
set -g set-titles-string '#W-#S' # 窗口格式设置为"程序名后总是追加'-tmux'
set -g allow-rename off # 是否允许使用printf \033kxxx\033\\ 名来来重命名当前窗口标题(#W)
set -g history-limit 81920 # 设置历史缓冲大小, 大一点会方便历史搜索
set -g default-terminal "xterm-256color" # 设置终端颜色为256色
set -ga terminal-overrides ",*256col*:Tc" # 设置tmux支持24bit的真彩色
set -g aggressive-resize on # 允许重设置窗口大小
set -g mouse on # 使能tmux的鼠标模式, 配合下面的自定义的按键配置基本可以实现复制模式无障碍自动切换

# 优化鼠标操作, 主要是为了支持自动复制到全局剪切板, 注意:\;前后的空格都不能省略, 否则会导致配置无效
# 复制模式下实现类似vim的'v'进入选择模式
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi B send-keys -X rectangle-toggle \; send -X begin-selection
# 复制模式下实现类似终端的快速搜索功能
bind-key -T copy-mode-vi / command-prompt -p "search up" "send -X search-backward '%%%'"
bind-key -T copy-mode-vi ? command-prompt -p "search down" "send -X search-forward '%%%'"
# 复制模式下鼠标滚动速度提升到半页滚动
bind-key -T copy-mode-vi WheelUpPane   select-pane \; send-keys -X halfpage-up
bind-key -T copy-mode-vi WheelDownPane select-pane \; send-keys -X halfpage-down

# 复制模式下实现y复制选择的内容到系统剪切板
bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -in -sel clip"
# 复制模式下单击鼠标实现清除选择操作
bind-key -T copy-mode-vi MouseDown1Pane select-pane \; send-keys -X clear-selection
# 复制模式下鼠标右键自动退出复制模式并自动粘贴刚刚选中的内容
bind-key -T copy-mode-vi MouseDown3Pane select-pane \; send-keys -X cancel \; paste-buffer
# 复制模式下鼠标拖拽实现自动复制选中内容复制到系统剪切板
bind-key -T copy-mode-vi MouseDragEnd1Pane select-pane \; send-keys -X copy-pipe "xclip -in -sel clip"
# 复制模式下双击自动选中小单词并复制到系统剪切板
bind-key -T copy-mode-vi DoubleClick1Pane  select-pane \; send-keys -X select-word \; send-keys -X copy-pipe "xclip -in -sel clip" \; send-keys -X select-word
# 复制模式下实现BS键和vim一致的效果:复制小单词
bind-key -T copy-mode-vi BSpace select-pane \; send-keys -X select-word \; send-keys -X copy-pipe "xclip -in -sel clip" \; send-keys -X previous-word
# 标准模式下鼠标双击自动进入复制模式并自动选择和复制单词
bind-key -T root DoubleClick1Pane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -et=;send-keys -X select-word;send-keys -X copy-pipe \"xclip -in -sel clip\";send-keys -X select-word'"
# 标准模式下鼠标 拖拽实现自动进入复制模式下并自动复制选择的单词, 注意:copy-mode后面必须填完-e参数才给能实现page-down等按键翻到最后时自动回到标准模式
bind-key -T root MouseDrag1Pane if-shell -F -t = "#{mouse_any_flag}" "if -Ft= '#{pane_in_mode}' 'copy-mode -et=' 'send-keys -M'" "copy-mode -et="
# 标准模式下鼠标向上滚动时自动进入复制并自动向上滚动半页
bind-key -T root WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -et=;send-keys -X halfpage-up'"
# 标准模式下鼠标右键实现类似普通终端的粘贴动作
bind-key -T root MouseDown3Pane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'run \"xclip -o -sel clip|tmux load-buffer -\";select-pane;paste-buffer'"

unbind-key -T prefix M-m
unbind-key -T root MouseDown3Status
unbind-key -T root M-MouseDown3Pane
unbind-key -T root MouseDown3StatusLeft
# 复制模式下实现类似vim的空格上翻页, 'Tab'下翻页功能
bind-key -T copy-mode-vi space send-keys -X clear-selection \; send-keys -X page-up
bind-key -T copy-mode-vi Tab   send-keys -X clear-selection \; send-keys -X page-down

bind-key -  splitw -v
bind-key \\  splitw -h
bind-key \; selectp -R
bind-key q  killp
bind-key z  kill-session
bind-key b switchc -l
bind-key v switchc -t tmux-d
bind-key r  source-file ~/.tmux.conf \; display "Config reloaded"

bind-key -T root M-1 selectw -t 1
bind-key -T root M-2 selectw -t 2
bind-key -T root M-3 selectw -t 3
bind-key -T root M-4 selectw -t 4

# =====================主题风格=========================
# 状态栏显示位置
set -g status-position top
# 设置状态栏元素分割符为空
set -g window-status-separator ""
# 状态栏前景背景色
set -g status-style 'bg=colour235 fg=colour253'
# 模式提示配色, 该配色同时也是copy-mode下选中内容的高亮色
set -g mode-style 'bg=colour226 fg=colour235'
# 消息显示配色
set -g message-style 'fg=colour226 bg=colour235'
# panes背景色/panes前景色/活跃panes背景色/活跃panes前景色
set -g pane-border-style 'bg=colour235 fg=colour235'
set -g pane-active-border-style 'bg=colour235 fg=colour235'
# 状态栏左右位置内容设置
setw -g status-left ""
setw -g status-right-length "150"
# setw -g status-right "#[fg=colour254,bg=colour235]#T#[fg=colour254,bg=colour235] %H:%M #[fg=colour235,bg=colour250] #S "
setw -g status-right "#[fg=colour254,bg=colour235] %H:%M #[fg=colour235,bg=colour250] #S "
# 状态栏窗口列表设置
setw -g window-status-format         "#[fg=colour254,bg=colour235] #I:#W "
setw -g window-status-current-format "#[fg=colour232,bg=colour163] #I:#W "

# 技巧:tmux list-keys可显示当前所有的按键绑定, 从已有的绑定写法中可以学习到很多按键绑定的高级配置方法

从配置可以看出关键的实现原理是通过copy-pipe "xclip -in -sel clip"这段操作实现双击拖拽等操作时自动将tmux 内部剪切板的内容复制到X window的系统剪切板中。很不幸该方法在Windows下失效了,如果想在Msys2或Git for Windows的mintty终端中使用tmux(在mintty中使用tmux的原因是默认的bash终端经常会出现vim中Alt组合键失效的问题,增加了tmux后该问题修复),则需要忍受每次复制时使用Shift作为前导键的方式才能实现复制内容到系统剪切板。昨天晚上是在无法忍受个反人类的操作方式了,于是想好好折腾一下看看有没有方法实现在MSYS环境中完成tmux和系统剪切板共享的方法。经过近2个小时的资料搜索加配置修改。最终还是实现这个小小的愿望。收集的资料和实现原理描述如下:

  1. Msys2(git for windows基于Msys2)环境中实现了一个/dev/clipboard驱动文件接口来完成和系统剪切板的交互, 通过echo “xxx” > /dev/clipboard即可将xxx文本复制到windows的系统剪切板中。 通过 cat /dev/clipboard也可以直接读取当前系统剪切中的内容。
  2. windows系统存在一个C:\Windows\System32\clip.exe程序可以实现在命令终端中将指定文件复制到系统剪切板, 操作方法为echo “xxx” | clip.exe
  3. 通过如下的tmux配置即可实现在Msys2中鼠标拖拽、双击等操作时自动复制内容到系统剪切板,鼠标右键自动粘贴系统剪切板的内容到终端:
# 复制模式下实现y复制选择的内容到系统剪切板
bind-key -T copy-mode-vi y run "tmux save-buffer - > /dev/clipboard"
# 复制模式下单击鼠标实现清除选择操作
bind-key -T copy-mode-vi MouseDown1Pane select-pane \; send-keys -X clear-selection
# 复制模式下鼠标右键自动退出复制模式并自动粘贴刚刚选中的内容
bind-key -T copy-mode-vi MouseDown3Pane select-pane \; send-keys -X cancel \; paste-buffer
# 复制模式下鼠标拖拽实现自动复制选中内容复制到系统剪切板
bind-key -T copy-mode-vi MouseDragEnd1Pane select-pane \; send-keys -X copy-pipe " " \; run "tmux save-buffer - > /dev/clipboard"
# 复制模式下双击自动选中小单词并复制到系统剪切板
bind-key -T copy-mode-vi DoubleClick1Pane  select-pane \; send-keys -X select-word \; send-keys -X copy-pipe " " \; send-keys -X select-word \; run "tmux save-buffer - > /dev/clipboard"
# 复制模式下实现BS键和vim一致的效果:复制小单词
bind-key -T copy-mode-vi BSpace select-pane \; send-keys -X select-word \; send-keys -X copy-pipe " " \; run "tmux save-buffer -> /dev/clipboard" \; send-keys -X previous-word
# 标准模式下鼠标双击自动进入复制模式并自动选择和复制单词
bind-key -T root DoubleClick1Pane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -et=;send-keys -X select-word;send-keys -X copy-pipe \" \";run \"tmux save-buffer - > /dev/clipboard\";send-keys -X select-word'"
# 标准模式下鼠标 拖拽实现自动进入复制模式下并自动复制选择的单词, 注意:copy-mode后面必须填完-e参数才给能实现page-down等按键翻到最后时自动回到标准模式
bind-key -T root MouseDrag1Pane if-shell -F -t = "#{mouse_any_flag}" "if -Ft= '#{pane_in_mode}' 'copy-mode -et=' 'send-keys -M'" "copy-mode -et="
# 标准模式下鼠标向上滚动时自动进入复制并自动向上滚动半页
bind-key -T root WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -et=;send-keys -X halfpage-up'"
# 标准模式下鼠标右键实现类似普通终端的粘贴动作
bind-key -T root MouseDown3Pane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'run \"cat /dev/clipboard|tmux load-buffer -\";select-pane;paste-buffer'"

注意:配置中记录了复制相关存在差异的部分,其他配置保持的linux环境下一致即可。

该配置几个关键点描述如下:

  1. 配置中所有 ; 分割符前面的空格不可省略,否则配置无效(linux环境下也是如此),这是个非常奇葩且坑爹的语法要求,原因未知。
  2. 配置中除了使用run "tmux save-buffer - > /dev/clipboard"实现剪切板复制操作外,多个地方出现的 send-keys -X copy-pipe " " ;操作也不可省略(cope-pipe后双引号里的空格也不可省略),否则会出现每次复制时内容为空。

这个配置是我在不断的修改配置过程中偶然发现的可行配置方式,至于为啥要在run "tmux save-buffer - > /dev/clipboard"操作之前添加 send-keys -X copy-pipe " " ;操作也是没有搞明白。总之最后结果是这个配置工作的very nice。

折腾了2个小时终于的搞出了一个能用的东西,也算功夫没有白费。这里就贴出来给有同样需求的人的人一些帮助。(细节是魔鬼,还是让他留在地狱吧)。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:48:05  更:2021-11-12 19:49:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:06:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码