[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#4587: Antwort: Re: bug#4587: 23.1; sort-lines and sort-fields always

From: Kevin Rodgers
Subject: bug#4587: Antwort: Re: bug#4587: 23.1; sort-lines and sort-fields always set buffer modified
Date: Sun, 25 Oct 2009 07:41:47 -0600
User-agent: Thunderbird (Macintosh/20090812)

Stefan Monnier wrote:
I'd indeed expect that to implement the feature you request, the code
would have to do something like that.  Most likely not copying the text
itself, but instead storing an md5 or somesuch hash of the text.

Not suitable for Emacs, but maybe useful for Roland:

(defadvice sort-lines (around restore-buffer-modified-p activate)
  (let* ((buffer-was-modified-p (buffer-modified-p))
         (buffer-was-not-modified-md5 (if (not buffer-was-modified-p)
                                          (md5 (current-buffer)))))
    (when (and (not buffer-was-modified-p)
               (not (equal buffer-was-not-modified-md5 (md5 (current-buffer)))))
      (restore-buffer-modified-p buffer-was-modified-p))))

Maybe we could make it suitable, turn it into a macro and use it around
the various candidates.  AFAICT, here are the problems I see with it:
- the call to md5 should use as much as possible the internal encoding.
  I.e. at least pass an `emacs-internal' arg, tho it would be even
  better to let md5 work directly on the internal representation.
- it should only work on the afected region rather than the whole buffer
  (i.e. it needs start..end arguments).
- should it fiddle with the undo list?  or even revert the whole
  "without-effect" set of changes (the changes may result in the same
  final text, but they may very well have moved markers and changed
  text-properties, and it might be desirable to undo those changes, so
  as to better pretend nothing happened).

Is this what you have in mind?

(defmacro with-maybe-region-modified (beg end &rest body)
  "Execute BODY, then `restore-buffer-modified-p' if the contents are unchanged.
BODY should not change the current buffer or modify the contents outside the 
between BEG and END."
  `(let* ((region-beg ,beg)
          (region-end ,end)
          (buffer-was-modified-p (buffer-modified-p))
          (buffer-was-not-modified-md5 (if (not buffer-was-modified-p)
                                           (md5 (current-buffer) region-beg 
          ;; (orig-buffer-undo-list buffer-undo-list)
           (progn ,@body)))             ; save-current-buffer?
     (when (and (not buffer-was-modified-p)
                (not (equal buffer-was-not-modified-md5
                            (md5 (current-buffer) region-beg region-end
       (restore-buffer-modified-p buffer-was-modified-p)
       ;; (setq buffer-undo-list orig-buffer-undo-list)

Kevin Rodgers
Denver, Colorado, USA

reply via email to

[Prev in Thread] Current Thread [Next in Thread]