Emacs Lisp 超初心者がコマンドを作ってみる 〜 一応できたカナ 〜

前回までで一応動いたのですが、まだ C-M-c 、 C-M-c と 2回キーインして対象 region を確定しなければなりません。

微妙にめんどくさいので不要にしてみました。

実行結果は前回の最後と一緒なので割愛させていただきます(ediffの画面になる)

# ediff-regions-wordwise → ediff-regions-internal
内部でリージョン確定動作が必要な ediff-regions-wordwize の代わりに ediff-regions-internal を使います。 beg-A end-A beg-B end-B はそれぞれのバッファを処理する時にセットしたものを使います。 それ以外のパラメータは ediff-regions-wordwise 自身の中で ediff-regions-internal を呼び出しているのでそのパラメータをそのまま持ってきています。

````elisp
    ;; run ediff
    (ediff-regions-internal
     (get-buffer po-ediff-previous-msgid-buffer-a-name)
     beg-A end-A
     (get-buffer po-ediff-previous-msgid-buffer-b-name)
     beg-B end-B
     nil 'ediff-regions-wordwise 'word-mode nil)
````





# プログラム

````elisp:po-ediff-previous-msgid.el
;;; po-ediff-previous-msgid.el --- ediff previous-msgid and msgid.
;;; Author: kuma35
;;; Created: 2024/12/18
;;; Commentary:
;; previous msgid is  '#|' marked in comment.
;;; Code:

(defcustom po-ediff-previous-msgid-buffer-a-name "*pepm-previous-msgid*"
  "'po-ediff-previous-msgid' BUFFER A name.  pepm is PoEdiffPreviousMsgid."
  :type 'string
  :require 'po-mode
  :group 'po)

(defcustom po-ediff-previous-msgid-buffer-b-name "*pepm-now-msgid*"
  "'po-ediff-previous-msgid' BUFFER A name.  pepm is PoEdiffPreviousMsgid."
  :type 'string
  :require 'po-mode
  :group 'po)


(defun po-extract-previous-msgid (buffer start end)
  "Delete '#|' marker and unquote text from BUFFER START END.
delete '^#| ' each line.  then unquote.
return is String with property."
  (with-temp-buffer
    (insert-buffer-substring buffer start end)
    (goto-char (point-min))
    (while (re-search-forward "^#\\(~\\)?|[ \t]*" nil t)
      (replace-match "" t t))
    (po-extract-unquoted (current-buffer) (point-min) (point-max))
    )
  )

(defun po-ediff-previous-msgid ()
  "Ediff previous msgid (marked #| ) and msgid."
  (interactive)
  (require 'po-mode)
  (po-find-span-of-entry)
  (let (
	(oldbuf (current-buffer))
	(msgid (po-get-msgid))
	(untranslated-regions (po-previous-untranslated-regions))
        (beg-A)
	(end-A)
	(beg-B)
	(end-B)
	)
    ;; source buffer for buffer-A
    (save-current-buffer
      (set-buffer (get-buffer-create
		   po-ediff-previous-msgid-buffer-a-name))
      (setq buffer-read-only nil)
      (erase-buffer)
      (dolist (region untranslated-regions)
	(insert (po-extract-previous-msgid oldbuf (car region) (cdr region)))
	)
      (setq beg-A (point-min))
      (setq end-A (point-max))
      (goto-char (point-min))
      (push-mark (point-max) t t)
      (setq buffer-read-only t)
      (restore-buffer-modified-p nil))
    ;; source buffer for buffer-B
    (save-current-buffer
      (set-buffer (get-buffer-create
		   po-ediff-previous-msgid-buffer-b-name))
      (setq buffer-read-only nil)
      (erase-buffer)
      (insert msgid)
      (setq beg-B (point-min))
      (setq end-B (point-max))
      (goto-char (point-min))
      (push-mark (point-max) t t)
      (setq buffer-read-only t)
      (restore-buffer-modified-p nil))
    ;; run ediff
    (ediff-regions-internal
     (get-buffer po-ediff-previous-msgid-buffer-a-name)
     beg-A end-A
     (get-buffer po-ediff-previous-msgid-buffer-b-name)
     beg-B end-B
     nil 'ediff-regions-wordwise 'word-mode nil)
    )  ; end of let
  )

(provide 'po-ediff-previous-msgid)
;;; po-ediff-previous-msgid.el ends here
````

# 一応できたけどな
希望どおりのモノが動いているので、一応コマンド作成できたことになります。

しかし、エラー処理とかEmacsにどうやって登録しようかとか手つかずの状態なので次回からはそこらへんを改良していきます。

ソースコードも割と冗長でもっとファクタリングしたいのですが、ファクタリングしたら動かなくなったりしてうーん。 git restore して元に戻した... バッファー・オブジェクトの扱いがいまいち分からん。 関数の引数に渡して使ったらアカンのやろかetc.

今回はここまで。