Elisp

pangu-spacing.el : 全角と半角の間に自動でスペースを入れる

上記の Tipsを参考にして、markdown-modeに導入してみた。

日本語においては、いわゆる半角文字と全角文字の間にスペースを入れた方が見やすいと言われていて、pangu-spacing.el はそれを自動で行ってくれるというものです。

ただ、「Google日本語入力」などと書くときに「Google 日本語入力」ではおかしくなるし、なんとなく間延びした感じになるのが好みではなかったので アルファベット文字列の右端だけにスペースが入るようにカスタマイズした。

pangu-spacing.elのコードを見るとデフォルトでは、正規表現で [a-zA-Z0-9] なっているので半角数字の場合にも同様に処理されてしまう。 数字にも半角スペースが有効になると、[2021 年 11 月 16 日] という感じになるので、日付表示のケースでは面白くない。 そこで、正規表現の記述を [a-zA-Z] に変更して半角数字は対象外としアルファベットのみが pangu-spacingの対象となるようにしている。

(leaf pangu-spacing
  :ensure t
  :hook ((markdown-mode-hook text-mode-hook) . pangu-spacing-mode)
  :config
  (setq pangu-spacing-real-insert-separtor t)
  (setq pangu-spacing-include-regexp
		(rx (or (and (or (group-n 3 (any "。,!?;:「」()、"))
						 (group-n 1 (or (category japanese))))))
			(group-n 2 (in "a-zA-Z")))))

上記の例では、markdown-mode と text-modeに導入している。

ac-mozc : モードレス日本語入力を試してみた

随分前に一度試してみたが、mozc.elと併用する時に若干変換ルールに違いがあって使いにくく、そのうち使わなくなっていた。 その後、elispの勉強も進み Emacsのスキルも多少向上したので、再度工夫して試してみることにした。

mozc.el導入時には、ローマ字テーブルに azik を使っていたが、これが曲者だということに最近気づいた。結局、標準の mozc.elの romotableを使って、azikのうち手慣れたものだけ追加して試してみたところ、快適に使えるようになったので備忘録に残しておくことにした。

アルファベットと日本語との間に半角スペースを空けるかどうかについては諸論あるけれど、見やすさを優先した。

pangu-spacing.elというパッケージを使うときは自動的に処理してくれるのでいのだけれど、数字にも反応するので日付表示のときはどうにも間の抜けた感じになる。 なので数字には対応させないようにした。

使ってみた感想

スムーズに変換できているときにはとても効率がいいのだけれど、一度ミスタイプになったものを修正しようとするとおかしな変換になるときがあり、 修正するときは mozc-modeにして対応するということが多い。結局、どちらが快適という点はよくわからない。

変換スピードがもう少し改善されたら更に使いやすくなると思うので、誰か companyと連携した ac-mozc作ってくれないかしらと思う。

 ;; ac-mozc with extended auto-complete
  (leaf auto-complete
	:ensure t
	:bind (:ac-completing-map
		   ("<tab>" . ac-next)
		   ("<backtab>" . ac-previous))
	:hook ((text-mode-hook markdown-mode-hook) . auto-complete-mode)
	:custom (ac-comphist-file . "~/.emacs.d/tmp/ac-comphist.dat")
	:config
	(leaf ac-mozc
	  :ensure t
	  :hook ((text-mode-hook markdown-mode-hook) . my-ac-mozc-setup)
	  :config
	  (add-to-list 'ac-modes '(text-mode . markdown-mode))
	  (bind-key* "<henkan>" 'ac-complete-mozc ac-mode-map)
	  (defun my-ac-mozc-setup ()
		(setq ac-sources
			  '(ac-source-mozc ac-source-ascii-words-in-same-mode-buffers))
		(set (make-local-variable 'ac-auto-show-menu) 0.2)))
	;; auto add space between Japanese and English characters.
	(leaf pangu-spacing
	  :ensure t
	  :hook (markdown-mode-hook . pangu-spacing-mode)
	  :custom (pangu-spacing-real-insert-separtor . t)))

Emacs : Open Last Closed Buffer

darkroom-modeを使うときは、Syntax Highlightが邪魔なので、どのモードのファイルであっても強制的に text-modeで開くように設定している。 当然ながら darkuroom-modeから抜けるときにはもとのモードに戻す必要がある。

もとの major-modeを記憶させておいて restoreすればいいのだが、 auto-save-buffers-enhanced で自動保存しているので、回りくどいことをしなくても一度 Kill-bufferして再び読み込めばよい。

いろいろググって下記の Tipsを見つけた。

原案では、多機能で長いコードになっていましたが、私には必要のない部分は削って dietしました。

;; Open last closed file
(defvar my:recently-closed-buffers nil)

(defun my:close-current-buffer ()
  "Close the current buffer."
  (interactive)
  (setq my:recently-closed-buffers
		(cons (cons (buffer-name) (buffer-file-name)) my:recently-closed-buffers))
  (kill-buffer (current-buffer)))

(defun my:open-last-closed ()
  "Open the last closed file."
  (interactive)
  (find-file (cdr (pop my:recently-closed-buffers))))

ようは、kill-buffer の代りに my:close-current-buffer を使い、再読込したいときに my:open-last-closed すればよいことになる。

darkroom-modeの in/out 設定は以下のようになった。

(leaf darkroom
  :ensure t
  :bind ("<f12>" . my:darkroom-in)
  :config
  (bind-key "<f12>" 'my:darkroom-out darkroom-mode-map)

  (defun my:darkroom-in ()
	(interactive)
	(display-line-numbers-mode 0)
	(setq line-spacing 0.4)
	(darkroom-tentative-mode 1))


  (defun my:darkroom-out ()
	(interactive)
	(darkroom-tentative-mode 0)
	(setq line-spacing 0.1)
	(display-line-numbers-mode 1)
	(my:close-current-buffer)
	(my:open-last-closed)))

つまり、darkroom-outのとき、一度 bufferを閉じて(kill-buffer)、再度読み込むという処理をしているわけである。

ある文字で始まっている行を一度に複数削除する方法:Emacs

バッファ(ファイル)の先頭にカーソルを移動し

M-x delete-matching-lines

でミニバッファーに正規表現入力を求められるので、下記のように入力してエンターすると消すことが出来る。

^あ

(「あ」は消したい文字)

^は正規表現で文章の先頭を示すので、その正規表現が一致する行が全て削除されます。

同様にdelete-non-matching-linesで一致しないものを消すことも出来る。

正規表現を工夫すれば、種々のパターンで応用できる。