slimv(3)

体が硬い。寒いので炬燵で猫のまねをしてたからではなさそうだ。昔は、前屈した時、余裕で掌が 床に着いたのにね。老化の現われなんだろうな。

怪我防止も兼ねて、柔らかい体になろう。それが今年の目標かな。

Webで調べてみると、ダイエットと共に紹介されるのが多いみたいだ。まあ、太鼓腹じゃ前屈 なんで到底無理なんで、当たってるちゃ当たってるな。

どんなのが有るかと言うと、 ストレッチ(柔軟体操)方法体を柔軟(柔らかくする)になる為の 効率のいい トレーニング方法簡単に体を柔らかくするBMCストレッチ・前屈(柔軟体操)股関節の柔軟体操 まあ、いろいろ有る事。

きっと、継続は力なり なんだろうな。

マクロ

マクロと言ってもキーボードマクロです。同じ事を何回も繰り返すのは猿なんで、この機能が 付いています。もうひとつの理由は、emacsにキーボードマクロがあるので、対抗上付けました。 最近のvimは、emacsで出来る事はvimでも出来るよね、が合言葉だそうです。

キーボードマクロって、要するにキーシーケンス(キーの叩き方)を記録しておいて、それを 後から簡単に(何回も)再生する機能です。ですから、ここから記録初め、vimのコマンド実行、 記録停止。後で再生って流れになります。記録を開始する時(a-zの)名前を付けておきます。

qa                   aと言う名前で、記録開始
vim command ...      vimのコマンドを(複数)実行
q                    記録停止
NN@a                 NN回記録したシーケンスaを実行

尚、複数の記録を残しておけるし、マクロの中でマクロを呼び出す事も可能。@@ だと、最後に 実行したマクロが、再度実行される。ちょいと実例で、前回やった行末のCRを削除しまくる例。

[sakae@cdr ~/qr-vim]$ vim `find . -name '*.vim'`   "" 全てのスクリプトを編集対象に
   ....                                            "" 最初のファイルがオープン
qc                                                 "" cって名前で録音開始
:%s/^V^M//                                         "" 行末のCRを削除
:w                                                 "" ファイルへ書き出し
:n                                                 "" 次のファイルへ
q                                                  "" 模範録音終了
50@c                                               "" 50回再生、最後のエラーは無視

vimを終了する積もりで、コロンを入れるのを忘れて、記録モードに入っちゃうのがちと煩わしい。 開始、終了を他のキーにバインド出来ないものだろうか? 人間工学を標榜するvimさんよ。

less

emacsでファイルを眺める時は、M-x less-minor-mode をよく使っていたんだけど、vimにも きっと有るよね。対抗上無いとまずいよって思って探してみたら有ったよ。

:runtime macros/less.vim

macrosなんて大層な場所に入っているな。これも、emacs目線なんでしょうか。なんて思って macrosを覗いてみたら、ハノイの塔とかライフゲームとか迷路とかも置いてあった。

emacsで開発されたpodの元祖 doctor が有るかと思ったら、vimには無いのね。だめじゃん vim。と思ったら、仮想コンピュータのシュミレータが入っていたよ。相当品はemacsに入って いるかなあ?

嗚呼、いちいち :runtime ... なんてやるのが面倒なら、コマンドを定義しちゃうって 事も出来るぞ。

command! Less :runtime macros/less.vim

ユーザー定義コマンドは、大文字で始まるっていう不思議?な制限があるんだけど、:Less って 叩くだけでいいので少しは楽珍か。

叩けよ、さらば開かれん』まあ、宗教ですから。。。

色気

gvimだと、色気を付けて遊んでみるのも楽しい。

名無しのvim使いさんので 色見本が一杯公開されてるので、気分で選んでみると楽しいだろう。

colorscheme koehler

選んだセットを設定しておけば良い。gvimの編集メニューにある 色テーマ選択 でも、設定 出来る。みんな色気大好き!

diff しましょ

vimにもdiff系が有るようだけど、今回は自分の目と脳内で行う、目diffね。

そう、gaucheがslimvで動かない件、なん とかしたいよね。とは言え、slimeのプロトコルも知らないし、これはもう、ちゃんと動いて いるやつと目diffして、違いを見つけるしかないね。

ってな事を考えて、ちゃんと動いているcsiのログと比べてみる。比べるログは、swank.pyが 出してるやつを使う。

[---Sent---] 2.79968923449e-06
(:emacs-rex (swank:connection-info) nil t 1)

[-Received-] 0.0372372666634
(:return (:ok (:pid 4772 :package (:name CSI :prompt CSI) :lisp-implementation (:type "Chicken Scheme" :version "4.7.0"))) 1)
[Actionlist] 0.0453381674634
1: finished :connection-info 
params: [':pid', '4772', ':package', [':name', 'CSI', ':prompt', 'CSI'], ':lisp-implementation', [':type', '"Chicken Scheme"', ':version', '"4.7.0"']]
 Package:CSI Prompt:CSI

emacs(この場合はvimだけど)側からの要求。接続開始して、サーバー側(で動いているLisp系の) 情報を頂戴っておねだりするんだな。

サーバー側からはokの返答に続いて、pidとかパッケージ情報、lispの情報を返してる。

gaucheの方はと言うと

[---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.
modutil" "util.stream" "gauche.procedure" "gauche.mop.validator" "gauche.uvector
" "gauche.parameter" "text.parse" "srfi-1" "gauche.charconv" "gauche.vm.debugger
" "gauche.collection" "srfi-13" "srfi-26" "gauche.hook" "null" "srfi-10" "gauche
.portutil" "gauche.condutil" "file.util" "swank-gauche" "gauche.interpolate" "ga
uche.experimental.ref" "srfi-6" "gauche" "gauche.vport" "gauche.object" "util.qu
eue" "gauche.sequence" "gauche.stringutil" "util.list" "srfi-2" "gauche.net" "ga
uche.internal" "srfi-17" "util.match" "scheme" "srfi-14" "gauche.time" "gauche.e
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', "'("]

なんだか返答に余計な項目(modulesとfeatures)が混じっているぞ。特にキーを解析した時の featuresの結果が怪しいな。 昔から『口は災いの元』って言うから、模範解答に習って おけばいいかな。

patch

余計なおしゃべりをしてる所を、swank-gauche.scm内で探してみる。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Swank functions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-macro (defslimefun name params :rest bodys)
  `(with-module swank-gauche
     (define (,name ,@params) ,@bodys)))

(defslimefun connection-info ()
  `(:pid ,(sys-getpid)
	 :package (:name "user" :prompt "user")
	 :features '()
	 :modules ,(all-modules->string-list)
	 :lisp-implementation (:type "Gauche" :version ,(gauche-version))
	 :version "2010-01-03"))

出、出たー。正真正銘のマクロですよ。ここで返答を組み立てているのね。フィーチャと モジュールの行を削除しちゃえ。ついでにプロンプトもgoshにしちゃえ。

[---Sent---] 0.5
(:emacs-rex (swank:connection-info) nil t 1)

[-Received-] 0.51
(:return (:ok (:pid 796 :package (:name "user" :prompt "gosh") :lisp-implementat
ion (:type "Gauche" :version "0.9.1") :version "2010-01-03")) 1)
[Actionlist] 0.51
1: finished :connection-info
params: [':pid', '796', ':package', [':name', '"user"', ':prompt', '"gosh"'], ':
lisp-implementation', [':type', '"Gauche"', ':version', '"0.9.1"'], ':version',
'"2010-01-03"']
 Package:user Prompt:gosh
[---Sent---] 0.53
(:emacs-rex (swank:create-repl nil) nil t 2)

今度は、余計な返事をしなくなった。と、同時に正常に動き出したよ。

[---Sent---] 0.66
(:emacs-rex (swank:listener-eval "(+ 123 456)
") "user" :repl-thread 6)

[-Received-] 0.66
(:return (:ok (:values "579")) 6)
[Actionlist] 0.67
6: finished :listener-eval
params: [':values', '"579"']

ちゃんと、REPLも回っているよ。よかった、よかった。replの画面をそのままsaveしちゃえば 対話の履歴になって、とっても便利。

Gauche 0.9.1  Port: 4005  Pid: 824
; SWANK 2010-01-03
gosh> (+ 123 456)
579
gosh>

折角なので、ちゃんとしたパッチを作っておこう。

[sakae@arch lib]$ diff -u swank-gauche.scm.org swank-gauche.scm
--- swank-gauche.scm.org        2012-01-05 10:24:15.000000000 +0900
+++ swank-gauche.scm    2012-01-11 14:39:23.000000000 +0900
@@ -102,6 +102,7 @@

 ;;;; logging
 (define log-port #f)
+;;(define log-port (open-output-file "/tmp/ga-swank.log"))
 ;;(define log-port (current-output-port))
 (define-macro (log-event fstring . args)
   `(when log-port
@@ -435,11 +436,9 @@

 (defslimefun connection-info ()
   `(:pid ,(sys-getpid)
-        :package (:name "user" :prompt "user")
-        :features '()
-        :modules ,(all-modules->string-list)
+        :package (:name "user" :prompt "gosh")
         :lisp-implementation (:type "Gauche" :version ,(gauche-version))
-        :version "2010-01-03"))
+        :version "2012-01-11"))

 (defslimefun quit-lisp ()
   (exit))

vimでもdiff

あろう事か、vimにもdiffが備わっている。カラフルなdiffである。

[sakae@arch lib]$ vim -d swank-gauche.scm.org swank-gauche.scm
2 files to edit
[sakae@arch lib]$

2つのファイルが左右に表示されて、変更の有った部分が色付けされている。変更の無い部分は 折りたたまれているので、折り畳み線の所で、右矢印キーを入力すれば展開される。

カーソルの動きに追従して、もう一方のファイルの表示位置も変わるのが面白い。よーやるわ。