Setup of Lem
Raspberry Pi 4の「特定の解像度でWi-Fiが不安定になる」問題を実際に検証
ふむ、特定の設定でspam電波の発振器になるんか。オイラーのHPのタイトルは、Ham es Spamなんだった事を思い出した。
Hamは食べるハムじゃなくてHam Radioの方ね。esは電信用語でandって意味。そしてSpamは、スパムメールから借りて来たもの。迷惑電波とか毒電波ね。 当初予定してた無線の事を主体にする積りが、方向違いのソフトの方に向いちゃった。まあいいか。
無線屋としては、そんな毒電波発生器よりも、 Wi-Spy DBx 2.4 and 5 GHz bandsの方に興味が有るぞ。
帯域が2.4/5Ghzしかない特定用途品にしては随分高価だな。TV電波受信用のドングルだと、ずっと安い製品が有ったはず。住む世界が違うと、高価格でも売れるって事だねと、無銭家が言っております。
scheme slime
chaton/Gauche を久しぶりに見ていたら、不穏な語句を目にした。r7rs-swank ですって。これはひょっとして、slime系でr7rsを動かしちゃえって試み? しかもこの話題がgaucheの掲示板に載るって事は、gaucheでslimeしちゃえって事だろうね。
この語句で聞き込みしてみると、
なにやら、lemって言う新種のeditorが有るって事らしい。そして、そのeditor用に、各種schemeが参加出来るようだ。
なる程ねぇ、前回やったgeiserよりも統一理論が幅を利かせる世の中になってるのね。
lem
どうやらlemってやつは、commonlispで書かれた、emacs似のeditorとな。わざわざこんな物を発明するって、能力の無駄使いじゃと思ったよ。
いや、emacsの遅さに辟易したlisperが、新理論に基づて開発したとな。commonLispなら、コンパイルすれば速くなるでしょ。更にコンパイルした環境をcore dump しとけば、次回の起動時には、そのcoreをメモリーに展開するだけで良くなる。結果、キビキビと動くとな。
これぞCLのキラーアプリじゃなかろうか。あれ? もうmaximaを忘れているよ。
なら入れてやろう。としたんだけど、CL用のパッケージマネージャーからしか、入れられないみたい。rosとか言うコマンドを叩くらしい。そしてそのマネージャの名前がroswellさんとか。
Roswell - Common Lisp environment setup Utility.
CLもパッケージマネージャーは流行り廃りがあったけど、これが決定打ですかね。 で、i386なマシンに(debian 10.2)roswellを入れたよ。
Lem is the editor/IDE well-tuned for Common Lisp.
そしてお目当てのlemも入った。
export PATH=$PATH:~/.roswell/bin lem hoge.lisp
こんな風に使うとな。起動すると、初回はごにょごにょやって、下記案内が出てきた。
Swank server running on sbcl 1.5.9
2回目からはすんなり起動するけど、M-x slimeではちと待たされる。
debian:tmp$ ps a | grep sbcl 11738 pts/2 Sl+ 0:00 /home/sakae/.roswell/impls/x86/linux/sbcl-bin/1.5.9/bin/sbcl --core /home/sakae/.roswell/impls/x86/linux/sbcl-bin/1.5.9/dump/lem-ncurses.core --noinform --no-sysinit --no-userinit --disable-debugger --eval (progn #-ros.init(cl:load "/usr/local/etc/roswell/init.lisp")) --eval (ros:run '((:eval"(ros:quicklisp)")(:script "/home/sakae/.roswell/bin/lem-ncurses""har.lisp")(:quit ()))) 11830 pts/2 Sl 0:01 /home/sakae/.roswell/impls/x86/linux/sbcl-bin/1.5.9/bin/sbcl --core /home/sakae/.roswell/impls/x86/linux/sbcl-bin/1.5.9/lib/sbcl/sbcl.core --noinform --no-sysinit --no-userinit --eval (progn #-ros.init(cl:load "/usr/local/etc/roswell/init.lisp")) --eval (ros:run '((:eval"(ros:quicklisp)")(:system "swank")))
やっぱり、coreを呼び戻している。pid 11738がクライアントで、pid 11830がサーバーになってる。
debian:tmp$ lsof -p 11738 : sbcl 11738 sakae 0u CHR 136,2 0t0 5 /dev/pts/2 sbcl 11738 sakae 1u CHR 136,2 0t0 5 /dev/pts/2 sbcl 11738 sakae 2u CHR 136,2 0t0 5 /dev/pts/2 sbcl 11738 sakae 3u CHR 5,0 0t0 7457 /dev/tty sbcl 11738 sakae 4r REG 8,1 662 8399863 /home/sakae/.roswell/bin/lem-ncurses sbcl 11738 sakae 5r FIFO 0,12 0t0 82127 pipe sbcl 11738 sakae 6u IPv4 81587 0t0 TCP localhost:53124->localhost:57328 (ESTABLISHED) sbcl 11738 sakae 7u IPv4 81589 0t0 TCP localhost:57328->localhost:53124 (ESTABLISHED) sbcl 11738 sakae 8w FIFO 0,12 0t0 82127 pipe sbcl 11738 sakae 9u IPv4 82166 0t0 TCP localhost:39182->localhost:4005 (ESTABLISHED)
TCPの相互接続は分かるんだけど、サーバーの4005へ向けた接続って、昔々のslimeの名残なんかな? 以前に培った、盗聴技術を駆使してスパイしてみるかな。
C-x C-b
%- har.lisp /home/sakae/har.lisp %% *Buffer Menu* NIL %- *lisp-repl* NIL -- *tmp* NIL %- *Messages* NIL
NILって、やる気がNILなんかな? ああ、違ったFileにbindされていないだけだった。とんだ早とちり。
一つ、気にいらない事が有る。Windows10側からputtyな端末でloginしてるんだけど、lemのstatus行と言うかmode行に背景色が付かないんだ。勿論、debianのDesktop上で使う端末では、色が付く。灰色ぽい背景色。
常用はputtyなんで、何とかしたい。その前に他のOSでも使えるかだな。debianしか使えなかったなんて事だと、そんなの棄てるしかないからね。
lem on CentOS
と言う事で、CentOSで試してみます。roswellがちゃんとインストール出来るかが鍵と思うよ。
Building from Source(On Debian/Ubuntu, in a nutshell)とかの解説しか無い。それ以外のlinux使いはlemなんて言うとんがった奴は使わんで宜しいって事なんだな。
sudo apt-get -y install git build-essential automake libcurl4-openssl-dev
これをCentOS用に読み替えればいいんだな。automake libcurl-devel が新規っぽいので入れた。また、先人の話では、ncursesのv5とv6が有るんだけど、v6はトラブルの元になるんで避けるようにとの事。調べたら両方入ってた。でも、いじわる対策で、 ncurses-develも先回りして入れた。これで準備万端。
すんなりインストール出来て、lemも無事に動いた。
で、問題のモードラインの背景抜けは、当然の事ながら発生する。ぐぐったら、 lemの設定についてメモ書き なんてのが出て来た。~/.lemrc に、設定をごにょごにょと書いて行くらしい。
カラーのテーマとな。どうやらデフォのemacs-darkってのが有って、それを継承するとな。 でも、モードラインの場合は? 言及されていないって事は、オイラーみたいな使い方をしてないって事だな。emacs-darkを手掛かりに、ソースを探れ。どうせCL語で書いてあるっしょ。
/home/sakae/.roswell/local-projects/cxxxr/lem/lib/core/color-theme.lisp
(define-color-theme "emacs-light" () (display-background-mode :light) ;; (foreground "#000000") ;; (background "#FFFFFF") (minibuffer-prompt-attribute :foreground "blue" :bold-p t) (region :foreground nil :background "#eedc82") (modeline :background "#666666" :foreground "white") : (define-color-theme "emacs-dark" ("emacs-light") (display-background-mode :dark) :
modelineは、emacs-light側にしか設定が無い。しかも背景は直値の設定になってる。 M-x load-themeでテーマを切り替えられるんだけど、どちらを選んでも、同じ設定が採用される。多分、puttyは直値の表現を受け付けられないので、無視しちゃうんだろうね。
color.lispにXorg公認の色名が有ったから、それを使えば間違い無いだろう。
で、そんな設定を書いたんだけど、さっぱり反映されない。何処かで間違っている? 疑心暗鬼。M-x lisp-load-file で、強引に読み込んであげると、ちゃんと色が付く。
さて、initファイルの読み込みに優先順位が有るのでは? そんな細かい事はソース嫁だろうね。
lem/lib/core/init.lisp
(in-package :lem) (defun load-init-file () (flet ((test (path) (when (probe-file path) (load path) (message "Load file: ~a" path) t))) (let ((home (user-homedir-pathname)) (*package* (find-package :lem-user))) (or (test (merge-pathnames "init.lisp" (lem-home))) (test (merge-pathnames ".lemrc" home))))))
ふむ、init.lispが有ったらそちらを優先して、満足しちゃう設定なのね。r7rs系を、~/.lem/init.lispに書いていたんで、効果が.lemrcまで届かなかった訳だね。
(base) [sakae@c8 ~]$ cat ~/.lem/init.lisp ;;(setf (variable-value 'lem.line-numbers:line-numbers :global) t) (define-color-theme "my-theme" ("emacs-dark") (modeline :background "dark gray" :foreground "black")) (load-theme "my-theme") (setf lem-scheme-mode:*scheme-swank-server-run-command* '("gosh" "-A/home/sakae/.lem/r7rs-swank-Gauche-custom" "-e(begin (import (gauche-swank)) (start-swank ,port))"))
今後の事も有るんで、設定は全て init.lisp にまとめる事にした。その方が混乱無いよね。
思い出した、以前 TeraTermを使った時、やはりmodelineの背景が抜けていた。上記の設定を施すようにしたら、ちゃんと背景が出てきた。TeraTermってMetaキーが初期設定ではOFFになってるのね。設定のキーボードの所でONにしておこう。これでputtyの代わりを務められるな。
所でlemの作者さんは、cxxxr とlisp屋さんらしい名前で出てる。xxxの所に何を入れるのがお好み? 聞いてみたい。caddr ? cdadr ?
https://g000001.cddddr.org/ さんなら知ってる? gsym1番とは()いいな。ああ、勿論()は、かっこいいと呼びます。決して、カッコ、コッカと発音しないで下さい。
I want dired in lem
lemにemacsのdired(みたいなの)が無いのかなあ。オイラーの場合、emacsを使ってる時間の95%はdiredのお世話になってるからね。dirを辿って行ってファイルの閲覧。putty上でこれをやるには、diredに限る。
contribにfbarってやつが登録されてた。残念ながら非常に使いづらい。期待したrosから探してみようとしたが、rosはそんな方向に向いていない。オイラー的にはpythonで言うpipと思っていたんだけどね。どうやら、penvって方向みたいだ。
んな訳で、何でも有るpythonで言うanacondaの役割をlemに求めた訳だ。emacsは正に文字文化のanacondaだからね。(最近は、イメージも処理出来ますとか、道を踏み外してる気がしないでもないけど)
で、世に問うてみた。lem用のファイルブラウザーは無いかと。 そしたら、噂をすれば影じゃないけど、
重鎮に出会ってしまったぞ。この記事、面白いんで、ふむふむと頷きながら読んでますよ。(これも、道を踏み外していると言うか、道草してると言うか。。)
それにしてもlemの開発者って、人のソースには目もくれず、ガシガシとコードを書く人の集まりなんだな。
素人の要望も聞いてよね。素人ついでに、lemの由来を想像してみる。 これはもう、Lisp EMacs から取ったに違いない。
まて、emacsもelispから出来ているぞ。でも、elispには裏表が有るんよ。肝心な部分はC語崩れのlisp風に書かれた暗号(みたいなもの)だからね。
その点、lemには裏表が無いぞ。全部commonlispで書いてあるからね。読む苦労は雲泥の差になって現れます。
だったら、欲しい機能を自分で作れ。ごもっともです。fbarを土台にminiDiredを書けよ。
directory-mode
幾らなんでも、dirを巡ってファイルを見るなんて、基本中の基本だ。気を取り直してソースをぐぐってみた。
lem/lib/core/directory-mode.lisp
(define-key *directory-mode-keymap* "q" 'quit-window) (define-key *directory-mode-keymap* "g" 'directory-mode-update-buffer) (define-key *directory-mode-keymap* "^" 'directory-mode-up-directory) (define-key *directory-mode-keymap* "Return" 'directory-mode-find-file) (define-key *directory-mode-keymap* "Space" 'directory-mode-read-file) (define-key *directory-mode-keymap* "o" 'directory-mode-find-file-other-window) (define-key *directory-mode-keymap* "n" 'directory-mode-next-line) (define-key *directory-mode-keymap* "p" 'directory-mode-previous-line) (define-key *directory-mode-keymap* "m" 'directory-mode-mark-and-next-line) (define-key *directory-mode-keymap* "u" 'directory-mode-unmark-and-next-line) :
慣れるまで大変そう。