読者です 読者をやめる 読者になる 読者になる

ichiroc subset

書きながら考える・考えをまとめる場所

[emacs][vbscript][LotusNotes]VBScript(+Lotus Script)を emacs で使う為の設定

さて、仕事場でも emacs を使用していますが、VBScriptをどうしたって書かなくてはいけない時があります。
JScriptを書けば良いと思ったりもしますが、同僚もいるのでいつもJScriptを書く訳にもいきません。
また仕事場には Lotus Notes が導入されており、これのスクリプトを書く必要があります。Lotus Script も主流はVBScriptベースのスクリプトとなっています。ただし、後述しますが若干違う点もあります。

Emacs界におけるVisualBasic系の雄は vbnet-mode です。
これがあるだけでもかなり有り難いですが、更に他の便利なツールとも連携させたいです。
そんな訳でその為のちょっとした設定等をしています。

まずはこれ。

  • auto-complete の設定
  • summarye の設定
;; vbnet-mode 読み込み
(require 'vbnet-mode)
(add-to-list 'auto-mode-alist '("\\.vbs$" . vbnet-mode)) ; .vbsに関連付け
;; auto-complete の対象にする
(add-to-list 'ac-modes 'vbnet-mode)
;; summarye の一覧対象にする
(add-to-list 'se/mode-delimiter-alist
	     '((vbnet-mode)
	       (("function" "^[ 	]*.*[ 	]*\\([Ss]ub\\|[Ff]unction\\)[ 	]+\\(.*(.*)\\)")
		("class" "^[ 	]*[Cc]lass\\(.*\\)")
		("variable" "^[ 	]*[Dd]im[ 	]+\\(.*\\)"))
	       (lambda (beg end category)
		 (if (equal "function" category)
		 (se/matched-pattern 2)
		 (se/matched-pattern 0))
	       )))

そしてこれ。

  • Lotus Script 用の vbnet-mode の改造

これはlispの設定とは少し違います。

Lotus Script は厄介な事に VBScript に於ける for each 相当の構文が少し違います。for each の代わりに forall というキーワードになっています。これのせいで vbnet-mode はインデントに失敗します。登場頻度のクソ高いこのキーワード用の拡張をしておかないと、 vbnet-mode は Lotus Script で使えません。

僕はこの設定用の拡張を施して使っています。
ここにパッチにしておきました。

280a281,283
> (defconst vbnet-forall-regexp "^[ \t]*[Ff]orall\\b")
> (defconst vbnet-end-forall-regexp "^[ \t]*[Ee]nd[ \t]+[Ff]orall")
> 
332,333c335,336
<       "Fields" "FileAttr" "FileCopy" "FileDateTime" "FileLen" "Fix" "Font" "For"
<       "Form" "FormTemplate" "Format" "Forms" "FreeFile" "FreeLocks" "Friend"
---
>       "Fields" "FileAttr" "FileCopy" "FileDateTime" "FileLen" "Fix" "Font" "Forall" "For"
>       "Form" "FormTemplate" "Format" "Forms" "FreeFile" "FreeLocks" "Friend" 
739a743,746
> (defun vbnet-find-matching-forall ()
>   (vbnet-find-matching-stmt vbnet-forall-regexp
> 			    vbnet-end-forall-regexp))
> 
816a824,827
>             ((looking-at vbnet-end-forall-regexp) ; forall/end forall
>              (vbnet-find-matching-forall)
>              (current-indentation))
> 
922a934
> 			    (looking-at vbnet-forall-regexp)

ではでは。頑張って仕事場でもEmacsを使いましょう。