LISP風VimScript「vise」
LISPが好きですか?ときかれたら「Yes」と答えるでしょう。
VimScriptが好きですか?ときかれたら「No」と答えるでしょう。
だけど、Vimが好きですか?ときかれたら「Yes」と答えるでしょう。
そんなわけで今回作ったvise(ビーズ)です。
これはKPF#x08のネタとして作成して発表したものです。
リポジトリはこちら。githubです。
インストール方法や細かな構文はリポジトリ内のdoc/vise.jaxにドキュメントがあるのでそちらを参照してください。
ここでは簡単なあらましと特徴的な機能に絞って紹介したいと思います。
viseはLISP構文を持つVimScript
LISP風VimScriptというタイトルのとおりviseはLISPの構文を持ちVimScriptに変換して実行するプログラミング言語です。いわゆるトランスレータという分類になる言語ではないでしょうか。
最近ではJavaScriptやhtmlに変換するもののようにトランスレータと呼べる代物が増えてきました。
それらと並べるとは思っていませんが言語のくくりとしては同じです。
このようなトランスレータ系の言語は、
「元言語(変換後の言語)に不満はあるが何らかの理由によって使い続けなければならない」
というときに、元言語の限界を超えてより使いやすくしましょうということを目指すものです。
ではviseを作る理由となったVimScriptの不満とは、、、ただ一つです。
「VimScriptってLISPじゃないじゃん?」
ということでviseはLISP風な言語になったのでした。
実装はGaucheで行ってるんですか?
はい。そうなんです。viseはGaucheで実装されており、viseコンパイラを動作させるにはGauche0.9.3以上が必要です。
viseの書き方
viseはたとえば次のような書き方でVimScriptを記述します。;;もちろん全てLISP風記法 (echo "hohoho") (echo (+ 1 2 (* 3 4 (- 5 6)))) ;;文字列は二通りの記述方法 (echo "double quote string") ;;シングルクオート文字列は少し特殊な書き方をします (echo #/single quote string/) ;;関数定義はこんな感じ (defun square (num) (* num num)) (echo (square 10)) ;;マクロもかけるよ (defmacro zero? (num) `(== 0 ,num)) ;;マクロはパターンマッチングで展開結果を分岐できます (defmacro inc! (match ((_ sym) `(+= ,sym 1)) ;(inc! num)の様に1引数のときマッチ ((_ sym delta) `(+= ,sym ,delta))));(inc! num 2)の様に2引数のときにマッチ ;;tryなどのVimコマンドも使用できます (try (edit) (#/^Vim(edit):E\d\+/ (echo "error")) (else (echo "else")) (finally (echo "finally"))) ;;VimScriptですが入子の同名変数を扱えます (let ((val "outer")) (echo val) ;outerと出力される (let ((val "inner")) (echo val))) ;innerと出力される ;;foldも自前で定義できます (defun fold (proc seed list) (rlet1 acc seed (dolist (x list) (set! acc (proc x acc))))) (echo (fold + 0 '(1 2 3 4))) (echo (fold (lambda (num acc) (+ acc (* num num))) 0 '(1 2 3 4)))
viseのマクロ
書き方例の中にしれっと書きましたが、viseはマクロを扱えます。このマクロはviseのコンパイル段階で全て実行され展開されるため、変換後のVimScriptにはマクロに関するプログラムが残りません。
マクロを利用すればコンパイルタイムに処理を行えるため大変便利なのですが、一つ弊害が生まれます。
マクロの本体(つまりコンパイルタイムに実行される式)にviseの式は記述できません。
viseはあくまでコンパイラであり評価器を持っていません。そのためコンパイルタイムにvise自体の式を実行できないのです。
viseではマクロの本体にはGaucheの式を記述する必要があります。
viseを書くためにはGaucheの知識が必要になるということは短所ではありますが、
多くライブラリがそろっているGaucheの式を記述できるというのは長所にもなると考えています。
λ ...
LISP風を銘打っている以上ラムダ(lambda)は扱えるべきだろう、と。そんなわけでviseではラムダを使用できます。
(defvar proc (let ((a 10)) (lambda (b) (+ a b)))) (echo (proc 1)) ;11が出力される (echo (proc 100)) ;110が出力される
簡単な例ですが、
procにはlambdaによって作られた手続きが束縛されています。
その手続きはaという変数を自由変数として参照しています。
実際にprocを呼んでいる位置からはaはもちろん参照できませんが、手続きは(静的スコープ上)正しい結果を返します。
もちろんVimScriptにラムダはないので、いろいろな処理を組み合わせてこのような動作になるようにしています。
処理の内容、トリックの秘密は変換後のVimScriptのコードを見れば理解できる人もいるのではないでしょうか。
function! s:SID_PREFIX_421() return matchstr(expand('<sfile>'),'<SNR>\d\+_\zeSID_PREFIX_421$') endfunction function! s:display420(b)dict return self['a:a'] + a:b endfunction let s:dict_type_419 = type({}) function! s:let_func418(a) return {'func':function(s:SID_PREFIX_421() . 'display420'),'a:a':a:a} endfunction let s:Proc = s:let_func418(10) echo (type(s:Proc)==s:dict_type_419) ? s:Proc.func(1) : s:Proc(1) echo (type(s:Proc)==s:dict_type_419) ? s:Proc.func(100) : s:Proc(100)
vise上では簡単なプログラムだったのですが、VimScriptへ変換した後は結構な量のコードになっています。
変換後コードに関してここでは詳細な解説は行いません。
ですが一つだけ、ラムダで作成した手続きは辞書型インスタンスとして扱います。実際の手続きは決まったキーとして設定され、自由変数も値として辞書内に取り込みます。
TIPS
そろそろ長くなってきたのでここからはサンプルソースと変換後コードだけ。どんな処理かはなんとなく察してください。
末尾再帰呼出しの最適化
・before;;末尾再帰呼出を使って階乗を求める関数を定義する (defun fact (n) (let loop ((acc 1) (n n)) (if (== n 0) acc (loop (* acc n) (- n 1)))))
・after
function! s:fact(n) let acc_418 = 1 let n_419 = a:n let recursion_420 = 1 while recursion_420 let recursion_420 = 0 if n_419 == 0 return acc_418 else let recursion_420 = 1 let acc_418 = acc_418 * n_419 let n_419 = n_419 - 1 endif endwhile endfunction
不要式の削除
・before;;再設定(set!)がされていないdebug変数を定義 (defvar debug #f) (defun hoge (arg) ;;debug変数の値によってデバッグ出力を行うかどうかが変わる (when debug (echo (string-append "argument:" (string arg)))) arg)
・after
let s:debug = 0 function! s:hoge(arg) return a:arg endfunction
これらの詳細はdoc/vise.jaxにあるので気になる人は参照してください。
viseのサンプル
viseはVim上で動作するREPLプラグインを持っています。このviseREPL自体viseで書かれています。なのでこのソースを読めばviseの書き方や、viseで出来ること・出来ないことがわかると思います。
ソースはautoloadディレクトリ以下の
- vise_repl.vise
- repl_mapping.vise
- common_macro.vise
まとめ
ここまでざっとviseについ書いてきましたが、正直なところ現状のviseの機能では実用には耐えられないと思っています。
トリッキーなVimScriptの記述方法はほとんどサポートできていませんし、
たまに使うようなコマンドでも実装されていないものがあります。(たとえばキーマップを定義するコマンドは全てサポートできていません。その理由はdoc/vise.jaxの最後の章、UNSUPPORTで。)
今後どうするかもあまり考えていないホビー用言語なので、
マクロだったりラムダがあるVimScriptとして面白がってください。
Gauche開発支援拡張vim-gdev/emacs-gdev紹介
VimとEmacs上のそれぞれで動作するGauche開発支援の拡張スクリプトを開発しています。
開発に一区切りつけるためにこの辺で紹介記事としてまとめておきたいと思います。
なにはともあれ動作画面のスクリーンショットから。
このスクリプトではVimとEmacsでほぼ同じことを実現しています。
インストール方法
VimとEmacsそれぞれのインストール方法から紹介します。
まず、どちらにも共通していることですがGaucheの0.9.2以上が必要になります。
・Vimにインストール
Vimでは外部プロセスであるgoshと通信するためにvimprocが必須です。
また、補完候補を出すためのneocomplcacheと、検索インタフェースであるunite.vimが必要になります。
それぞれの必須スクリプトのインストール方法ですが、全てVimでは有名なスクリプトで検索すると解説ページが見つかると思うのでここでは割愛します。
次にvim-gdevの本体をインストールします。
ソースはgithub(こちら)にあるので、Vundleがインストールされている場合は
Bundle 'aharisu/vim-gdev'
と.vimrcに書いておいて、Vim上で:BundleInstall
を実行すると必要なファイルをすべてインストールすることができます。Vundleがない場合は、gitでクローンするか、downloadsのページからzip/tar.gzをダウンロードしてVimでロードできる位置に配置してください。
・Emacsにインストール
Emacsではjsonを読むためのjson.elが必須です。
また補完候補を出すためにはAuto Complete Modeが必要で、検索インタフェースであるAnythingもあると機能をフルに活用することができます。
こちらの必須スクリプトもインストール方法を解説したページは多いと思うのでここでは割愛します。
次にemacs-gdevをインストールします。
ソースは全てgithub(こちら)にあります。
現状、auto-installなどのパッケージ管理プラグインに対応できていないので、
githubのリポジトリをクローンするか、downloadsのページからzip/tar.gzをダウンロードして、Emacsでロードできる位置にファイルをすべて配置してください。
それぞれの設定ファイルの書き方に関しては、この紹介記事の最後に掲載します。
機能
続いて、このスクリプトできることについて紹介します。
- バッファ内と、そこから読み込んでいる(use/import/loadした)モジュールを解析してシンボルを補完候補として表示をする
- シンボルが定義されている場所へジャンプする
- シンボルの詳細な情報を表示する
大まかに分類するとこの三つに分けられます。
補完機能と定義場所へジャンプはあまり説明が要らないと思います。
補完機能では、参照可能でグローバルなシンボル一覧をバッファごとに持っているので、
そのシンボル一覧をVimであればneocomplcache、EmacsであればAuto Complete Modeのソースとして表示・選択できます。
また、定義場所へジャンプは、指定されたシンボルが定義されているファイル・行を自動で表示します。
三つめのシンボルの詳細な情報を表示する機能について紹介します。
vim-gdev/emacs-gdevでは定義からシンボル名を解析するだけでなく、シンボルに付属する情報も一緒に解析しています。
- シンボルタイプ(変数、関数、クラス...)
- 定義モジュール(ファイル)名
- シンボル名
- 関数であれば引数、クラスであればスロット名
- それぞれに付随するドキュメント
このようなプログラムを書いているときに必要になる情報を、この機能を利用することで素早く表示できるようになります。
この情報を素早く表示するための一覧・検索機能としてVimのunite.vim/EmacsのAnythingを利用しています。
それぞれの環境で使えるソースと対応するコマンドの一覧です。
・Vim
- gosh_info (コマンド:gosh_info_start_search, gosh_info_start_search_with_cur_keyword)
- gosh_all_symbol
- gosh_all_module
- anything-ginfo-source (コマンド:ginfo-anything, ginfo-with-word-anything)
- anything-ginfo-all-symbol-source (コマンド:ginfo-anything-all-symbol)
- anything-ginfo-all-module-source (コマンド:ginfo-anything-all-module)
・gosh_info/anything-ginfo-source
補完候補として表示したものと同じシンボルを一覧して検索できます。
特にVimのgosh_info_start_search_with_cur_keywordとEmacsのginfo-with-word-anythingコマンドは、
カーソル位置のシンボルを初期入力とし、マッチしたシンボルが一つだけならすぐに情報を表示します。
これによってコードを書きながら必要になればすぐに情報を参照するということができます。
このコマンドはキーにマッピングして使用することをお勧めします。
・gosh_all_symbol/anything-ginfo-all-symbol-source
Gaucheでロード可能な全てのモジュールの、全てのexportされたシンボルを一覧して検索します。
シンボル取得処理はかなり重い動作になるので非同期で実行されますが、目的のシンボルが一覧に現れるまで時間がかかってしまう可能性があります。
・gosh_all_module/anything-ginfo-all-module-source
まずロード可能な全てのモジュールを一覧・検索して、続けてそのモジュール内のシンボルを一覧・検索します。
モジュール → その中のシンボルと2段階の絞り込みによってシンボルを検索をするためのソースです。
終わりに
以上で一通りの機能について紹介が終わりました。
このvim-gdev/emacs-gdevは自分がGaucheを書いていて欲しいと思った機能をスクリプトとしてまとめたものです。
現状ではこれぐらいの機能しがありませんが、今後も何か思いつけば追加していくと思います。
余談ですが、
開発者自身は普段Vimをメインに使用しているので、emacs-gdevのバグに気づかないことが多いです。
使ってみて動作がおかしければぜひ報告してください。
では最後に、設定ファイルの書き方を掲載します。
キーマッピングなどは使いやすいものに変更して利用してください。
.vimrc
":Unite gosh_infoを実行します nmap gi <Plug>(gosh_info_start_search) ":Unite カーソル位置のシンボルを初期値に:Unite gosh_infoを実行します nmap gk <Plug>(gosh_info_start_search_with_cur_keyword) imap <C-A> <Plug>(gosh_info_start_search_with_cur_keyword) "ginfoウィンドウのスクロールアップ・ダウン nmap <C-K> <Plug>(gosh_info_row_up) nmap <C-J> <Plug>(gosh_info_row_down) imap <C-K> <Plug>(gosh_info_row_up) imap <C-J> <Plug>(gosh_info_row_down) "ginfoウィンドウを閉じます nmap <C-C> <Plug>(gosh_info_close) imap <C-C> <Plug>(gosh_info_close) "カーソル位置のシンボルが定義されている場所にジャンプ nmap <F12> <Plug>(gosh_goto_define) nmap <F11> <Plug>(gosh_goto_define_split)
(require 'gdev) ;;emacs-gdevをインストールしたディレクトリを指定 (必須) (setq gdev:root-dir "~/.emacs.d/emacs-gdev") ;;auto-completeがインストールされいる場合 (require 'goshcomp) ;;anythingがインストールされている場合 (require 'gosh-anything) (defun scheme-mode-hooks () ;;auto-completeにGauche用のソースを追加 (setq ac-sources (append goshcomp:all-source ac-sources)) ;;ginfo-with-word-anythingコマンドをC-cgkに割り当て (define-key scheme-mode-map "\C-cgk" 'ginfo-with-word-anything) ;;ginfoバッファのクローズ (define-key scheme-mode-map "\C-c0" 'gdev:close-ginfo) ;;ginfoバッファのスクロールアップ・ダウン (define-key scheme-mode-map "\C-c\C-n" 'gdev:scroll-up-ginfo) (define-key scheme-mode-map "\C-c\C-p" 'gdev:scroll-down-ginfo) ;;現在のバッファでカーソル位置のシンボルが定義されている場所にジャンプ (define-key scheme-mode-map [f12] (lambda () (interactive) (gdev:gosh-goto-define (symbol-name (symbol-at-point)) nil))) ;;横方向に分割したバッファでカーソル位置のシンボルが定義されている場所にジャンプ (define-key scheme-mode-map [f11] (lambda () (interactive) (gdev:gosh-goto-define (symbol-name (symbol-at-point)) 'h))) ;;縦方向に分割したバッファでカーソル位置のシンボルが定義されている場所にジャンプ (define-key scheme-mode-map [f10] (lambda () (interactive) (gdev:gosh-goto-define (symbol-name (symbol-at-point)) 'v))) ) ;;フックをschemeモードに登録 (add-hook 'scheme-mode-hook 'scheme-mode-hooks)
IMEを監視して現在行の色を変更するVisualStudio2010用拡張
タイトル通りのものを作りました。
ものすごく役に立つ、というわけではありませんが、あるとちょっと幸せになれるかもしれない拡張です。
スクリーンキャプチャだと↓な感じ。
IMEがOFF時。
IMEがON時。
ソースコードはこちら。
拡張をインストールするために必要なvsixはリポジトリ内のDownloadsのページからダウンロードできます。
それぞれの色が気に入らない場合はオプション画面で変更することができます。
色をARGBで指定できるので、エディタの背景色などを考慮して適当に変更してください。
vim_goshreplに自動use機能とwhich-module関数を追加しました
先日こちらで紹介したVim上で動作するGaucheのREPLプラグインに新しい機能を実装したので紹介します。
- 自動use機能
まだ読み込まれていないモジュールのシンボルを使用したときに、自動的に必要なモジュールをuseする機能です。 - which-module関数
シンボルがどのモジュールに属しているか検索するための関数です。
標準のaproposの全モジュール版のような感じです。
自動use機能
自動useは、まだ読み込まれていないモジュールのシンボルを使用したときに、自動的に必要なモジュールを探し出しuseする機能です。
僕の場合、REPLをエディタ内で編集中のコード片を張り付けてテストするために使うことが多いのですが、そのたびに必要なモジュールをuseするのは面倒でした。
そこで標準のREPLにはない機能ですが自作のスクリプトに実装しました。
標準とは違う挙動になってしまうのでデフォルトでこの機能は無効になっています。
自動use機能を使う場合はvimrc内に、
let g:gosh_enable_auto_use = 1
と書いてください。
自動use機能ですが、あらかじめシンボルとモジュールの対応を生成しておいてその中から探し出すという方法を取っているため、
自動でモジュールを探し出せるのは標準で用意されているモジュールだけです。
ユーザーが独自に追加したモジュールなどは自動useすることはできません。あしからず。
which-module関数
これも標準のREPLにはない機能ですが、あると便利なので実装しました。
標準で用意されているaproposとの違いは、
まだimport(use)していないモジュールからも検索することと、
自動use機能と同じように事前にシンボル<->モジュールの対応を取っているため、標準以外のシンボルの検索はできないというところです。
which-moduleは関数として定義しています。インタフェースは以下のような感じ。
(which-module pattern :key (match 'submatch))
- pattern
patternはシンボル・文字列・正規表現を指定することができます。
このpatternにマッチするようなシンボルがリスト表示されます。 - :match
:matchには'submatchシンボルまたは'strictシンボルを指定することができます。
'submatchの場合、aproposと同じように部分一致でもマッチしたと判定します。
'strictの場合、完全一致のシンボルのみマッチしたと判定されます。
Vim上でGaucheのREPLを動かす
※2012/5/4 追記 neocomplcache用のキーワードパターン記述を追加
タイトル通り、画像の通りのものを作りました。
Vim上からgoshREPLを扱うためのVimscriptです。
ソースコードはGithubにあります。こちら。
インストール方法は標準の方法と変わりないので割愛。
ただ、動かすためにはvimprocとGauche本体が必要なのでそちらも一緒にインストールしてください。
操作方法は基本的には標準のgoshと同じです。
ただ、Vim上で扱うということで様々な恩恵を受けることができます。
- RedoとUndoが使える
- シンタックスハイライト、オートインデントが可能
- neocomplcache等による補完機能が使える
- (readline風に)入力履歴をさかのぼることができる
- 以前に入力したテキストを範囲選択して(テキストを少し修正して)再び実行することができる
※追記
neocomplcacheが入っている方は、vimrcに以下のようなパターンを書いておくとgoshREPL内でシンタックス補完などがきくようになると思います。
let g:neocomplcache_keyword_patterns['gosh-repl'] = "[[:alpha:]+*/@$_=.!?-][[:alnum:]+*/@$_:=.!?-]*"
最後の一つは追加の説明が必要だと思うので少し解説します。
goshREPLバッファに表示されている文字列は全て単なるテキストなので、カーソルを動かして以前に入力した行に戻ることができます。
で、式を修正してその行で再びエンターを押すと、修正された内容で評価できます。
さらに、範囲選択してからエンターを押すと、選択した範囲の内容をもう一度実行することができます。
選択モードはノーマル選択・行選択・矩形選択が可能なので、式全体の中で一部分だけを実行ということも可能です。
この範囲選択して実行という動作は基本的にはgoshREPLのバッファ内のみで有効になっていますが、
ほかのバッファでも同じことができれば便利なときがあります。
プログラムを書いているときに一部分だけを実行させて動作を確かめたいということってありますよね?
そんな時は
vmap <CR> <Plug>(gosh_repl_send_block)
というようなキーマップをvimrcに書けば実現できます。
それでは最後に、このプラグインで定義されているコマンドやバッファ内で使えるキーマップを紹介します。
コマンド
コマンド名 | 説明 |
---|---|
GoshREPL | gosh REPLを起動する |
GoshREPLWithBuffer | 現在バッファのテキストを全て評価済みの状態でgosh REPLを起動する |
GoshREPLClear | gosh REPLの内容をすべてクリアする |
GoshREPLSend hoge | 引数のhogeをGaucheの式としてgosh REPL内で評価するまだgosh REPLが起動していない場合は自動的に新しいREPLが起動する |
GoshREPLLines | GoshREPL内で実行したすべての式をリスト表示する |
goshREPLバッファ内で有効なキーマップ
モード | キー | 説明 |
---|---|---|
Visual | <CR> | 選択されているテキストを実行 |
Normal, Insert | <C-p> | 入力履歴を以前にさかのぼる |
Normal, Insert | <C-n> | 入力履歴を次に進む |
割り当て可能なキーマップ
キーマップ名 | 説明 |
---|---|
<Plug>(gosh_repl_send_block) | vmapで任意のキーに割り当てることで、選択した範囲のテキストをGoshREPLSendコマンドと同じように実行することができる |
変更可能な変数
変数名 | デフォルト値 | 説明 |
---|---|---|
g:gosh_enable_ring_history | 1 | 0にすることで、入力履歴の始端と終端をつなげないようにする |
g:gosh_enable_auto_use | 0 | 1にすることで、REPL内で自動use機能が働くようになる 詳しい機能説明はコチラ |
g:gosh_updatetime | 1000 | REPL内で出力確認を行う時間間隔(ミリ秒単位) |
g:gosh_buffer_direction | 'h' | 'h'の場合はREPLバッファが水平に分割されて開く 'v'を指定すれば垂直に分割されて開く |
g:gosh_buffer_width | 30 | REPLバッファを垂直方向に開いた時の横幅 |
g:gosh_buffer_height | 15 | REPLバッファを水平方向に開いた時の縦幅 |
基本的な機能は以上です。
このVimscriptはただ自分がほしかったという動機で作ったので、
カスタマイズ性が低かったり、足りない機能があると思います。
使ってみて何か思うようなことがあればぜひフィードバックしてください。
できるだけ対応したいと思います。
Gauche用OpenCVラッパー、Gauche-CVお披露目
お披露目とかタイトルで書いておきながら、まだとってもバギーなGauche-CVを紹介します。
ここ最近、Gauche-SDLとかgosh_completeとか他のあまり表に出していないもの物含めて、たくさんのGaucheプログラムを書いてます。
それらの書くきっかけになったのが今回紹介するGauche-CVです。
確認してみるとファーストコミットが去年の6月でした。実際はもう少し早くから書き始めているので、結構な時間がたってようやっとのお披露目です。
時間がかかった理由はと言うと、OpenCVが持つ膨大な関数群のせいです。
一つ一つラップするのですが、動作テストなんて気の遠くなる作業です。というか、画像処理の場合ほぼほぼ無理です。
というわけで、未だにとってもとってもバグが盛りだくさんです。
そんなGauche-CVですが、ソースはgithubにあります。こちら。
対応しているOpenCVのバージョンは2.2以降になります。2.1以下には対応していないのであしからず。
また、現状実装できているモジュールは、
- core
- imgproc
- highgui
顔認識に必要なモジュールなどはまだできてません。
Gauche-CVをソースからコンパイルするには
Gaucheの0.9.2が必須になります。
またpkg-configや先ほどあげたバージョンのOpenCVがインストールされていることが条件になるので、少しハードルが高いかもしれません。
そこでWindowsの方のみですがコンパイル済みのバイナリを配布します。今のところ32bit用のOpenCVしか用意できていません。
OpenCV2.2用のバイナリはこちら。
OpenCV2.3用のバイナリはこちら。
サンプルコードはこちら。
OpenCV2.3用のバイナリですが、2012年3月5日現在配布されているOpenCV-2.3.0-win-superpackというものに含まれる、x86\vc10フォルダ内にあるDLLを利用してコンパイルしています。ですが、そもそも2.3で新しく追加された関数などはGauche-CV上では実装されていないので、そこにもご注意を。
Windows用バイナリのインストール方法ですが、解凍したフォルダ内にあるinstall.cmdを管理者権限で実行するだけです。このスクリプト内ではgoshを利用しているので、Gaucheはあらかじめインストールしていてください。アンインストールするには同じフォルダにあるuninstall.cmdを実行するだけです。
とりあえずこれで動くようになるはずなので、
サンプルソースを動かしたり編集してみたりして遊んでやってください。
がっつり書くのなら、gosh_completeが便利ですよ。(すみません。宣伝です)
gosh_completeを作るきっかけはGauche-CVを書きやすくするためだったりしますし。
最後に、何度も言いますがGauche-CVはとってもバギーなライブラリです。
何か起こっても怒らない寛容な気持ちで使ってください。
そして、何か起きたらそっとgithubなりここのコメントなりに報告してください<(_ _)>
neocomplcacheを利用したGauche用補完プラグインgosh_completeを作ってます(インストール篇)
※3月4日gosh_completeのインストール方法を修正しました。
タイトルがやたらと長くなってしまいましたが、何となくの思いたった勢いで、Vimのneocomplcacheのソースプラグインとして動作するGauche用補完プラグインを作成してます。
動作画面はこんな感じ↓
機能的にはまだ詰め込みたいところはあるけど、とりあえずひと段落ついたので、ここらで公開したいと思います。
という訳でインストール方法です。
このプラグインはneocomplcacheのソースプラグインとして動作しているので、当然ですがneocomplcacheが使える必要があります。
neocomplcacheのgithubはこちら。
neocomplcacheのインストール方法については検索すればたくさん出てくると思うので、まだインストールしていない人はいろいろ探してインストールしてください。
次に、このプラグインはvimprocというVimプラグインを利用しています。なのでvimprocも必須です。
vimprocのgithubはこちら。
vimprocではインストール後、自前でコンパイルする必要があります。Windowsの方はgithubのDownloadsのページにコンパイル済みDLLがあるのでそれを使うという手もあります。
このプラグインではGaucheのソースコードの解析をGaucheのプログラムによって行っています。つまり、Gauche本体もこのプラグインの動作には必須になります。
Gaucheのダウンロードはこちらからどうぞ。
最後に、gosh_complete本体をインストールします。
vundleなどを使ってプラグイン管理をしている方は
Bundle 'aharisu/Gauche-Complete'
と.vimrcなどに書いてBundleInstallすればgosh_completeはインストールされます。
その他の方はzipをここからダウンロードしてください。zipを解凍してでてきたautoloadフォルダを、いつものように.vimフォルダ内のautoloadとマージすれば完了です。
長くなりましたが、やっと準備完了です。
これでGaucheのソースコードをVimで編集するときにgosh_completeが解析した補完候補が表示されると思います。
インストールの注意点としては、neocomplcacheやvimprocはできるだけ新しいものを利用してください。
また、多くの環境で動作テストができているわけではないので、意味不明なエラーが起きた場合は遠慮なくコメントしてください。
最後に、gosh_completeの機能に関してはまた別の記事に書こうと思いますが一点だけ、
補完候補と一緒に出てくるこのプレビュー画面、
たまにうざいと思うことがあります。(作者も)
プレビュー画面を消したい場合は、.vimrcなどに
set completeopt=menu
と書いてください。
たまに邪魔なプレビュー画面ですが、あると便利な時もあるのでこの機能に関しては今後改良するつもりです。