xyzzy

2点を通る直線、直線と点の距離

(defun def-line (p1 p2) "2点を通る直線を定義する。 2点 p1(x1 y1) p2(x2 y2) が与えられたとき、ax + by + c = 0 を満たす(a b c)を返す。" (let ((x1 (car p1)) (y1 (cadr p1)) (x2 (car p2)) (y2 (cadr p2))) (list (- y2 y1) (- x1 x2) (- (* x2 y1) (…

文字列から数字だけ抽出する

(defun nums-string (str) (let ((s 0) res) (while (setq s (string-match "[0-9]+" str s)) (push (parse-integer (match-string 0)) res) (incf s (length (match-string 0)))) res)) (nums-string (get-clipboard-data))

前後の日付を挿入

メモ帳みたいにF5で日付を入れられるようにしている。ただ、それだけだとメモ帳と大差ないので、universal-argumentで前後の日付も入れられるようにしてみた。日記を付けるときに便利。 (defun insert-date (&optional rel-day) "時刻を挿入" (interactive "…

hsp-mode lapse001リリース!

以前、hsp-modeを配布していた方がいたようだが、既に情報も少なかったので自前で作ってみた。 配布は今まで通りpackage.lで行っている。 とりあえず必要そうな機能は付けてみたので、xyzzyを使っているのにHSPを書く奇特な方や、HSPを書いているけれど、HSE…

やったー、肉抜きできたよー。

元マクロ:普通のタイマー - 象徴ヶ淵 (defmacro counter-default (slots resets &optional (defaults nil sv)) (let ((f (lambda (l l2 &optional l3) `(if (null ,(car l)) (if (or ,@(cdr l)) (setq ,(car l) ,(car l2)) ,(if l3 `(setq ,(car l) ,(car l…

データ解析作業のためのlisp

データ解析の一般的な流れは知らないが、xyzzyのlisp-interaction-modeで次のように作業している。 データを読み込む データを操作して特徴量などを計算し、変数に記録する 計算した結果を比較したりプロットしたりする 時間のかかる計算でも、結果を保存し…

max min にkeyがない件

sortとかfindにはkeyが付き物なのに、なんでmax minは数値にしか対応していないのか。大体全然汎用性がないじゃん、と思った。このくらい無いわけがないが、探すのも面倒なので書いた。 (defun most (sequence predicate &key (key 'identity)) (let ((res (…

タブ幅より長い項目を詰めたい

何かデータを出力するとき、見やすいように整形して出力するのは割と面倒である。 タブはその手間を軽減してくれるが、タブより長い項目があると表示が崩れて読みにくい。 そこで、たまに長いデータが入るような表を簡単に見やすくするために、タブ幅より長…

独自マクロを気兼ねなく使う

リーダマクロは他に与える影響が大きいので、エディタのスクリプトとして動いているxyzzy上では使いにくい。 しかし、使わないのではもったいないので、うまく使う方法を考える。 リーダは*readtable*に定義されているので、自分のコードを読み込むときだけ*…

「息吹」lapse00B

天狼で適当に設定したシフト側の挙動が気に入ったので、xyzzy側にも反映。大体wwwを入力するのに使う。 せっかくなので、気になっていた配置の記述方法や読み込み方法、入力の逆引き方法も修正した。 結果、読み込みが非常に速くなった。微妙にもたついて…

登録したファイルを開く

F1を押したら.xyzzyを開いて、F2を押したらメモを開いて……、と設定しておくと便利である。でも、ファイル1つ1つにコマンドを作っては芸がない。ということで、次のコマンドを書いてみた。 (defvar *favorite* '((#\F1 "~/.xyzzy") (#\F2 "~/memo"))) (defun …

ウィンドウサイズを複数パターン記憶できたら便利だよね。

; > xyzzy の音 - バッファ/ウィンドウ/フレーム ; > http://hie.s64.xrea.com/xyzzy/note/buffer.html#xyzzy-resize ; > xyzzy Part6 212 あたりからを参考に。 ; を改造。パターン記録して呼び出す方式に。 (provide "window-resize") (in-package "editor…

漢字直接入力「息吹」練習スクリプト

今までコマンドをM-xから呼び出していたのを、他の人にも多少は使いやすいようにモジュール化してみた。 モジュールは例によってnetinstallerからインストールできるようにしてある。 自分としても作業手順を一本化できたので、手間を削減できた気がする。 …

漢字直接入力「息吹」 lapse 008

004以降uploadしていなかったので、久々の更新である。 例によって、xyzzy上でnetinstallerからインストールできるようにしてある。 今回は、コンセプトは変わらないものの、配置は全く別物になっている。 以前の配列はもう覚えていないけれど、「息吹」で練…

戦闘モジュール3

忙しいのですごく簡単なスクリプトを書いてみる。行動順、回避、技などを考えなければ非常に楽である。 同じようなのを作ったのは2年以上前になるのか・・・月日が経つのは早い。 ゾークとローグのあいのこみたいなのを作りたいのだが、まずはこのくらい単純…

edict-lookup-selectionの挙動を変更する

xyzzyではC-c eなどでキャレット位置の単語で辞書を引けるのだが、その挙動がやや不満である。 というのも、単語の一番後ろにキャレットがあると、次の単語で調べてしまうのだ。 ちょっと調べるときに、単語を入力して検索、とやると別の単語が出てきてイラ…

cc-modeでmakeを呼び出す

コマンドってなかったっけ。いちいちC-x & makeって打つの面倒だし。 (add-hook '*c++-mode-hook* 'cc-init) (define-key ed::*c++-mode-map* '(#\C-c #\C-c) 'c-call-make) (define-key ed::*c++-mode-map* '(#\C-c #\C-m) 'c-call-make-bind) (defun cc-in…

2次割り当て問題の解を評価する(2)

というわけで、評価関数をc++で書くことにした。適当に書いて100000回計算させて360ms。xyzzy上での344倍の速度である。ここまで差があると、xyzzy上で走らせるのはもったいない・・・。 しかし、探索アルゴリズムをlispで試したい。そこで、c++でdllを作っ…

人材獲得作戦・試験問題を解いてみた

ネタ元は人材獲得作戦・4 試験問題ほか: 人生を書き換える者すらいた。 単純な経路探索なので、コピペすれば10分もかからないだろうが、なんとなく解いてみた。時間は記事を読み始めてから85分ほどかかった。ただし、xyzzy上で動くプログラムなので、要求は…

エラー。

珍しくエラーを吐いたのでメモ。 (defun xn () (let ((tb (make-hash-table))) (dotimes (a 10000 tb) ; (do-events) ;これが必要。 (let* ((p (f)) (n (gethash p tb))) (setf (gethash p tb) (if n (1+ n) 1)))))) (defun f () (let ((p 0)) (dotimes (- 2…

format慣らし。

「息吹」の辞書を、JIS X 208を止めて、頻度を元にして並び替えることにした。2打鍵字とは独立して、3打鍵字と4打鍵字を頻度を元に選択する。選択するのは良いのだが、これを辞書の形式に合わせて 亜唖阿哀愛挨逢葵茜悪握旭芦鯵梓圧扱宛姐飴絢綾鮎或粟安…

漢字直接入力「息吹」

文字を1文字辺り平均何打鍵で打てるかは、その文字の情報量から求めることが出来る。情報量のbit数を求めて、基数を使うキーの数に置き換えれば良い。これは、最初からその基数で情報量を求めるのと等しいので、その方法で情報量を求めると、次の通りになる…

deform

let* let labels macrolet は使用頻度が高く、組み合わせて使うことも多い。すると、必然的に入れ子になり、自然にインデントを行うとインデント量が大きくなる。これは見づらいということで、入れ子を解消する書き方を考えてみた。 これらの関数(マクロ、…

closed-let

letで束縛された変数は外からは見えないが、関数を介してアクセスすることが出来る。定義されたときの変数を参照するのがレキシカルクロージャの特徴である。 (defun f1 () (let ((foo 100)) (values (lambda (n) (+ foo n)) (* foo foo)))) (f1) | #<lexical-closure: (anonymous)> 10000 </lexical-closure:>…

リージョンコマンド

リージョンに関するコマンドは色々ある。それらはばらばら、ってわけでもないが、色々なキーにちりばめてバインドされている。バインドされてないものもある。ここでもキーが足りない! と思うわけで、リージョン操作を一手に引き受けるコマンドを作ろう。 …

もっと便利なマーカが欲しい。

標準のマーカは各バッファに1つずつついてるのだが、現在の位置に他の位置からコピペしたいときは結構面倒くさい。コピーにマーカを使ってしまうため、セレクションを使うか、自力で戻らなくてはならない。グローバルマーカやレジスタもあるが、妙に使い勝手…

子を生むクロージャ

LOLでlabelsを使ったクロージャが紹介されている(On Lispから借りている)。ごく簡単に端折って書くと (defun f1 () (labels ((foo () 'bar)) #'foo)) (f1) | #<lexical-closure: (anonymous)> このようにlabelsで定義した関数を取り出すことができる。これはlabels内で定義された他の関数も</lexical-closure:>…

普通のタイマー

xyzzyにはタイマー機能がある。javascriptのsetInterval()と同じようなもので、次のように書ける。 ;一回のみ (start-timer 1 'ding t) ;繰り返し (progn (start-timer 0.5 'ding) (start-timer 0.6 'ding) (start-timer 0.7 'ding) (start-timer 0.8 'ding)…

関数の挙動を調べたい

xyzzyにはデバッグのためにstack-traceとstepが用意されている。ところが、これらの関数・マクロの使い方がよくわからない。 (stack-trace) >CALL STACK 9: (stack-trace) >CALL STACK 8: (eval (stack-trace)) >CALL STACK 7: (system:*byte-code ...) >CAL…

ファイル毎にバッファの色を変更する

前からそのようなスクリプトを使っていたのだが、set-buffer-colorsはベクタで指定するため、変更したいところの前に変更したくない箇所があっても、配列を埋める必要があって面倒だった。 そこで、色を個別に指定できる形式で書いてみた。xyzzyはなぜかバッ…