[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:07988] fortran-mode 用機能追加



はじめまして。徳原です。xyzzyにはお世話になっています。

仕事でfortranを使用しているため、fortranモードを使用することが多いのです
が、そのままではコメントの色換えが行えなかったり、コメント行に「'」など
が入っていた場合に、以降のすべての行が文字列扱いされる等の問題があり、ずっ
と解決策を探していました。とりあえず、

 (set-syntax-comment-column fortran-mode-syntax-table 0)

を追加してしのいでいたのですが、これだと1カラム目がタブでもなんでもスペー
ス以外だとコメント行と認識されてしまっていました。

つい最近メーリングリストに流れた記事で、xyzzyのソースが公開されているこ
とを知り、この辺の実装を調べてみたところ、lispだけでは無理らしいと気付き、
機能を追加してみました。

set-syntax-comment-column を指定した場合に、
set-syntax-option で *syntax-option-comment-column-char* を指定すると、
set-syntax-start-column-comment で指定した文字が指定カラムに登場した場合
にのみコメント行と認識するようになります。

具体時には、fortran.lに以下の行を追加することになります。

  (set-syntax-comment-column fortran-mode-syntax-table 0)
  (set-syntax-option fortran-mode-syntax-table
					 *syntax-option-comment-column-char*)
  (set-syntax-start-column-comment fortran-mode-syntax-table #\C)
  (set-syntax-start-column-comment fortran-mode-syntax-table #\c)

亀井さんにお願いなのですが、おかしな事をしているかもしれませんので、適切
な形でxyzzyのオリジナルに反映していただけませんでしょうか。

もしくは、こんなことをしなくてもlispだけで実装可能でしたら、その方法をお
教えいただければ幸いです。


以下修正パッチです。WEBで公開されていた最新版の0.2.2.220のソースがベース
になっています。

*** gen-syms.cc	Sun Oct 28 20:55:23 2001
--- gen-syms.cc	Sat Jan 12 18:51:28 2002
***************
*** 1991,1996 ****
--- 1991,1997 ----
    DEFUN3 (set-syntax-start-comment, 2, 1, 0),
    DEFUN3 (set-syntax-end-comment, 2, 2, 0),
    DEFUN2 (set-syntax-end-c++-comment, set-syntax-end-cplusplus-comment, 2, 1, 0),
+   DEFUN3 (set-syntax-start-column-comment, 2, 1, 0),
    DEFUN3 (set-syntax-escape, 2, 0, 0),
    DEFUN3 (set-syntax-quote, 2, 0, 0),
    DEFUN3 (set-syntax-symbol, 2, 0, 0),
***************
*** 2012,2017 ****
--- 2013,2019 ----
    DEFUN3 (syntax-start-comment-p, 1, 1, 0),
    DEFUN3 (syntax-end-comment-p, 1, 1, 0),
    DEFUN2 (syntax-end-c++-comment-p, syntax-end-cplusplus-comment-p, 1, 1, 0),
+   DEFUN3 (syntax-start-column-comment-p, 1, 1, 0),
    DEFUN3 (syntax-escape-p, 1, 1, 0),
    DEFUN3 (syntax-quote-p, 1, 1, 0),
    DEFUN3 (syntax-symbol-p, 1, 1, 0),
*** syntax.h	Sun Jun 17 21:43:48 2001
--- syntax.h	Sun Jan 13 16:57:34 2002
***************
*** 6,11 ****
--- 6,12 ----
  # define SYNTAX_OPT_CPLUSPLUS 2
  # define SYNTAX_OPT_JAVA 4
  # define SYNTAX_OPT_CSHARP 8
+ # define SYNTAX_OPT_COLUMN_CHAR 16
  
  struct syntax_table
  {
***************
*** 60,66 ****
    SCtag_start,
    SCtag_end,
    SCsymbol_prefix,
!   SCmax
  };
  
  # define Sin_string 1
--- 61,68 ----
    SCtag_start,
    SCtag_end,
    SCsymbol_prefix,
!   SCmax,
!   SCcolumn_comment_start
  };
  
  # define Sin_string 1
***************
*** 77,82 ****
--- 79,85 ----
  # define SFcomment_end_first_char 4
  # define SFcomment_end_second_char 8
  # define SFcplusplus_comment_char 16
+ # define SFcolumn_comment_char 32
  # define SFmaybe_comment_end 64
  # define SFparse_sexp_ignore_comment 128
  
***************
*** 104,109 ****
--- 107,115 ----
  
  # define maybe_comment_end_p(t, c) \
    (xchar_comment ((t), (c)) & SFmaybe_comment_end)
+ 
+ # define xcolumn_comment_char_p(t, c) \
+   (xchar_comment ((t), (c)) & SFcolumn_comment_char)
  
  extern char syntax_spec_table[128];
  void init_syntax_spec ();
*** syntax.cc	Sun Aug 12 20:28:02 2001
--- syntax.cc	Sun Jan 13 16:57:31 2002
***************
*** 166,171 ****
--- 166,189 ----
    return Qt;
  }
  
+ static lisp
+ set_syntax_column_comment (lisp table, lisp ch, lisp ignore)
+ {
+   check_syntax_table (table);
+   check_char (ch);
+   Char c = xchar_code (ch);
+   if (!ascii_char_p (c))
+     return Qnil;
+   syntax_table *tab = xsyntax_table (table);
+   xchar_comment (tab, c) |= SFcolumn_comment_char;
+   if (ignore && ignore != Qnil)
+     xchar_comment (tab, c) |= SFparse_sexp_ignore_comment;
+   else
+     xchar_comment (tab, c) &= ~SFparse_sexp_ignore_comment;
+   return Qt;
+ }
+ 
+ 
  lisp
  Fset_syntax_whitespace (lisp table, lisp ch)
  {
***************
*** 239,244 ****
--- 257,268 ----
  }
  
  lisp
+ Fset_syntax_start_column_comment (lisp table, lisp ch, lisp ignore)
+ {
+   return set_syntax_column_comment (table, ch, ignore);
+ }
+ 
+ lisp
  Fset_syntax_escape (lisp table, lisp ch)
  {
    return set_syntax (table, ch, SCescape);
***************
*** 399,404 ****
--- 423,434 ----
  }
  
  lisp
+ Fsyntax_start_column_comment_p (lisp ch, lisp table)
+ {
+   return syntaxp (ch, table, SCcolumn_comment_start);
+ }
+ 
+ lisp
  Fsyntax_escape_p (lisp ch, lisp table)
  {
    return syntaxp (ch, table, SCescape);
***************
*** 890,897 ****
        Char c = *p++;
        if (c == '\n' || syntax (tab, c) == SCcomment_end)
          return 0;
!       if (i == tab->comment_column)
!         return c != ' ';
      }
  }
  
--- 920,929 ----
        Char c = *p++;
        if (c == '\n' || syntax (tab, c) == SCcomment_end)
          return 0;
!       if ((i == tab->comment_column) && !(tab->flags & SYNTAX_OPT_COLUMN_CHAR))
!         return (c != ' ');
!       if ((i == tab->comment_column) && (tab->flags & SYNTAX_OPT_COLUMN_CHAR))
!         return xcolumn_comment_char_p (tab, c);
      }
  }
  
*** defs.l	Mon Oct 29 01:18:46 2001
--- defs.l	Sun Jan 13 17:20:34 2002
***************
*** 18,24 ****
          *fill-kinsoku-mode*
          *file-dialog-filter* *file-dialog-filter-index*
          *syntax-option-c-preprocessor* *syntax-option-indent-c++*
!         *syntax-option-indent-java*))

  (or (boundp 'mode-line-format)
      (setq-default mode-line-format "--%*- %b (%M) [%k:%l] %P %f"))
--- 18,24 ----
          *fill-kinsoku-mode*
          *file-dialog-filter* *file-dialog-filter-index*
          *syntax-option-c-preprocessor* *syntax-option-indent-c++*
!         *syntax-option-indent-java* *syntax-option-comment-column-char*))

  (or (boundp 'mode-line-format)
      (setq-default mode-line-format "--%*- %b (%M) [%k:%l] %P %f"))
***************
*** 131,136 ****
--- 131,137 ----
  (defconstant *syntax-option-indent-c++* 2)
  (defconstant *syntax-option-indent-java* 4)
  (defconstant *syntax-option-indent-csharp* 8)
+ (defconstant *syntax-option-comment-column-char* 16)

  (setq-default display-newline-char t)
  (setq-default display-first-tab-char t)

--
徳原正行
E-Mail:tokuhara@xxxxxxxxxxxxx

Index Home