#emacs #fortran #elisp
#emacs #fortran #elisp
Вопрос:
Как по-разному выделять числа с плавающей запятой и целые числа в файлах .F90 в Emacs? В моей версии 24.4.1 нет разницы между числами с плавающей запятой и целыми числами. Как я могу отобразить их разными цветами?
Ответ №1:
Режим emacs fortran по умолчанию не различает начертания шрифта для чисел с плавающей запятой и целых чисел. Однако вы могли бы использовать highlight-numbers
пакет (через M-x package-list-packages
или https://github.com/Fanael/highlight-numbers ).
Добавьте следующее к вашему .emacs
, чтобы выделить числа с плавающей запятой (измените цвета переднего плана и фона по своему усмотрению:
(add-hook 'fortran-mode-hook 'highlight-numbers-mode)
(add-hook 'after-init-hook
(lambda ()
(puthash 'fortran-mode
(rx (and symbol-start
(? "-")
( digit)
"."
( digit)
(*? any)
symbol-end))
highlight-numbers-modelist)
(set-face-attribute 'highlight-numbers-number nil
:foreground "gray60" :background "black")))
Комментарии:
1. Привет, Джастин, спасибо за ответ. Я установил режим выделения чисел и родительский режим. Однако добавление того, что вы предложили, в мой init.el выдает ошибку: «Значение символа как переменной равно void: highlight-numbers-modelist».
2. Я также пытался напрямую добавить режим fortran в файл highlight-numbers.el, а затем включить этот пакет вручную. Но он по-прежнему не различает числа с плавающей запятой и целые числа. Вместе они приобретают другой цвет. Можете ли вы объяснить, что вы написали в коде? Заранее спасибо!
3. Я не уверен, что приведенный выше код
init.el
будет работать, я добавил его в свой~/.emacs
. Ошибка предполагает, чтоhighlight-numbers
пакет еще не был инициализирован. Что касается вашего второго комментария, это, вероятно, означает, чтоhighlight-numbers-mode
он активен, но использует соответствие шаблону по умолчанию, выделяя как числа с плавающей запятой, так и целые числа. Код, который я написал выше, вызывает выделение только чисел с плавающей запятой.4. Я попытался поместить его в ~/.emacs, тоже не работает. Но я могу инициализировать пакет с помощью первого хука (в моем случае, f90-mode). Итак, я пытался изменить исходный скрипт .el. До сих пор я мог выделить только формат dd (например, 2.3), Но не 2. или .2 и т. Д. (Чего я хочу больше всего). Знаете ли вы, как написать rx так, чтобы d. и .d также могли быть выделены? (lisp действительно сбивает меня с толку …)
5.
~/.emacs
и~/.emacs.d/init.el
функционально эквивалентны. Выберите одно и не используйте другое (мне нравитсяinit.el
, потому что тогда все находится в одном каталоге).highlight-numbers-modelist
не загружается автоматически. Просто оберните код, который его использует(with-eval-after-load 'highlight-numbers ...)
. Это запустит обернутый код после загрузки библиотеки, таким образом, все будет определено.
Ответ №2:
Я опубликовал этот вопрос две недели назад. Теперь у меня есть собственное решение. Итак, я публикую это здесь в качестве ссылки для других, которые могут столкнуться с тем же.
Прежде всего, я хотел бы поблагодарить @Justin за то, что ответил раньше и предложил highlight-number-mode
. Его решение, вероятно, работает. Однако у меня есть немного более сложное требование, поэтому я решил сделать это по-другому.
Кроме того, я должен признать, что я очень новичок в программировании. Итак, вы можете найти несколько глупых строк в моих кодах. Не стесняйтесь, дайте мне знать, если считаете, что есть лучший способ.
Вот мое решение.
-
Установите
highlight-number-mode
иparent-mode
в emacs. (Второй требуется для первого.) В моем случае они устанавливаются в /~/.emcas.d/elpa/
. -
Насколько я вижу, оригинал
highlight-number-mode
не поддерживаетf90-mode
, и он выделяет все числа (например, 2, 3.4, 8e-2) одинаково, изменяя любимый цвет. Это не соответствует моим требованиям. В частности, я хочу выделить только числа с плавающей запятой, и я обозначаю их либо как 2., либо .5 в моем скрипте .f90. В Fortran 90 числа с плавающей запятой и целые числа имеют разные правила деления. Итак, я надеюсь визуализировать их по-разному, чтобы снизить риск появления таких ошибок. Поэтому я изменил следующую часть в исходном коде (highlight-numbers.el
):
(defconst highlight-numbers-generic-regexp (rx (or "." (? (and symbol-start digit symbol-end) "." (* digit)))) "Generic regexp for number highlighting. It is used when no mode-specific one is available.") (defvar highlight-numbers-modelist (copy-hash-table (eval-when-compile (let ((table (make-hash-table :test 'eq))) (puthash 'f90-mode (rx (or "." (? (and symbol-start (or (and ( digit) (? (or "." "e" ".e" "E" ".E")) ( digit)) (and ( digit) (? (or "e-" ".e-" "E-" ".E-")) ( digit)) (and ( digit) "." ( digit) (? (or "e" "E")) ( digit)) (* digit)) symbol-end) "." (* digit)))) table)
Если вы сравните приведенный выше код с оригинальным кодом Фанаэля Линитьена, вы заметите, что я добавил два "."
. Как сказал Фанаэль (в частных обсуждениях), это, вероятно, связано с тем, что "."
это используется в качестве знака препинания в режиме f90 в emacs. Итак, я должен соответствующим образом изменить регулярное выражение и таблицу.
-
Как только вышесказанное будет выполнено, я добавлю строку
(add-hook 'f90-mode-hook 'highlight-numbers-mode)
в свойinit.el
, чтобы загрузить этот пакет через elpa. -
После этого в моем коде будут выделены числа с плавающей запятой, такие как
И вы можете видеть разницу в числах с плавающей запятой и целых числах.
В конце я бы добавил, что я использую это уже несколько дней. Пока никаких проблем не возникает. Итак, я думаю, это работает! 🙂
Комментарии:
1. Это работает, спасибо! Я изменил существующий файл highlight-numbers.el в моей папке elpa и повторно скомпилировал его с помощью M-x byte-recompile-directory RET ~/.emacs.d/elpa/