仅在行模式下突出显示当前行(不在char模式下)

时间:2013-03-31 20:18:51

标签: emacs

在ansi-term工作时,如果我在line mode时,如何才能使用emacs突出显示当前行? (而不是char mode?)。

我目前有(global-hl-line-mode t)在每个缓冲区(我想要的)中激活hl-line-mode。我只是想在char run mode中专门禁用它。

1 个答案:

答案 0 :(得分:3)

您可以分两步完成所需的效果。首先,使用以下行替换(global-hl-line-mode t)文件中的.emacs

(add-hook 'after-change-major-mode-hook
          '(lambda () (hl-line-mode (if (equal major-mode 'term-mode) 0 1))))

这基本上与使hl-line-mode成为全局次要模式的做法相同,因为每次缓冲区的主要模式发生变化时它都会打开hl-line-mode。但如果缓冲区的新主要模式为hl-line-mode,则它不会打开term-mode。这样,hl-line-mode默认禁用ansi-term

但是,当您在line-mode时(但不在char run mode中)时,您确实希望将其打开。为此,请将以下行添加到.emacs文件中:

(defadvice term-line-mode (after enable-hl-line-in-term-line-mode)
  (hl-line-mode 1))

(defadvice term-char-mode (after disable-hl-line-in-term-char-mode)
  (hl-line-mode 0))    

根据您使用的Emacs版本,您可能会在迷你缓冲区中遇到上述代码的奇怪行为:每次使用迷你缓冲区时,整行或部分行都可能会突出显示。要解决此问题,请将以下行添加到.emacs文件中:

(add-hook 'minibuffer-setup-hook '(lambda () (hl-line-mode 0)))

这种方法可以让您在hl-line-mode开启或关闭时具有相当大的灵活性。例如,如果您想要关闭hl-line-mode的其他主要模式,可以将以上代码的(equal major-mode 'term-mode)部分替换为:

(member major-mode '(term-mode other-mode1 other-mode2))

其中other-modeN是您希望hl-line-mode被禁用的主要模式的名称。当然,你不仅限于两个这样的名字。