如何发现在helm缓冲区中使用了哪些面?

3
我希望更改*helm ag*缓冲区中某些内容的外观。我的一些常规技巧(例如使用M-x customize-face并将光标放在感兴趣的区域)无法使用,因为在helm缓冲区中无法获取光标的控制权。

我的问题如下:

  • 教我钓鱼,让我终身受益:如何发现在不能放置光标的缓冲区中使用的字体?

  • 给我鱼,让我一天不饿:在当前选定行上突出显示模式匹配时,在*helm ag*缓冲区中使用哪种字体?

更新

对于由helm-ag命令创建的*helm-ag*缓冲区,相关字体是helm-match。然而,在由helm-do-grep-ag命令创建的*helm ag*缓冲区中,helm-match字体似乎没有效果,如下面的进一步信息所述。

进一步信息

这是一个 Emacs 会话的图片,其中没有启用任何自定义主题。

illustration of the problem

在左下角有一个搜索defun*helm ag*缓冲区。缓冲区中选择了第三行。匹配项(defun)在所有其他行中都被突出显示,但在所选行上没有突出显示。
右侧是一些可能的候选人的面部定制缓冲区。helm-match已设置为具有红色前景色,但在*helm-ag*缓冲区中未反映出来。这似乎表明helm-match不是我要找的东西。

如果您可以将光标置于带有面部的文本(或覆盖层)上,请使用“C-u x =”并在缓冲区“* Help *”中查找“face”说明。如果您无法这样做,请使用“M-x list-face-display”并检查外观相似的面部。(这不仅适用于 Helm。) - Drew
我怀疑发生的情况是helm-selected-line覆盖了行上的所有面属性。因此,在突出显示的行下,其他行上匹配使用的面不会显示出来。很可能所有的面都使用相同的属性(背景)来进行突出显示。你可能可以通过调整helm-match的前景面来做一些事情,但我怀疑你不能对背景做太多改变,因为它将被helm-selected-line覆盖。 - Tim X
@TimX helm-selected-line 覆盖了其他属性,这是问题的一部分。更微妙的部分是,如果 ag 生成的匹配颜色可用,helm 更喜欢使用它自己生成的匹配颜色,并忽略 helm-match 等面孔。我的答案提供了更多细节。 - jacg
我想知道更改跟随缓冲区中目标匹配的面的名称,如果你知道我的意思。 - Emmanuel Goldstein
3个回答

2

类似于@elethan的第三种方法:

  • 调用list-faces-display,它将按字母顺序显示所有面的列表。

  • 搜索“helm”。


太好了!我不知道这个命令。这个命令提供的列表似乎比“customize-face”提供的更容易浏览(特别是对于OP的目的),因为只显示样例。 - elethan
“list-faces-display”(在“helm-swoop”的帮助下)是我最初尝试的第一步,但它并没有引导我找到任何似乎有所改变的东西。(请参见问题编辑。) - jacg

2

首先,这是你的“fish”:我认为你所说的面孔是helm-match

以下是我个人尝试查找给定面孔并且无法在文本上放置指针的几种不同策略:

  1. 使用M-x describe-face,猜测名字的第一部分可能是什么(在本例中是helm),并扫描以那个开始的可能的候选项。
  2. 转到可能定义该面孔的代码(在本例中是helm-ag.el,可以通过M-x describe-function RET helm-ag找到),并在该文件中搜索face来查找可能的匹配项。
  3. 执行M-x customize-face,输入'all faces',查找helm-*面孔,并尝试找到与要查找的面孔相匹配的名称和面孔(因为您可以在此缓冲区中看到面孔的示例)。

也许这些方法都不如你希望的直接,可能还有更快的解决方法,但这是我会做的事情(也做过的)。在本例中,我使用了第二种方法找到了该面孔。

更新:

这是我设置的屏幕截图:

enter image description here

请注意,对我而言,相关面孔是helm-match,它从replace.el中的match继承而来。此外,请注意,突出显示/选定行中匹配项显示方式与其他行不同的区别不是由于不同的面孔造成的,而是由于行突出显示的背景颜色如何影响颜色所致,可以在此处突出显示示例文本时看到:

enter image description here

更新2:

原来OP使用的是helm-ag-do-grep,该函数在另一个文件helm-grep.el中定义。以下是该代码的面孔设置部分:

;;; Faces
;;
;;
(defgroup helm-grep-faces nil
  "Customize the appearance of helm-grep."
  :prefix "helm-"
  :group 'helm-grep
  :group 'helm-faces)

(defface helm-grep-match
  '((((background light)) :foreground "#b00000")
    (((background dark))  :foreground "gold1"))
  "Face used to highlight grep matches."
  :group 'helm-grep-faces)

(defface helm-grep-file
    '((t (:foreground "BlueViolet"
          :underline t)))
  "Face used to highlight grep results filenames."
  :group 'helm-grep-faces)

(defface helm-grep-lineno
    '((t (:foreground "Darkorange1")))
  "Face used to highlight grep number lines."
  :group 'helm-grep-faces)

(defface helm-grep-finish
    '((t (:foreground "Green")))
  "Face used in mode line when grep is finish."
  :group 'helm-grep-faces)

(defface helm-grep-cmd-line
    '((t (:inherit diff-added)))
  "Face used to highlight grep command line when no results."
  :group 'helm-grep-faces)

我认为helm-grep-match是你正在寻找的。如果不是,那么上面的代码片段中可能涉及到相关的面,所有这些面都可以使用customize-face进行自定义。此代码也是使用上述第二种方法跟踪到的。


@jacg 这很奇怪。你使用的emacs和helm-ag版本是什么?在我的情况下,将匹配项的面设置为helm-match是硬编码在helm-ag的源代码中的。此外,请查看我的更新答案,其中包含一些屏幕截图,展示了它在我的电脑上的效果。 - elethan
是的,helm-grep-match 确实是这个函数,但它仍然没有效果。根据 helm 的维护者说法,选择叠加层具有更高的优先级,因此会隐藏匹配项,"所以这里没有任何问题"(https://github.com/emacs-helm/helm/issues/1660#issuecomment-272295810)。但不知何故,在 helm-ag 中它可以正常工作。 - jacg
是的,这似乎经常出现。以下是一些相关的帖子,包括我的一个:http://emacs.stackexchange.com/questions/20620/line-highlighting-canceling-out-syntax-highlighting,http://emacs.stackexchange.com/questions/10445/hl-line-mode-hide-background-how-to-avoid-this, http://emacs.stackexchange.com/questions/19947/unset-inherited-face-attribute。 - elethan
旁问一下:您的截图表明您使用org mode来撰写Stack Exchange帖子。您是否使用比简单的复制粘贴更复杂的东西? - jacg
@jacg 实际上,我通常在 Emacs 中使用 gfm-mode(github-flavored markdown),它是 markdown-mode 的一部分,用于撰写问题和答案。这样我就可以拥有与 Stack Exchange 相同的格式。然而,有一段时间我也使用了这个模式:https://github.com/vermiculus/sx.el,它也非常有用。 - elethan
显示剩余4条评论

0

ag本身使用颜色来突出匹配项。Helm使用这些颜色并忽略helm-grep-match,除非helm-grep-ag-command包含--nocolors选项。

因此有两种方法:

  1. 使用--color-match选项在helm-grep-ag-command中设置所需的颜色。

  2. 使用--nocolor选项禁用ag的匹配突出显示,并设置Emacs的helm-matchhelm-grep-match(不确定哪个是正确的),以指定匹配颜色。由于第二种方法使用elisp处理着色,因此可能比第一种方法慢。

在这两种情况下,匹配高亮将被 helm-selection 覆盖,因此唯一能够在选定行上突出显示匹配项的方法是让 helm-selection 不指定背景或前景色,从而留出匹配高亮的位置。
参考链接:https://github.com/emacs-helm/helm/issues/1660#

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