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つのファイルが左右に表示されて、変更の有った部分が色付けされている。変更の無い部分は 折りたたまれているので、折り畳み線の所で、右矢印キーを入力すれば展開される。
カーソルの動きに追従して、もう一方のファイルの表示位置も変わるのが面白い。よーやるわ。