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\\}\\)
といった感じに書かないといかんらしい。つまり、
\( \) \{ \}
は、
\\( \\) \\{ \\}
と書くことになるようで。最初、そのことが分からなくて、「変だなー。マッチしないなー」と悩んでしまった…。
◎ 参考ページ。 :
[ ツッコむ ]
以上です。