mieki256's diary



2018/03/06(火) [n年前の日記]

#2 [xyzzy] xyzzyのlispを少し勉強

この日記ページを書く際には、xyzzy というEmacs系のエディタを使っているのだけど。時々、同じような編集作業をする時があるので、多少自動化できないかと xyzzy の 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を変更したいけどやり方が分からず。 :

以下のような記述があったとして。
 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 ",") で挿入していけばなんとかなるかも。

以上です。

過去ログ表示

Prev - 2018/03 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project