tmux 与 emacs 的集成:emacs-tmux-pane

Emacs中使用内置term,个人认为最好用的是vterm

内置term有其方便的地方,因为term buffer也是Emacs的buffer,集成性更好。 但这种集成性,也带来一些坏处。

比如: Emacs使用evil mode,而term中使用vim,那么你按一个ESC,就要指定到底是发给evil还是vim

外置的Emacs能够提供最好的兼容性,这是内置term所达不到的。

emacs-tmux-pane是我写的一个包,收录在melpa 中,提供了 Terminal Emacs和tmux的集成。

使用这个包后,在tmux上使用Emacs,就可以在emacs中方便的打开和关闭新的tmux pane,然后无缝在Emacs的window和tmux的pane之间导航。

11 个赞

一直在用呢~~~谢谢

有人用我也开心 :grinning:

这个package写了几年了, 但是以前我没来这个论坛, 没向大家介绍过。

vterm 能不能做到在 char-mode 下把任何键都直接传给终端,在 copy-mode 再传给 Emacs?

我在用spacemacs (Hybrid-mode,normal-mode 是evil的normal mode,insert-mode 是直接利用Emacs自己的编辑模式)下的 vterm,觉得比较好区别ESC send 给谁啊,利用C-z,切换为emacs模式,跟用直接的terminal 没区别,开vim也一致; C-z 切换为evil 的normal mode,ESC就是整个Emacs 在使用

是的,可以切换。 轻度使用term的时候,我自己也是用的vterm, 像ESCC-c都可以切换是否到vterm上。

重度使用时,还是不合适的: 毕竟冲突的键很多,切换也麻烦。

只限终端emacs?

赞一下,有空玩一玩

只限终端emacs?

是啊。tmux本身就是终端啊。在tmux上跑emacs。

为什么配置两个同样的命令?

打错了呗。。根据前面两行,应该是有一个toggle打成了open,没必要纠结这个

为什么配置两个同样的命令?

应该是这样:

(use-package! tmux-pane
  :config
  (tmux-pane-mode)
  (map! :leader
        (:prefix ("v" . "tmux pane")
          :desc "Open vpane" :nv "o" #'tmux-pane-open-vertical
          :desc "Open hpane" :nv "h" #'tmux-pane-open-horizontal
          :desc "Open hpane" :nv "s" #'tmux-pane-open-horizontal
          :desc "Open vpane" :nv "v" #'tmux-pane-open-vertical
          :desc "Close pane" :nv "c" #'tmux-pane-close
          :desc "Rerun last command" :nv "r" #'tmux-pane-rerun))
  (map! :leader
        (:prefix "t"
          :desc "vpane" :nv "v" #'tmux-pane-toggle-vertical
          :desc "hpane" :nv "h" #'tmux-pane-toggle-horizontal)))
  • <leader> v o<leader> v v 都能打开 vertical pane.
  • <leader> v h<leader> v s 都能打开 horizontal pane.

因为 ohvim的习惯,vstmux的习惯。

请问你tmux和emacs的prefix配置的一样吗?是什么啊?

只是说vs的使用方式。 当然前缀不一样啊,要不然在tmux里面跑emacs,可不就产生冲突了。

tmux 我是用的C-a

好吧,体验了一下有些问题,而且emacs里面也没必要这样切换吧,两种切换按键模式容易误操作。

好像还是解决不了emacs term里面运行远程ssh,然后在远程ssh里面跑tmux的难题。

好像还是解决不了emacs term里面运行远程ssh,然后在远程ssh里面跑tmux的难题。

@DR_MING 不是这么用的。这个是tmux里面跑emacs,不是emacs里面跑tmux。

  • 你本地起一个tmux
  • 本地tmux里面跑emacs
  • 本地tmux跑ssh
  • ssh里面再跑远端的tmux

完全没问题的。 macos里面和linux里面可以用不同的 prefix key,完全不冲突。

# tmux.conf
if-shell 'test "$(uname -s)" = Darwin' 'source ~/.config/tmux/macos.conf'
if-shell 'test "$(uname -s)" = Linux' 'source ~/.config/tmux/linux.conf'

学到了,谢谢!我待会试一下。

不用不知道, 用了真的是觉得 tmuxscreen 更强大好用少不了哦…

但是Emacs的内置 tmux 的好处是什么? 为什么需要内置的? 不会降低了灵活性吗?

内置有内置的好处啊。

如果你以编辑为主,兼顾console 这时可以用GUI的emacs里面嵌入tmux

如果你是console为主,编辑为辅 你当然tmux里面嵌编辑器更好