2013-03-31 37 views

回答

3

您可以通过两个步骤达到您想要的效果。首先,在你.emacs文件与以下行替换(global-hl-line-mode t)

(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的缓冲变化的主要模式。但是,如果缓冲区的新主要模式是term-mode,则它不打开hl-line-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被禁用。当然,你不仅限于两个这样的名字。

+0

谢谢!嗯,这和我想要的完全相反。其中一部分可能是我的错。我已经更新了OP,使其更加清晰。我希望**仅在**行模式**下突出显示**,而不要在** char模式下**。 在你的代码做相反的事情时(它在** char模式**中将**变成** **并在**行模式**中变为** off **)。 –

+0

@ user815423426真的吗?这很奇怪,我只是将答案中的代码复制并粘贴到我自己的.emacs文件中,并且它可以按照我的预期工作,例如,它在char模式下被关闭*,在line模式下被关闭。在发布初始版本后,我做了一些编辑,你会介意在当前版本中再次尝试一下吗? – Thomas

+0

立即工作。我可能正在使用旧版本的一部分。它的功能就像一个魅力,它使终端工作变得更容易。谢谢! –

相关问题