символ лямбда по умолчанию в режиме emacs haskell?

кто-нибудь знает, как я могу печатать λ вместо с помощью haskell в emacs. Я знаю, что можно использовать символы haskell-font-lock, но остальные трудно читать-стрелки слишком малы!

есть ли простой способ переехать остальные ключи?

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)

это добавляет лямбда в качестве ключевого слова, что означает, что он не будет отображаться в escape-последовательностях в строках, например (TODO: это не так после изменения вещи). The ,(make-char 'greek-iso8859-7 107) - это, конечно, эквивалентно , но вы должны убедиться, что ваш файл инициализации Emacs закодирован как unicode в этом случае.

вы также можете включить полную блокировку шрифта символа и использовать лучший (читайте: с более широкими стрелками) шрифт, как Pragmata Pro, Inconsolata или Ubuntu 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)))))

вы также можете решить проблему с что-то вроде

(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))))

который должен хранить все сопоставления, кроме того, который изменяет "- > " на " → " и "