emacs haskell模式中的默认lambda符号?

时间:2012-05-05 20:34:03

标签: haskell emacs

有没有人知道如何在emacs中使用haskell打印λ而不是\。我知道可以使用haskell-font-lock-symbols,但我发现其余部分很难阅读 - 箭头太小了!

是否有一种简单的方法来覆盖其余的钥匙?

2 个答案:

答案 0 :(得分: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)))))

答案 1 :(得分:2)

您也可以使用类似

的方法解决问题
(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))))

应保留所有映射,但更改“ - &gt;”的映射除外将“→”和“&lt; - ”改为“←”。