1

更新: 元の質問には回答しましたが、より一般的なアプローチを知りたいです。単一の C-/ で元に戻す複数の操作を定義するにはどうすればよいですか。

TODO コメントをコードに自動的に挿入する関数を作成しようとしています。この機能に「元に戻すオプション」を持たせたい。

buffer-undo-list にマークを追加する方法を見つけました:

(setq buffer-undo-list (cons (point) buffer-undo-list)) 

これにより、この関数が実行された位置にポイントを戻すことができます (元に戻すことにした場合)。

私の質問は: buffer-undo-list に複数の挿入を追加するにはどうすればよいですか? つまり、私の関数には複数の (str を挿入) ステートメントがありますが、それらすべてを 1 つの C-/ と一緒に元に戻したい (元に戻すことにした場合)。

このプロパティを持つ他の関数から正確にコピーしようとしましたが、うまくいきませんでした。以下のコードは私が今持っているものです:

(defun insert-todo ()
  "Appednd 'TODO username: date - ' at the end of line and set point 
to where this string ends"
  (interactive)

  (setq buffer-undo-list (cons (point) buffer-undo-list))   ;; save the point for undo
  (save-excursion 
    (end-of-line)
    (setq eol (point))
    (let ((buffer-undo-list t)) ;; do not record following commands for undo    
      (insert " " comment-start (save-excursion comment-end))   
      (insert (format " TODO %s: " (getenv "USER")) (format-time-string "%d.%m.%Y") " - ") 
      (setq buffer-undo-list (cons (cons eol (point)) buffer-undo-list))))
  (end-of-line)
  )
4

2 に答える 2

3

触れないでくださいbuffer-undo-list。の一部として自動的に更新されるinsertため、特別なことをしなくても「そのまま機能する」はずです。

その仕組みは、さまざまな変更を組み合わせた元に戻すエンティティの新しい形式を発明する代わりに、元に戻すログに境界が散りばめられ、元に戻すときに、2 つの境界の間のすべてのエントリが「1 つのステップで」元に戻されるというものです。通常、read-eval-print ループの各反復の後に境界が追加されるため、99% のケースで「問題なく動作」します。

于 2013-06-09T16:13:57.537 に答える
0

これは古い質問であることは知っていますが、まさにこの問題に出くわしました(undo-auto-amalgamate)。コマンドの最初に明示的(undo-boundary)に配置すると、うまくいくようです。

于 2016-08-03T05:31:54.300 に答える