2018/03/06(火) [n年前の日記]
#2 [xyzzy] xyzzyのlispを少し勉強
この日記ページを書く際には、xyzzy というEmacs系のエディタを使っているのだけど。時々、同じような編集作業をする時があるので、多少自動化できないかと xyzzy の lisp についてググって勉強してみたり。
◎ リンクの記述を変更する関数。 :
以下のような行があったとして。
上記の記述を、以下のように変更したい。
そういう処理をする関数を書いてみたり。
lisp の達人が見たらゲロを吐きそうなソレだろうけど…目的が果たせそうだから、これでいいや…。
少し説明すると…。
正規表現をテストして遊ぶ (xyzzy[しょぼしょぼすくりぷと]) http://edutainment-fun.com/script/xyzzy/tips/regular.html
上記の記述を、以下のように変更したい。
LINK http://edutainment-fun.com/script/xyzzy/tips/regular.html 正規表現をテストして遊ぶ (xyzzy[しょぼしょぼすくりぷと])
そういう処理をする関数を書いてみたり。
(defun transpose-hnf-link () (interactive) (progn (goto-bol) (forward-line) (transpose-lines) (backward-line 2) (goto-eol) (insert " ") (delete-char) (goto-bol) (insert "LINK ") (goto-bol) (forward-line))) (define-key *hnf-mode-map* '(#\C-c #\k) 'transpose-hnf-link)
lisp の達人が見たらゲロを吐きそうなソレだろうけど…目的が果たせそうだから、これでいいや…。
少し説明すると…。
- 関数を作る時は、(defun hoge () 〜 ) と書く。
- (interactive) と書いておくと、「この関数はコマンドだよ」「M-x 関数名で呼び出せるよ」という意味になる。
- (progn 〜 ) と書いておくと、上から順々に処理をしてくれる。
- (goto-bol) で行頭に、(goto-eol) で行末に、カーソルが移動する。
- (forward-line) で、1行下に、(backward-line)で、1行上に、カーソルが移動する。
- (forward-line n) (backward-line n) で、n行下、n行上に、カーソルが移動する。
- (transpose-lines) で、現在行と一行上を入れ替える。カーソルは、現在行の1つ下に移動する。
- (insert "hoge") で、現在のカーソル位置に hoge という文字列を挿入できる。
- (delete-char) で、現在のカーソル位置で、1文字削除できる。Deleteキーを押した時と同じ動作、だろうか。
- (define-key *hoge-mode-map* '(#\C-c #\k) 'fuga-func) で、ショートカットキーが設定できる。この場合は、「hoge-mode 時に、C-c k のキー入力で fuga-func を呼び出せ」という設定になる。
◎ リンクURLを変更したいけどやり方が分からず。 :
以下のような記述があったとして。
以下のように変更したい。
しかし、やり方が分からない。
正規表現を使えば、該当文字列にマッチさせることはできそう。
ただ、xyzzy の lisp から、それを呼び出す方法が分からない…。
余分な部分を削除するだけなら、以下のような感じだろうか…。
待てよ? 余分な部分を削除できたら、後は「{」「,」「}」を挿入していくだけなのでは…。(forward-char n) で、カーソルをn文字右に移動して、(insert ",") で挿入していけばなんとかなるかも。
LINK http://hogefuga/~piyo/diary/201312203.html#201312203 piyo's diary - 記事名
以下のように変更したい。
LINK #{2013,12,20,3} piyo's diary - 記事名
しかし、やり方が分からない。
正規表現を使えば、該当文字列にマッチさせることはできそう。
M-x query-replace-regexp Query repla regexp: ^LINK http:///hogefuga/.+# With: LINK #
ただ、xyzzy の lisp から、それを呼び出す方法が分からない…。
余分な部分を削除するだけなら、以下のような感じだろうか…。
(defun change-hnf-link-uri () (interactive) (if (looking-at "^LINK http://hogefuga/.+#") (progn (delete-region (match-beginning 0) (match-end 0)) (goto-bol) (insert "LINK #"))))
- (if a b) で、a が t なら、b を実行。
- (looking-at "正規表現") で、正規表現とマッチするか場所があるかを調べられる。マッチしたら t、しなかったら nil が返る。
- (delete-region A B) で、A から B までの範囲を削除。
- (match-beginning 0) で、正規表現に一致した場所の先頭を、(match-end 0) で、正規表現に一致した場所の末尾を取得。
待てよ? 余分な部分を削除できたら、後は「{」「,」「}」を挿入していくだけなのでは…。(forward-char n) で、カーソルをn文字右に移動して、(insert ",") で挿入していけばなんとかなるかも。
[ ツッコむ ]
以上です。