2018/03/07(水) [n年前の日記]
#1 [xyzzy] xyzzy のlispについてまだ勉強中
リンクのURLを変換する処理について、まだ試行錯誤中。
例としては…。以下のような記述があったとして。
以下のように変更したい。
一応、こんな感じかなと。
別のやり方も試してみたり。looking-at で探す際にグルーピングをしておいて、後で特定のフォーマットに並び替えて挿入。
正規表現のグルーピングを使うところでちょっとハマった。例えば、M-x replace-regexp などを使うときは、
つまり、
例としては…。以下のような記述があったとして。
LINK http://hogefuga/~piyo/diary/201312203.html#201312203 piyo's diary - 記事名
以下のように変更したい。
LINK #{2013,12,20,3} piyo's diary - 記事名
一応、こんな感じかなと。
(defun change-hnf-link-uri () (interactive) (if (looking-at "^LINK http://keroro/.+#") (progn (delete-region (match-beginning 0) (match-end 0)) (goto-bol) (insert "LINK #{") (forward-char 4) (insert ",") (forward-char 2) (insert ",") (forward-char 2) (insert ",") (forward-char 1) (insert "}")))) (define-key *hnf-mode-map* '(#\C-c #\C-k) 'change-hnf-link-uri)
- 余分な部分を looking-at で探して、
- delete-region で削除して、
- カーソルを (forward-char n) で移動して、
- (insert ",") で文字を挿入
別のやり方も試してみたり。looking-at で探す際にグルーピングをしておいて、後で特定のフォーマットに並び替えて挿入。
;; 別のやり方 (defun change-hnf-link-uri-b () (interactive) (if (looking-at "^LINK http://keroro/.+#") (progn (delete-region (match-beginning 0) (match-end 0)) (goto-bol) (if (looking-at "^\\([0-9]\\{4\\}\\)\\([0-9]\\{2\\}\\)\\([0-9]\\{2\\}\\)\\([0-9]+\\)S\\([0-9]+\\)") (let ((yyyy (match-string 1)) (mm (match-string 2)) (dd (match-string 3)) (xx (match-string 4)) (yy (match-string 5))) (delete-region (match-beginning 0) (match-end 0)) (goto-bol) (insert (format nil "LINK #{~A,~A,~A,~A,~A}" yyyy mm dd xx yy))) (if (looking-at "^\\([0-9]\\{4\\}\\)\\([0-9]\\{2\\}\\)\\([0-9]\\{2\\}\\)\\([0-9]+\\)") (let ((y (match-string 1)) (m (match-string 2)) (d (match-string 3)) (s (match-string 4))) (delete-region (match-beginning 0) (match-end 0)) (goto-bol) (insert (format nil "LINK #{~A,~A,~A,~A}" y m d s))) )))))
- (match-string n) で、グルーピングしたn番目の文字列を取得できる。
- (let ((変数名 値)) 〜) を使うと、変数が利用できる。
- (format nil "~A" 変数) で、sprintf() みたいなことができる。
正規表現のグルーピングを使うところでちょっとハマった。例えば、M-x replace-regexp などを使うときは、
\([0-9]\{4\}\)みたいな書き方でいいのだけど。lispスクリプト(?)内に正規表現を書く際は、
\\([0-9]\\{4\\}\\)といった感じに書かないといかんらしい。
つまり、
\( \) \{ \}は、
\\( \\) \\{ \\}と書くことになるようで。最初、そのことが分からなくて、「変だなー。マッチしないなー」と悩んでしまった…。
◎ 参考ページ。 :
[ ツッコむ ]
以上です。