シェルコマンドを呼び出して特定の文字列を処理し、結果の文字列を返すEmacsLisp関数を作成しました。tr
これは、テキストを大文字に変換するために呼び出すだけの単純化された例です。
(defun test-shell-command (str)
"Apply tr to STR to convert lowercase letters to uppercase."
(let ((buffer (generate-new-buffer "*temp*")))
(with-current-buffer buffer
(insert str)
(call-process-region (point-min) (point-max) "tr" t t nil "'a-z'" "'A-Z'")
(buffer-string))))
この関数は、一時バッファーを作成し、テキストを挿入し、呼び出し
tr
、テキストを結果に置き換え、結果を返します。
上記の関数は期待どおりに機能しますが、この関数のラッパーを記述してコマンドをリージョンに適用すると、元に戻る履歴に2つのステップが追加されます。別の例を次に示します。
(defun test-shell-command-region (begin end)
"Apply tr to region from BEGIN to END."
(interactive "*r")
(insert (test-shell-command (delete-and-extract-region begin end))))
を呼び出すと、領域は大文字のテキストに置き換えられますが、 ( )M-x test-shell-command-on-region
を押すと、元に戻る履歴の最初のステップは、テキストが削除された状態です。2ステップ前に戻ると、元のテキストが復元されます。C-_
undo
私の質問は、中間ステップが元に戻る履歴に追加されないようにするにはどうすればよいですか?私はundoに関するEmacsのドキュメントを読みましたが、私が知る限り、これに対処していないようです。
これは、前と同じように、組み込みのEmacs関数を呼び出すことによって同じことを実現する関数ですupcase
。結果は次の
delete-and-extract-region
ように渡されます
insert
。
(defun test-upcase-region (begin end)
"Apply upcase to region from BEGIN to END."
(interactive "*r")
(insert (upcase (delete-and-extract-region begin end))))
を呼び出すときM-x test-upcase-region
、予想どおり、取り消し履歴には1つのステップしかありません。そのため、呼び出すと
test-shell-command
元に戻る境界が作成される場合のようです。それはどういうわけか避けることができますか?