★データ解析備忘録★

ゆる〜い技術メモ

Emacs (ESS) で SAS のシンタックスハイライトを直す

はじめに

今回は小ネタです。

みなさんは SAS コードを何で書いてますか? Atom? Sublime Text? Vim? Emacs? 僕は Emacs で書いてますが、エディタの好みは人それぞれなので、好きな物を使えばいいと思います。

さて、EmacsSAS を編集する際に便利なのが ESS(Emacs Speaks Statistics) というパッケージです。 これは統計系の言語に対してシンタックスハイライトや補完をしてくれるもので、対応言語は以下のとおりです。

  • R
  • S-PLUS
  • SAS
  • STATA
  • BUGS/JAGS
  • Julia

ここに SAS が含まれているのでこれを使えばいいのですが、この SAS-mode のシンタックスハイライトがデフォルトでは少しおかしいです。 たとえば、proc sqlproc fedsql を使ったコードを書こうとすると下図のようになってしまいます。

f:id:songcunyouzai:20161216023415p:plain:h300

まず、プロシージャ名fedsqlが認識されていません。これはいろいろ試した結果、どうやら SAS 9.4 で追加された、あるいは試用版として追加 されたプロシージャが ESS では認識されないようです。

次に、SQL のキーワードが一部ハイライトされていません。この原因ははっきりしないのですが、大変に気持ち悪いです。

シンタックスハイライトを直す

ESS での SASシンタックスハイライトの設定は ~/.emacs.d/elpa/ess-20161101.215/lisp/ess-sas-l.elSAS-mode-font-lock-defaults という変数で定義されているのでそこにリストとして追加します。 ただ、パッケージそのものをいじるのはよろしくないので、init.el に書くこととします。

SAS 9.4 のプロシージャを追加する

プロシージャ名は font-lock-constant-face の色になるので、init.el に以下のように書きます。

;; シンタックスハイライトを追加(for SAS 9.4)------
(add-to-list 'SAS-mode-font-lock-defaults
             (cons (concat "\\<proc[ ]+"
                           (regexp-opt '("bchoice"
                                         "fedsql"
                                         "iclifetest"
                                         "irt"
                                         "irphreg"
                                         "spp"
                                         "datekeys"
                                         ) 'words)) font-lock-constant-face)
             )

このように、追加したいプロシージャ名をべた書きします。

SQL のキーワードを追加

上と同じ要領です。ただ、キーワードは font-lock-keyword-face の色になります。

;; -SQL のキーワードを追加-----
(add-to-list 'SAS-mode-font-lock-defaults
             (cons (concat
                    (regexp-opt
                     '("as"
                       "create"
                       "group"
                       "order"
                       "from"
                       "on"
                       "inner join"
                       "left outer join"
                       "right outer join"
                       "cross join"
                       "full join"
                       "union"
                       "having"
                       "case"
                       "when"
                       ;; "&"
                       ) 'words)) font-lock-keyword-face)
             )

これらの設定を反映してみると、

f:id:songcunyouzai:20161216023421p:plain:h300

きちんとハイライトされてますね! これで気持ち悪さから解放されました!