[xyzzy:07988] fortran-mode 用機能追加
- Subject: [xyzzy:07988] fortran-mode 用機能追加
- From: 徳原 正行 <tokuhara@xxxxxxxxxxxxx>
- X-mailer: Becky! ver. 2.00.07
はじめまして。徳原です。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