如何在 Tmux 中模拟类似 Emacs 的寄存器?



我一直在使用Emacs寄存器,它们在许多复杂的编辑场景中都是一件幸事(例如,编辑多个相互关联的配置文件,使用多个代码片段,处理段落和表达式等(。它们的多功能性几乎是无限的。我还瞥见了 Vim 寄存器,对于大多数用途,它们在很大程度上是等效的。我遇到过一些使用场景,我希望 Tmux 具有类似的功能。问题是:这可以用于 Tmux 吗以及如何做到这一点?

起初我对自己说:我去看看 Tmux 源代码。我将学习它如何处理复制/粘贴和复制一些预定义寄存器的行为,例如拉丁字母的每个字母 26个。所以我这样做了,令我惊讶的是,发现该功能已经存在,尽管宣传得不是很好。

这个概念在那里被称为buffers,它提供了一个简单的set-bufferdelete-bufferpaste-buffer的界面。所以我想我会在我的.tmux.conf中创建两个绑定 - 一个用于将用户选择的缓冲区替换为所选文本(先执行delete-buffer然后执行set-buffer(,另一个从用户选择的缓冲区粘贴。这几乎做到了,除了由于某种原因delete-buffer没有优雅地处理不存在的缓冲区这一事实。我当时的想法是在相应的字母下初始化 26 个缓冲区并完成。今天,我已经尝试了没有初始化缓冲区的方法,它仍然有效。也许较新版本的 Tmux 可以更好地处理这个问题。无论如何,下面我将粘贴相关的配置片段:

# Initialize alphabetic registers to avoid the problem with 'delete-buffer'
# This might *not* be necessary in newer versions of Tmux
run "tmux set-buffer -b a "$(echo ' ')""
run "tmux set-buffer -b b "$(echo ' ')""
run "tmux set-buffer -b c "$(echo ' ')""
run "tmux set-buffer -b d "$(echo ' ')""
run "tmux set-buffer -b e "$(echo ' ')""
run "tmux set-buffer -b f "$(echo ' ')""
run "tmux set-buffer -b g "$(echo ' ')""
run "tmux set-buffer -b h "$(echo ' ')""
run "tmux set-buffer -b i "$(echo ' ')""
run "tmux set-buffer -b j "$(echo ' ')""
run "tmux set-buffer -b k "$(echo ' ')""
run "tmux set-buffer -b l "$(echo ' ')""
run "tmux set-buffer -b m "$(echo ' ')""
run "tmux set-buffer -b n "$(echo ' ')""
run "tmux set-buffer -b o "$(echo ' ')""
run "tmux set-buffer -b p "$(echo ' ')""
run "tmux set-buffer -b q "$(echo ' ')""
run "tmux set-buffer -b r "$(echo ' ')""
run "tmux set-buffer -b s "$(echo ' ')""
run "tmux set-buffer -b t "$(echo ' ')""
run "tmux set-buffer -b u "$(echo ' ')""
run "tmux set-buffer -b v "$(echo ' ')""
run "tmux set-buffer -b w "$(echo ' ')""
run "tmux set-buffer -b x "$(echo ' ')""
run "tmux set-buffer -b y "$(echo ' ')""
run "tmux set-buffer -b z "$(echo ' ')""
# Copy to user-selected register
bind -T copy-mode r command-prompt -1 -p '(register)' 'delete-buffer -b %1 ; send -X copy-pipe "tmux set-buffer -n %1"'
# Paste from user-selected register
bind -T prefix C-] command-prompt -1 -p '(register)' 'paste-buffer -b %1'

使用此设置的方法如下:

  • 要将文本放入寄存器中,请在copy-mode中标记它,按R并回答寄存器名称提示
  • 粘贴点击C-b C-]并回答提示 - 缓冲区内容将被粘贴到点

最新更新