如何在Tmux emacs复制模式下复制文件的整个内容(>1窗格)?

4
我想在tmux中使用emacs复制模式复制文件的全部内容。
但是当我进入复制模式,按下C-space开始突出显示文本,然后按下M->跳转到文件末尾时,我最终只能跳转到tmux面板底部的文件信息部分。
这里是一张展示发生情况的图片:
编辑:我是一个新用户,显然还不能发布图片。但基本上你可以想象在tmux复制模式下黄色突出显示(选定)的文本。而不是文件末尾,我只能突出显示到面板底部(看起来有点像这样):
-u-:----F1 file_name.rb      Top L1      (Ruby)---------------------------------

我的问题是,如何进入复制模式,开始选择文本,并跳转到文件的末尾?
如果这不是实现我的目标(在tmux中复制整个文件内容)的最佳方法,有更好的方法吗?
谢谢!
附言:
我已经按照这里的说明进行了操作:https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard 还有《实用的tmux》一书的说明。
如果有帮助的话,以下是我.tmux.conf文件中相关的几行(我大部分都是从《实用的tmux》一书中复制的):
# use pbcopy|pbpaste wrapper script
set-option -g default-command "reattach-to-user-namespace -l zsh"

# send contents of current tmux buffer to system clipboard
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"

# support pasting from the system clipboard
bind C-v run "tmux set-buffer $(reattach-to-user-namespace pbpaste); tmux paste buffer"

# overriding "auto-detection" to always use emacs
set-option -g status-keys emacs
set-option -gw mode-keys emacs
2个回答

3
答案是肯定的,而且很简单:你需要运行其中一个tmux命令。可以通过按Ctrl+b+:并输入命令来运行tmux命令。
load-buffer path

或者

loadb path

简称

1
是的,这也可以。当您实际上不在 tmux 中查看文件时,似乎更方便复制文件内容。 - d3vin

1

tmux并不真正理解您在其提供的tty中运行emacs。它只知道已写入该tty的内容;因此,当您在tmuxcopy-mode中按下M->时,它只是移动到窗格滚动历史记录的底部(在copy-mode中按下M->会运行(copy-mode特定的)tmux命令history-bottom)。

您确实需要从emacs内部解决这个问题。以下是一些(可交互运行的)示例函数,您可以将其绑定到emacs中的键:

(defun write-region-to-tmux-buffer (beg end)
  (interactive "r")
  (shell-command-on-region beg end "tmux load-buffer -" nil nil nil t))

(defun write-buffer-to-tmux-buffer ()
  (interactive)
  (write-region-to-tmux-buffer (point-min) (point-max)))

如果您想绕过缓冲区并使用文件(即从磁盘上的文件创建缓冲区,而不是缓冲区的(可能已修改)内容),则可以使用类似以下代码:
(defun write-buffer-file-to-tmux-buffer ()
  (interactive)
  (let ((fn (buffer-file-name)))
    (if fn
        (shell-command
         (concat "tmux load-buffer "
                 (shell-quote-argument fn)))
      (error "Not a file-backed buffer"))))

谢谢你的回答。由于我迄今为止只是复制/粘贴emacs配置,所以可能需要一些技巧才能弄清楚这个问题。因此,一旦我搞清楚了,我会重新查看你的答案。注意:我有O'Reilly的“学习GNU Emacs,第3版”,“编写GNU Emacs扩展”以及FSF的“GNU Emacs手册”作为参考。如果您熟悉这些来源(或其他参考资料)-并且有几分钟时间-请指向教我如何使用您的示例函数绑定到emacs中的键的信息。-谢谢! - d3vin
我并不是Emacs的重度用户,但类似(global-set-key (kbd "C-c t") 'write-region-to-tmux-buffer)这样的代码可能会起作用(即在你的.emacs文件中,连同函数定义一起)。 - Chris Johnsen
太棒了 - 谢谢!为了解决这个问题,我在我的~/.emacs文件中添加了(defun write-buffer-file-to-tmux-buffer ()...)(global-set-key (kbd "C-c t") 'write-buffer-file-to-tmux-buffer)。然后,在tmux中,我使用emacs进入一个文件,按下C-c t,然后按下[prefix] C-c并将输出粘贴到TextEdit.app中(进行测试)。效果非常好。 - d3vin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接