如何在Emacs中突出显示Fortran固定格式的延续线符号,而不是在Fortran模式下?

时间:2014-09-23 12:41:16

标签: emacs fortran

我正在研究f90代码但是使用固定格式的文件。所以我为这个代码文件做了一个特定的主要模式(实际上只是使用fortran模式缩进函数的f90模式)。但它仍然是我无法处理的一件事:第6列中延续线字符的着色。如何在我修改过的f90.el中使用它?

非常感谢!

编辑:

这是衍生模式:

(require 'fortran)

(define-derived-mode epx-mode f90-mode "EPX"
  (set (make-local-variable 'indent-line-function) 'fortran-indent-line)
  (set (make-local-variable 'indent-region-function)
       (lambda (start end)
         (let (fortran-blink-matching-if ; avoid blinking delay
               indent-region-function)
           (indent-region start end nil))))
  (set (make-local-variable 'font-lock-syntactic-keywords)
     epx-font-lock-syntactic-keywords)
  )

(defvar epx-font-lock-syntactic-keywords nil
  "`font-lock-syntactic-keywords' for F90.
These get fixed-format comments fontified.")
(let ((comment-chars "cd\\*")       ; `d' for `debugging' comments
      )
  (setq epx-font-lock-syntactic-keywords
    ;; Fixed format comments.  (!-style handled normally.)
    (list
     (list (concat "^[" comment-chars "]") 0 '(11))
     (list (concat "^[^" comment-chars "\t\n]" ".\\{71\\}"
               "\\([^\n]+\\)")
           1 '(11))))
  )

(provide 'epx)

它将indet-line-functionindent-region-function更改为fortran版本而不是f90。它还修改font-lock-syntactic-keywords以对固定格式的注释着色。

例如:

      module foo

* This is a fixed format comment                                                                                                                                              

      call bar(a, ! this is a f90 comment and a fortran splitted line                                                                                                         
     &     b)
 42   ! this is a label for a ugly goto                                                                                                                                       
      end module foo

我也注意到标签也没有突出显示......

编辑:好的;我添加了以下内容以使其工作:

(font-lock-add-keywords 'epx-mode
  '(("^ *\\([0-9]+\\)" . font-lock-constant-face)
    ("^ \\{5\\}\\([^ 0\n]\\)" 1 font-lock-string-face)
    ("^\t\\([1-9]\\)"         1 font-lock-string-face)))

非常感谢!

1 个答案:

答案 0 :(得分:0)

这是因为你继承自f90-mode而不是fortran-mode。这两种模式提供了非常不同的字体锁定关键字集,并且仅在fortran-mode中突出显示&字符和标签。

编辑:如果你想要f90编辑功能,但仍然使用fortran模式的亮点,我想你可以将以下代码(取自fortran.el)添加到你的代码中:

(set (make-local-variable 'font-lock-defaults)
     '((fortran-font-lock-keywords
        fortran-font-lock-keywords-1
        fortran-font-lock-keywords-2
        fortran-font-lock-keywords-3
        fortran-font-lock-keywords-4)
       nil t ((?/ . "$/") ("_$" . "w"))
       fortran-beginning-of-subprogram))

或者,您可以从fortran模式中选择单独的字体锁定规则,并使用font-lock-add-keywords将它们添加到您的模式中。 (您可以使用font-lock-studio按规则逐步执行字体锁定规则,以查看它们具有的效果。)