昨日の @Fenril058 さんの記事に触発されて。
マイ「文字系便利関数」2題
先日のフォントの記事でもちょっと書きましたが、結構いろんな文字を扱うことが多く、文字に関する関数を色々書いてますので、ちょっと投下してみます。
ただ、かなり昔に書いてinit.el
の底に沈んでるやつをドブ浚いしたものですので、コードの品質についてはご容赦くださいw
長年使い倒してるものなので、多分バグとかはないと思いますけど。
文字の素性を出す
「今コピペした文字って何者?」みたいな場面によく出くわすので、こういう関数を書きました。
(defun my:split-char-at-point ()
"Analyse character at the point."
(interactive)
(let ((ch (char-after (point))) s u u8 spec cs cp
(number-to-hex2 (lambda (c) (format "%02x" c)))
(number-to-oct (lambda (c) (format "0%o" c))))
(when ch
(if (>= ch 32)
(setq s (char-to-string ch)))
(setq u (encode-char ch 'ucs))
(setq u8 (mapcar 'string-to-char
(split-string (encode-coding-char ch 'utf-8) "" t)))
(setq spec (split-char ch))
(setq cs (car spec) cp (cdr spec)))
(message
"%s[%s]:%s%s%s"
(if ch (number-to-string ch) "--")
(if s s "--")
(if u (format " u%04x(%d)" u u) "")
(if u8 (format " utf8=0x%s" (mapconcat number-to-hex2 u8 "")) "")
(if cp (format " %s=0x%s(%s/%s)"
(symbol-name cs)
(mapconcat number-to-hex2 cp "")
(mapconcat 'number-to-string cp "-")
(mapconcat number-to-oct cp "-")) ""))))
適当なキーにバインドすると、押した際にカーソル位置の文字の内部コード、Unicodeと、ローカル文字セットでのコードがわかります。
なぜかエラーになる入力文字列が、半角の長音文字使ってるせいだ、みたいなのは一瞬でわかります1。
実体参照に展開する
どこかからコピペした「なぜか入力できない文字」を、HTMLの実体参照に展開してくれます。
リージョン指定があればリージョン内、なければカーソル位置のワードが対象となります。
誤爆すると怖いですが、まぁアンドゥくらいできますよね、という前提2でお願いします。
(defun my:charref-expand-region-or-word (arg)
"Expand the current region, or the word at the point if the mark is not active, to the sequence of numeric characters references."
(interactive "P")
(let (beg end ch subst)
(cond
((and transient-mark-mode mark-active)
(setq beg (region-beginning) end (region-end)))
(t
(save-excursion
(backward-word) (setq beg (point)) (forward-word) (setq end (point)))))
(goto-char beg)
(while (< (point) end)
(setq ch (char-after (point)))
(when ch
(if (>= ch 32)
(setq subst (concat subst (format "&#%d;" (encode-char ch 'ucs))))
(setq subst (concat subst (char-to-string ch)))))
(forward-char))
(goto-char beg)
(delete-region beg end)
(insert subst)))