aharisuのごみ箱

2012-05-03

vim_goshreplに自動use機能とwhich-module関数を追加しました


先日こちらで紹介したVim上で動作するGaucheREPLプラグインに新しい機能を実装したので紹介します。

  • 自動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の場合、完全一致のシンボルのみマッチしたと判定されます。

2012-04-30

Vim上でGaucheのREPLを動かす

※2012/5/4 追記 neocomplcache用のキーワードパターン記述を追加

f:id:aharisu:20120430122039p:image

タイトル通り、画像の通りのものを作りました。

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バッファに表示されている文字列は全て単なるテキストなので、カーソルを動かして以前に入力した行に戻ることができます。

f:id:aharisu:20120430124855p:image:w640

で、式を修正してその行で再びエンターを押すと、修正された内容で評価できます。

f:id:aharisu:20120430124853p:image:w640


さらに、範囲選択してからエンターを押すと、選択した範囲の内容をもう一度実行することができます。

選択モードはノーマル選択・行選択・矩形選択が可能なので、式全体の中で一部分だけを実行ということも可能です。

f:id:aharisu:20120430124856p:image:w640

この範囲選択して実行という動作は基本的にはgoshREPLのバッファ内のみで有効になっていますが、

ほかのバッファでも同じことができれば便利なときがあります。

プログラムを書いているときに一部分だけを実行させて動作を確かめたいということってありますよね?

そんな時は

vmap <CR> <Plug>(gosh_repl_send_block)

というようなキーマップをvimrcに書けば実現できます。


それでは最後に、このプラグインで定義されているコマンドやバッファ内で使えるキーマップを紹介します。

コマンド

コマンド名 説明
GoshREPL gosh REPLを起動する
GoshREPLWithBuffer 現在バッファのテキストを全て評価済みの状態でgosh REPLを起動する
GoshREPLClear gosh REPLの内容をすべてクリアする
GoshREPLSend hoge 引数hogeGaucheの式として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はただ自分がほしかったという動機で作ったので、

カスタマイズ性が低かったり、足りない機能があると思います。

使ってみて何か思うようなことがあればぜひフィードバックしてください。

できるだけ対応したいと思います。

2012-03-05

Gauche用OpenCVラッパー、Gauche-CVお披露目

お披露目とかタイトルで書いておきながら、まだとってもバギーGauche-CVを紹介します。


f:id:aharisu:20120305194846p:image:left

f:id:aharisu:20120305194845p:image:left

f:id:aharisu:20120305194842p:image:left

f:id:aharisu:20120305194844p:image:left

f:id:aharisu:20120305194843p:image


ここ最近、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なりここのコメントなりに報告してください<(_ _)>

2012-03-03

neocomplcacheを利用したGauche用補完プラグインgosh_completeを作ってます(インストール篇)

※3月4日gosh_completeのインストール方法を修正しました。


タイトルがやたらと長くなってしまいましたが、何となくの思いたった勢いで、Vimneocomplcacheのソースプラグインとして動作するGauche用補完プラグインを作成してます。

動作画面はこんな感じ↓

f:id:aharisu:20120303182831p:image


機能的にはまだ詰め込みたいところはあるけど、とりあえずひと段落ついたので、ここらで公開したいと思います。


という訳でインストール方法です。


このプラグインneocomplcacheのソースプラグインとして動作しているので、当然ですがneocomplcacheが使える必要があります。

neocomplcachegithubこちら

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の機能に関してはまた別の記事に書こうと思いますが一点だけ、

補完候補と一緒に出てくるこのプレビュー画面、

f:id:aharisu:20120303191813p:image

たまにうざいと思うことがあります。(作者も)

プレビュー画面を消したい場合は、.vimrcなどに

set completeopt=menu

と書いてください。

たまに邪魔なプレビュー画面ですが、あると便利な時もあるのでこの機能に関しては今後改良するつもりです。

2012-01-23 Gauche-SDLをWindowsで動かす

Gauche-SDLをWindowsで動かす

前回の記事で紹介したように、Gauche-SDLというGaucheSDL拡張ライブラリを作ってます。

そんなGauche-SDLWindows環境でも手っ取り早く動かせるようにしたので、方法を記事としてまとめておきます。


今まではソースコード一式を取得して、MinGWを使って自前でコンパイルする必要があったのですが、

事前にコンパイル済みのバイナリインストールすればいいだけにしました。

ただ、現状では試験的な導入なので、64bit版のWindowsには対応していません。64bit版の方はもうしばらくお待ちください。


必要なファイル一式はコチラ

また、必要な環境はGaucheの0.9.2がインストール済みであることです。


インストール方法は、ダウンロードしたzip解凍したフォルダ内にあるinstall.cmdを実行するだけです。

注意することとして、Windows Vistaや7の場合はinstall.cmdを管理者として実行する必要があります。

また、レジストリをいじっていないのでアンインストール情報などは登録されません。

アンインストールする時は同じフォルダ内にあるuninstall.cmdを実行してください。


次に、作成したプログラムを実行するためにはSDLライブラリDLLが必要です。

こちらはbinaryフォルダ内に全てあるので、パスの通ったフォルダに全てコピーしてください。


これでGauche-SDLWindowsでも動かせるようになったはずです。


ただWindows環境での問題点として、

公式で配布されているGaucheWindowsバイナリではThread機能がサポートされていないため、

Gauche-SDLでもその部分に依存している関数は実行できないというところです。

具体的には、sampleフォルダ内にあるsound.scm/thread.scm/timer.scmが実行できません。

これについては現状どうしようもないので、Gaucheバージョンアップで公式にWindowsでもスレッドがサポートされることに期待します。

※追記 最近のGaucheのコミットを見てみるとWin32スレッドをサポートするためのものがあったので、次期バージョンあたりでサポートされるのかな?と推測。公式にサポートされれば、こちらも修正して対応します。


今回のWindowsサポートは様々な環境化でのテストがほとんどできていないので、

何か問題があればコメントなどで報告をお願いします。