Coloring the Emacs to AWK

UNIX 系 OS のエディタと言えば vi と Emacs ですが(*1)、Emacs の awk-mode では色が付きません。色が付くと派手になるばかりではなく、プログラムのミスも減ると考えています。AWK だけでなく他にも応用できますので紹介しておきます。

*1 最近は gedit などを使う若い人が増えているそうで、Emacs の操作を知っている人も減って来ているように感じます。

[Go to Index]

Emacs の色指定をする

他にも方法があると思いますが、ここでは私がやっている hilit19 を用いた方法を紹介します。awk-mode.el などを書き変えることなく色指定ができます。

キーワード・ファイルの作成

まず、~/elisp というディレクトリを作成します。

$ mkdir ~/elisp
この中に下記の内容のファイルを awk-hilit.el という名前で作成して下さい。下のリストは思いっきりはみ出していますので、注意して下さい。
(if (featurep 'hilit19)
  (hilit-set-mode-patterns
    'awk-mode
       ;; shell wrapper
     '(("^[ \t]*#!.*" nil include)
       ;; include for igawk
       ("^include.*$" nil include)
       ;; for RCS
       ("\\$\\(Revision\\|Date\\|Author\\).*\\$" nil secondary-selection)
       ;; comments
       ("^[ \t]*#.*" nil comment)
       ;; BEGIN / END
       ("\\(BEGIN\\|END\\)" nil include)
       ;; strings (single quoted, double quoted, regular expression)
       ("\"[^\n\"]*\"" nil string)
       ("\'[^\n\']*\'" nil string)
       ("\/[^\n\/]*\/" nil string)
       ;; exit
       ("exit\\( [0-9]\\|\\)" nil red-underline)
       ("\\\\$" nil ForestGreen-bold)
       ;; stetements
       ("\\b\\(if\\|else\\|for\\|do\\|break\\|continue\\|printf\\|print\\|return\\|next\\|nextfile\\|delete\\|exit\\|getline\\|close\\|fflush\\|system\\|switch\\|case\\)\\b" nil keyword)
       ;; built in functions 1 (strings)
       ("\\b\\(length\\|substr\\|index\\|match\\|split\\|sub\\|gsub\\|sprintf\\|tolower\\|toupper\\|asort\\|gensub\\|strtonum\\)\\b" nil keyword)
       ;; built in functions 2 (time)
       ("\\b\\(mktime\\|strftime\\|systime\\)\\b" nil keyword)
       ;; built in functions 3 (bit)
       ("\\b\\(and\\|compl\\|lshift\\|or\\|rshift\\|xor\\)\\b" nil keyword)
       ;; built in functions 4 (international)
       ("\\b\\(bindtextdomain\\|dcgettext\\|dcngettext\\)\\b" nil keyword)
       ;; built in functions 5 (mathe)
       ("\\b\\(exp\\|log\\|sqrt\\|sin\\|cos\\|atan2\\|rand\\|srand\\|int\\)\\b" nil keyword)
       ;; user defined function
       ("\\b\\(function\\|func\\)\\b" nil defun)
       ;; built in variables
       ("\\(FS\\|NF\\|NR\\|FNR\\|FILENAME\\|RS\\|OFS\\|ORS\\|OFMT\\|SUBSEP\\|ARGC\\|ARGV\\|ENVIRON\\|ARGIND\\|BINMODE\\|CONVFMT\\|ERRNO\\|FIELDWIDTH\\|IGNORECASE\\|LINT\\|PROCINFO\\|RT\\|RSTART\\|RLENGTH\\|TEXTDOMAIN\\)" nil include)
       )))
(provide 'awk-hilit)

.emacs を変更する

~/.emacs に下記の部分を追加します。Emacs Lisp を知らなくても何となくどこを変更すれば色が変るかが分かると思います。色は好みで変更して下さい。見本は とほほの WWW 入門の色見本の「Netscape 色パレット」と同じ名前の指定です。

(setq load-path (cons (expand-file-name "~/elisp/") load-path))
;; 文字に色をつける (C-l で画面の更新 (デフォルトは hilit-recenter))
(if window-system
  (progn (require 'hilit19)
    (hilit-translate
      ; コメント
      comment  'MediumSeaGreen
      ; 宣言 typedef(c)  defvar(el)  documentstyle,begin,end,it(tex)
      decl     'IndianRed
      ; #define(c)  defconst(el)  title,setcounter(tex)
      define   'IndianRed
      ; 関数名 (c)  defun(el)  newcommand(tex)
      defun    'IndianRed
      ; #include,#typedef(c)  require,provide(el)  include(tex)
      include  'IndianRed
      ; キーワード if,return(c)  if,progn(el)  section,hspace(tex) 
      keyword  'bold
      ; ラベル item,caption(tex)
      label    'red
      ; 文字列
      string   'Blue
      ; 型 int,const(c)
      type     'bold
      ; 参照 ref,cite(texのみ)
      crossref 'red
      ; 数式 (texのみ)
      formula  'DarkOrchid)
        (global-set-key "\C-l" 'hilit-rehighlight-buffer)
        (add-hook 'awk-mode-hook   ; Awk-script モードで色を付ける
          '(lambda () (require 'awk-hilit)))
))

完成へ

これで拡張子が awk のものは色付きの awk-mode として表示されます。単に派手なだけでなく、すぐに関数に目をやることができます。

この方法は単に awk-mode だけでなく、他の mode へも応用できます。例えば、shell スクリプトに色を付ける場合も、同様の方法で色付けできますので、試してみて下さい。

AWK での最多質問とは

AWK は非常に簡単な構文であるのと同時に省略可能な部分が多いためか、動作しない原因の大半がケアレスミスだったりします。事実、Netnews の comp.lang.awk を眺めていると、そういった質問に何度も出会います。できるだけ自分が開発しやすいエディタで間違えないようにしましょう。

Copyright © 2003 by Hirofumi Saito <hi_saito@yk.rim.or.jp>. All rights reserved.