Masimaro's blog - 终端管理
type: channel
link: https://www.masimaro.top/tag/%E7%BB%88%E7%AB%AF%E7%AE%A1%E7%90%86/
items: Emacs 折腾日记(二十七)——终端管理

Emacs 折腾日记(二十七)——终端管理
type: item
date: 2025-07-01T11:28:22+08:00
description: Emacs 号称一个伪装成文本编辑器的操作系统，你几乎可以在Emacs中干任何事情。在Emacs中运行终端自然是小菜一碟。Emacs中有许多其他类型的shell，例如 eshell、term、vetrmterm 终端其中 term 是Emacs中自带的shell，它最终是调用系统中安装的其他shell环境。我们可以直接使用 M-x 调用 term命令，来选择启用一个系统终端。我们可以在这个终端上进行一些操作。但是还有一些执行细节需要优化。控制term窗口的显示首先我们看到在启动终端之后，它占用了一整个窗口，这对于我来说并不友好。一般情况下我只是希望在编写代码之后临时的调用终端执行一些命令，例如编译或者运行代码之类的操作。因此我希望它可以放到下方并且可以快速的关闭退出我们可以通过 shackle 插件来控制窗口的行为。主要有：方向、大小和弹出方式等等。配置 shackle 插件最重要的是变量 shackle-rules 。它的构成如下: CONDITION(:regexp) :select :inhibit-window-quit :size+:align|:other :same|:popupCONDITION 是相关的条件，表示我们要定义哪一类窗口的行为。这个条件可以是正则表达式，可以是字符串，可以是modeselect 控制弹出窗口后是否选中size: 0到1间的数字，控制窗口宽度和高度占整个窗口区域的百分比inhibit-window-quit: 按q退出时不删除这个缓冲区align: 弹出窗口的对齐方式，取值有 ’left, ‘right, ‘below, ‘aboveother: 如果当前 frame 有多个 window，是否复用另外一个 windowpopup: 弹出一个新的 window，而不是复用当前 windowsame: 不弹出 window，复用当前 windowignore: 禁止显示该窗口我们当前的配置可以这么写(use-package shackle :ensure t :hook (after-init . shackle-mode) :custom (shackle-default-size 0.5) (shackle-default-alignment 'below) :config (setq shackle-rules '((term-mode :regexp t :select t :size 0.3 :align t :popup t :quit t))))这里表示 term 窗口在弹出之后占据下方30%的区域进行显示，并且退出后直接关闭窗口。这样我们可以看到使用 term 之后窗口显示在下方，并且像普通buffer那样可以使用vim的命令 :q 来退出快速切换显示和隐藏状态对于终端这种临时窗口，我们一般不会让它长时间驻留在buffer中。想要的时候随时调用、不要的时候随时关闭或者隐藏。对于这种快速打开关闭的需求，我们可以使用 popper 插件。它通过赋予任意缓冲区“弹出”状态，让这些缓冲区不打扰你的核心工作区，只需一键即可调用或隐藏，完美适用于那些需要即时访问但又希望不影响视线的场景。popper-toggle、popper-cycle 和 popper-toggle-type 是三个核心命令。popper-toggle: 快速切换最新一个弹出缓冲区的显示/隐藏状态popper-cycle: 循环切换所有标记为弹出的缓冲区popper-toggle-type: 切换特定类型缓冲区的显示/隐藏状态另外它需要通过 popper-reference-buffers 来定义特定类型的缓冲区，插件会将符合这些规则的缓冲区标记为 POP并且进行管理。popper-reference-buffers 支持正则表达式来匹配缓冲区名。我们可以使用下面简单的配置(use-package popper :ensure t :hook (after-init . popper-mode) :init (setq popper-reference-buffers '("\\*Messages\\*" "\\*Async Shell Command\\*" term-mode help-mode helpful-mode "^\\*eshell.*\\*$" eshell-mode "^\\*shell.*\\*$" shell-mode ("\\*corfu\\*" . hide))) :config (my-leader-def "/" #'popper-toggle "t" #'popper-cycle "T" #'popper-toggle-type) )最终它的效果如下:eshelleshell …