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

How to emulate Emacs-like registers in Tmux?

我一直在使用 Emacs registers and they are a blessing in many sophisticated editing scenarios (e.g. editing multiple inter-related configuration files, using multiple code snippets, juggling paragraphs and expressions around, etc.). Their versatility is virtually limitless. I've also had a glimpse at Vim registers,对于大多数用途,它们在很大程度上是等效的。当我希望 Tmux 具有类似功能时,我遇到了一些使用场景。问题是:这可以用在 Tmux 中吗?如何使用?

一开始我对自己说:我还是去看看Tmux源码吧。我将学习它如何处理 copy/paste 并复制一些预定义寄存器的行为,比如 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-] 并回答提示 - 缓冲区内容将粘贴到点