如何在 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-buffer
、delete-buffer
和 paste-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-] 并回答提示 - 缓冲区内容将粘贴到点
我一直在使用 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-buffer
、delete-buffer
和 paste-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-] 并回答提示 - 缓冲区内容将粘贴到点