aharisuのごみ箱

2012-09-30

Gauche開発支援拡張vim-gdev/emacs-gdev紹介

VimEmacs上のそれぞれで動作するGauche開発支援の拡張スクリプトを開発しています。

開発に一区切りつけるためにこの辺で紹介記事としてまとめておきたいと思います。


なにはともあれ動作画面のスクリーンショットから。

f:id:aharisu:20120930211258p:image:w480f:id:aharisu:20120930211138p:image:w480

このスクリプトではVimEmacsでほぼ同じことを実現しています。


インストール方法

VimEmacsそれぞれのインストール方法から紹介します。

まず、どちらにも共通していることですが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であればneocomplcacheEmacsであればAuto Complete Modeのソースとして表示・選択できます。

また、定義場所へジャンプは、指定されたシンボルが定義されているファイル・行を自動で表示します。


三つめのシンボルの詳細な情報を表示する機能について紹介します。

vim-gdev/emacs-gdevでは定義からシンボル名を解析するだけでなく、シンボルに付属する情報も一緒に解析しています。

  • シンボルタイプ(変数、関数、クラス...)
  • 定義モジュール(ファイル)名
  • シンボル名
  • 関数であれば引数、クラスであればスロット名
  • それぞれに付随するドキュメント

このようなプログラムを書いているときに必要になる情報を、この機能を利用することで素早く表示できるようになります。

f:id:aharisu:20120930222418p:image:w480

f:id:aharisu:20120930222417p:image:w480

この情報を素早く表示するための一覧・検索機能として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

Emacs

  • 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)

.emacs

(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)

2012-07-10

IMEを監視して現在行の色を変更するVisualStudio2010用拡張

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

ものすごく役に立つ、というわけではありませんが、あるとちょっと幸せになれるかもしれない拡張です。


スクリーンキャプチャだと↓な感じ。

f:id:aharisu:20120710204251p:image:w640

IMEがOFF時。

f:id:aharisu:20120710204252p:image:w640

IMEがON時。


ソースコードはこちら。

拡張をインストールするために必要なvsixはリポジトリ内のDownloadsのページからダウンロードできます。


それぞれの色が気に入らない場合はオプション画面で変更することができます。

f:id:aharisu:20120710204736p:image:w640

色をARGBで指定できるので、エディタの背景色などを考慮して適当に変更してください。

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