Как по-разному выделять числа с плавающей запятой и целые числа в файлах .F90 в Emacs?

#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 . Его решение, вероятно, работает. Однако у меня есть немного более сложное требование, поэтому я решил сделать это по-другому.

Кроме того, я должен признать, что я очень новичок в программировании. Итак, вы можете найти несколько глупых строк в моих кодах. Не стесняйтесь, дайте мне знать, если считаете, что есть лучший способ.

Вот мое решение.

  1. Установите highlight-number-mode и parent-mode в emacs. (Второй требуется для первого.) В моем случае они устанавливаются в / ~/.emcas.d/elpa/ .

  2. Насколько я вижу, оригинал 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. Итак, я должен соответствующим образом изменить регулярное выражение и таблицу.

  1. Как только вышесказанное будет выполнено, я добавлю строку (add-hook 'f90-mode-hook 'highlight-numbers-mode) в свой init.el , чтобы загрузить этот пакет через elpa.

  2. После этого в моем коде будут выделены числа с плавающей запятой, такие как

пример

И вы можете видеть разницу в числах с плавающей запятой и целых числах.

В конце я бы добавил, что я использую это уже несколько дней. Пока никаких проблем не возникает. Итак, я думаю, это работает! 🙂

Комментарии:

1. Это работает, спасибо! Я изменил существующий файл highlight-numbers.el в моей папке elpa и повторно скомпилировал его с помощью M-x byte-recompile-directory RET ~/.emacs.d/elpa/