Emacs Haskell模式中的默认lambda符号是什么?

9

有没有人知道在emacs中使用haskell打印λ而不是\的方法。我知道可以使用haskell-font-lock-symbols,但我发现其中的其他符号很难辨认 - 箭头太小了!

是否有简单的方法来覆盖其他键?

2个回答

3
您可以像这样解决问题:
(eval-after-load 'haskell-font-lock
 '(setq haskell-font-lock-symbols-alist
        (delq nil
              (mapcar (lambda (rewrite)
                        (if (member (car rewrite) '("->" "<-"))
                            nil rewrite))
                      haskell-font-lock-symbols-alist))))

除了将“ -> ”更改为“ →”和“<-”更改为“←”之外,应保留所有映射。


2
你可以这样做:
(defun pretty-lambdas-haskell ()
  (font-lock-add-keywords
   nil `((,(concat "\\(" (regexp-quote "\\") "\\)")
          (0 (progn (compose-region (match-beginning 1) (match-end 1)
                                    ,(make-char 'greek-iso8859-7 107))
                    nil))))))

(add-hook 'haskell-mode-hook 'pretty-lambdas-haskell)

这将lambda添加为关键字,这意味着它在字符串中不会出现转义序列,例如(TODO:更改后情况并非如此)。当然,,(make-char'greek-iso8859-7 107)等同于,但在这种情况下,您必须确保Emacs init文件以unicode编码。

您还可以启用完整的符号字体锁定并使用更好的(即具有更宽箭头的)字体,例如Pragmata ProInconsolataUbuntu Monospace。我使用以下代码选择良好的字体:

(defun font-existsp (font)
  "Check to see if the named FONT is available."
  (if (null (x-list-fonts font))
      nil t))

(require 'cl)
(defun font-avail (fonts)
  "Finds the available fonts."
  (remove-if-not 'font-existsp fonts))

(defvar font-preferences
      '("PragmataPro"
        "Inconsolata"
        "DejaVu Sans Mono"
        "Bitstream Vera Sans Mono"
        "Anonymous Pro"
        "Menlo"
        "Consolas"))

(unless (eq window-system nil)
  (let ((fonts (font-avail font-preferences)))
    (unless (null fonts)
      (set-face-attribute
       'default nil :font
       (car fonts)))))

我想我曾经读过这个维基百科的例子……尝试了一下,但没有成功。希望我只是在这里错过了什么技巧。附言:我使用Menlo字体。 - beoliver
我现在修复了代码;它在GUI Emacs、终端Emacs等环境下都可以工作。如果现在对你不起作用,我认为这是你的Emacs存在问题 ;) 我将尝试使正则表达式上下文相关;目前,它也会转义字符串中的斜杠。 - dflemstr
好的...是的,我明白你说的字符串问题了。现在它肯定是在工作了。我也开始使用PragmataPro字体了。非常感谢你! - beoliver

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