slimv(2)

年末に実家へ行ったら、庭の片隅に蕗の芽が出ていた。年が明けたら、七草代わりに食べようと 思っていた。が、正月に降った雪で、蕗がどこに生えていたか分からなくなってしまった。

生えていそうな所を、ここ掘れワンワンしようかと思ったけど、雪掻きは駐車場だけでいいかげん 飽きてきたので諦めた。雪が融けるとわんさかあるから我慢我慢。その代わり、畑に埋めておいた 大根とかネギがいい味を出してましたよ。ええ、ちゃんと埋めた所に竿を立ててあるんで、一発 ヒットです。

黒豆の煮付けがどんぶり一杯出てきた。何でも義姉の所で友達から貰った豆で煮豆を作ろうとして うっかり全部を水で戻しちゃったらしい。そしたら、豆が膨れて翌朝にはボールからはみ出して しまったらしい。それで処分に困って、実家にお裾分け。それが、煮付けになって登場。

正月早々、マメに豆を食いましたとさ。 今年もマメにやって行こう。

vim vs emacs

この間からvimにニアミスしてる訳だけど、emacs派の人はどうvimを見てるんだろう? vim vs emacs こんなのが有るぐらいだから、まあ宗教戦争だわな。unix文化の内輪もめでもある訳だ。

そうかと思うと 僕がサクラエディタからVimに乗り換えるまで なんて言う宗派変えを公言する人もいて、もう好きにすれば。。。 が、結論であったりする。

おいらも、いきがかり上、vimに触って、vimの年にしてみっかな。何せ、editor そんなの、edに 決まってますでしょ(嘘です。exぐらいかnviぐらいがいいんでないかい)

vimの資料

日本の基点はここにあります。まだ松が取れていないので、初詣するなら お早めに。

Hackするなら、かかせないぞ。

Vim Wikiも見といた方がいいかな。

Vim UTF-8 日本語版が欲しい 人はこちらにどうぞ。

unix系でもvim

と言う事で、ArchLinuxにvimを入れてみたよ。gvimが使えるかと思ったら入ってなかった。 いれようとしたら、既にあるvimとコンフリクトするけど、vimを消すかい? だってさ。

はい、そうします。リモートで使う場面でも、vimを指定すれば使えるし。『大は小を兼ねる』で あります。

[sakae@arch bin]$ ls -l *vim*
lrwxrwxrwx 1 root root       3 Nov 27 15:39 evim -> vim
lrwxrwxrwx 1 root root       3 Nov 27 15:39 gvim -> vim
lrwxrwxrwx 1 root root       3 Nov 27 15:39 gvimdiff -> vim
-rwxr-xr-x 1 root root     143 Nov 27 15:39 gvimtutor
lrwxrwxrwx 1 root root       3 Nov 27 15:39 rgvim -> vim
lrwxrwxrwx 1 root root       3 Nov 27 15:39 rvim -> vim
-rwxr-xr-x 1 root root 2238676 Nov 27 15:39 vim
lrwxrwxrwx 1 root root       3 Nov 27 15:39 vimdiff -> vim
-rwxr-xr-x 1 root root    2084 Nov 27 15:39 vimtutor

単なるリンクになってました。それにしてもでかいね。太っているね。viは?

[sakae@arch bin]$ ls -l vi
lrwxrwxrwx 1 root root 2 Nov  4 16:26 vi -> ex
[sakae@arch bin]$ ls -l ex
-rwxr-xr-t 1 root root 213692 Nov  4 16:26 ex

参考値でemacsも

[sakae@arch bin]$ ls -l *emacs*
-rwxr-xr-x 1 root root   90900 Sep 13 06:22 ctags.emacs
-rwxr-xr-t 2 root root 6747448 Sep 13 06:22 emacs
-rwxr-xr-t 2 root root 6747448 Sep 13 06:22 emacs-23.3
-rwxr-xr-x 1 root root   18304 Sep 13 06:22 emacsclient

太さ勝負では、やっぱりvimの方がスリム。だけど、、、

[sakae@arch bin]$ ldd ./vim|wc -l
55
[sakae@arch bin]$ ldd ./emacs|wc -l
60

いろんな物の寄せ集め度では、さして変わらないな。って、隠れ肥満じゃん!

肥満の原因を分析すると、使いもしないperlとかLuaのモジュールが入っていたりするんだなあ。 それを踏まえて、FreeBSDのgvimではpythonだけを取り込んだやつを作ってあげた。それによって どのぐらいスリムになったかは秘密。

quickrun

上記のhackをつらつらと見てたら、hack7に面白いのが 上がっていた。これって、昔rubyのスクリプトを書く時、ターミナルを2つ開いて、一つは 編集用、もう一つは実行用にしてたのを、vimの中に居るだけで出来るようにしちゃう物かな。 これはもう試してみる鹿。

ちょいとquickrunをぐぐってみると、同じスクリプト名で、別々な作者が開発してるようだ。 画面が上下に割れるやつ(:sp)と左右に割れる(:vsp)版だ。おいらは、上下に割れるやつに 馴染みがあるんで、こちらから頂いてきた。

早速、ArchLinuxに入れ(doc,plugun,autoloadのフォルダーを.vimに突っ込むだけ)、rubyで試そうと puts "Hellow"と入力した後、ノーマルモードで、\r (バックスラッシュ r)したら、 vimに怒られた。

行末が、CRLFになってるから駄目だよと(Windows用のgitで落としてきたのを使ったら、行末が Windows用になってたんだな)。。しょうがないので、

%s/^V^M//

とかやって、CRを除去したよ。exコマンドって指に染み付いているな。

 12: ~/.vim/plugin/quickrun.vim
 26: ~/.vim/autoload/quickrun.vim
 27: ~/.vim/autoload/vital.vim
 28: ~/.vim/autoload/vital/_c980ec.vim
 29: ~/.vim/autoload/vital/_c980ec/prelude.vim
 30: ~/.vim/autoload/vital/_c980ec/data/list.vim
 31: ~/.vim/autoload/vital/_c980ec/data/string.vim
 32: ~/.vim/autoload/quickrun/runner/python.vim
 33: ~/.vim/autoload/quickrun/runner/remote.vim
 34: ~/.vim/autoload/quickrun/runner/shell.vim
 35: ~/.vim/autoload/quickrun/runner/system.vim
 36: ~/.vim/autoload/quickrun/runner/vimproc.vim
 37: ~/.vim/autoload/quickrun/outputter/browser.vim
 38: ~/.vim/autoload/quickrun/outputter/file.vim
 39: ~/.vim/autoload/quickrun/outputter/buffer.vim
 40: ~/.vim/autoload/quickrun/outputter/buffered.vim
 41: ~/.vim/autoload/quickrun/outputter/error.vim
 42: ~/.vim/autoload/quickrun/outputter/message.vim
 43: ~/.vim/autoload/quickrun/outputter/multi.vim
 44: ~/.vim/autoload/quickrun/outputter/null.vim
 45: ~/.vim/autoload/quickrun/outputter/quickfix.vim
 46: ~/.vim/autoload/quickrun/outputter/variable.vim

でもって、いろんなスクリプトが協調して、やっとこさ画面が割れ、結果が表示されました。 (上のリストを見ると、Python必須だな) 結果のWindowは、:q (コロン q)で消えるだ。調子に乗って、schemeのスクリプトで 実験したら、gaucheが採用されました。日本製優先なんすかね?

lispで実験したら

/bin/bash: clisp: command not found

って、叱られた。どこでデフォが定義されてるかと思ったら、autoload/quickrun.vimに 書いてあった。いろいろ有って面白い。ちょいと例を引っ張っておく。

\ 'ruby': {'eval_template': " p proc {\n%s\n}.call"},
\ 'scheme': {
\   'type': executable('gosh')     ? 'scheme/gauche':
\           executable('mzscheme') ? 'scheme/mzscheme': '',
\ },
\ 'scheme/gauche': {
\   'command': 'gosh',
\   'exec': '%c %o %s:p %a',
\   'eval_template': '(display (begin %s))',
\ },
\ 'scheme/mzscheme': {
\   'command': 'mzscheme',
\   'exec': '%c %o -f %s %a',
\ },

mzschemeは入っていないから、csiにでも書き換えちゃえばいいのかな。それとも、:help QuickRun して 真面目に設定を追加する方がいいのかな?

動きは大体想像がつくな。schemeって言うHashのキーがあって、goshが実行出来れば(存在すれば) scheme/gaucheって値を返す。そうで無かったら、scheme/mzschemeか。

今度は、scheme/gaucheでHashを引き、コマンド名とコマンドオプション、それにvim上に展開 してるスクリプトとスクリプトのオプションを与えて実行するとな。

ああ、schemeを2種類以上入れても、切り替えをどうやるんだろう?やっぱりHelp Helpだな。

slimv gauche

大分横道に逸れちゃった。先週やってたslimvでgaucheを動かすやつ。動かなかった件に探りを入れてみる。

gvim側からgauche側のswankサーバーにコネクトすると、黙っちゃうんだった。swank-gauche.scmを つらつらと見てたら、ログを出せる事を発見した。

(define log-port (open-output-file "/tmp/ga-swank.log"))

こうやっておいて走らせると、(サーバーが起動してる)xterm上ではコネクション待ちの状態を 表示すてたけど、ログが出てた。長いんで一部を省略するけど

READ: [45] (:emacs-rex (swank:connection-info) nil t 1)
dispatch-event: (:emacs-rex (swank:connection-info) nil t 1)
dispatch-event: (:return (:ok (:pid 1451 :package (:name "user" :prompt "user")
:features '() :modules ("gauche.gf" "gauche.interactive" "srfi-8" "gauche.array"
     <snip>
"gauche.net" "gauche.internal" "srfi-17" "util.match" "scheme" "srfi-14" "gauche
.time" "gauche.experimental.lamb" "srfi-11") :lisp-implementation (:type "Gauche
" :version "0.9.1") :version "2010-01-03")) 1)
WRITE: [830] "(:return (:ok (:pid 1451 :package (:name \"user\" :prompt \"user\"
     <snip>
type \"Gauche\" :version \"0.9.1\") :version \"2010-01-03\")) 1)"
 
READ: [67] (:emacs-rex (swank:swank-require 'swank-fuzzy) nil :repl-thread 2)
dispatch-event: (:emacs-rex (swank:swank-require 'swank-fuzzy) nil :repl-thread 2)
dispatch-event: (:return (:ok ("gauche.gf" "gauche.interactive" "srfi-8" "gauche
     <snip>
"gauche.time" "gauche.experimental.lamb" "srfi-11")) 2)

WRITE: [679] "(:return (:ok (\"gauche.gf\" \"gauche.interactive\" \"srfi-8\" \"g
     <snip>
" \"gauche.time\" \"gauche.experimental.lamb\" \"srfi-11\")) 2)"

ごちゃごちゃしてるけど、冷静になってログを読むと、2回、gvim側とやりとりしてるな。 gauche側がサーバーなんで、クライアント(のvim側から)挨拶があって、それに対して 使えるモジュール情報とバージョン番号等を返答してる。

続いて、クライアント側から、swank-fuzzyが有りますかって要求が有り、それに対して 返答してる。けど、gauche側は、swank-fuzzyを持ってないんだな。

一方、vim側のフロントエンド swank.pyを読むと、こちら側でもログが取れるようなので 取ってみた。

log             = True         # Set this to True in order to enable logging
logfile         = 'swank.log'   # Logfile name in case logging is on
[---Sent---] 0.96
(:emacs-rex (swank:connection-info) nil t 1)

[-Received-] 0.98
(:return (:ok (:pid 1451 :package (:name "user" :prompt "user") :features '() :m
odules ("gauche.gf" "gauche.interactive" "srfi-8" "gauche.array" "user" "gauche.
   <snip>
xperimental.lamb" "srfi-11") :lisp-implementation (:type "Gauche" :version "0.9.1") :version "2010-01-03")) 1)
[Actionlist] 0.98
1: pending  :connection-info
params: [':pid', '1451', ':package', [':name', '"user"', ':prompt', '"user"'], ':features', "'("]
[---Sent---] 2.02
(:emacs-rex (swank:swank-require 'swank-fuzzy) nil :repl-thread 2)

[-Received-] 2.02
(:return (:ok ("gauche.gf" "gauche.interactive" "srfi-8" "gauche.array" "user" "gauche.
modutil" "util.stream" "gauche.procedure" "gauche.mop.validator" "gauche.
    <snip>
auche.experimental.lamb" "srfi-11")) 2)
[Actionlist] 2.03
1: pending  :connection-info
2: finished :swank-require
params: ['"gauche.gf"', '"gauche.interactive"', '"srfi-8"', '"gauche.array"', '"user"',
 '"gauche.modutil"', '"util.stream"', '"gauche.procedure"', '"gauche.mop.validator"',
    <snip>
ternal"', '"srfi-17"', '"util.match"', '"scheme"', '"srfi-14"', '"gauche.time"', '"g
auche.experimental.lamb"', '"srfi-11"']

gaucheのそれと同じログが出てる。通信はちゃんと出来てるけど、要求する機能を使えないので もーやめた、と黙りこくちゃってるんだな。残念。