poporg.el: Preserve relative position, entering an edit buffer.

master
François Pinard 13 years ago
parent 39cbc40d67
commit adbebc047e
  1. 103
      poporg.el

@ -117,15 +117,16 @@ Point should be within a comment. The edition occurs in a separate buffer."
(setq start (point-min)
end (point-max))
(widen)
(goto-char start)
(skip-chars-backward " ")
(setq start (point))
;; Set PREFIX.
(skip-chars-forward " ")
(skip-chars-forward comment-start)
(skip-chars-forward " ")
(setq prefix (buffer-substring-no-properties start (point))
prefix-regexp (regexp-quote prefix))
(save-excursion
(goto-char start)
(skip-chars-backward " ")
(setq start (point))
;; Set PREFIX.
(skip-chars-forward " ")
(skip-chars-forward comment-start)
(skip-chars-forward " ")
(setq prefix (buffer-substring-no-properties start (point))
prefix-regexp (regexp-quote prefix)))
;; Edit our extended comment.
(poporg-edit-region start end prefix)))
@ -166,25 +167,26 @@ Point should be within a string. The edition occurs in a separate buffer."
(forward-char 3)
(skip-chars-forward "\\\\\n")
(setq start (point)))))
;; Set END.
(if end
(goto-char end)
(goto-char (or (next-single-property-change location 'face)
(point-max)))
(skip-chars-backward "\"'\\\n"))
(when (looking-at "\n")
(forward-char))
(setq end (point))
;; Set START.
(if start
(goto-char start)
(goto-char (or (previous-single-property-change location 'face)
(point-min)))
(skip-chars-forward "\"'\\\\\n"))
(setq start (point))
;; Set PREFIX.
(skip-chars-forward " ")
(setq prefix (buffer-substring-no-properties start (point)))
(save-excursion
;; Set END.
(if end
(goto-char end)
(goto-char (or (next-single-property-change location 'face)
(point-max)))
(skip-chars-backward "\"'\\\n"))
(when (looking-at "\n")
(forward-char))
(setq end (point))
;; Set START.
(if start
(goto-char start)
(goto-char (or (previous-single-property-change location 'face)
(point-min)))
(skip-chars-forward "\"'\\\\\n"))
(setq start (point))
;; Set PREFIX.
(skip-chars-forward " ")
(setq prefix (buffer-substring-no-properties start (point))))
;; Edit our string.
(poporg-edit-region start end prefix)))
@ -231,7 +233,10 @@ A prefix common to all buffer lines, and to PREFIX as well, gets removed."
(let ((buffer (current-buffer))
(edit-buffer (generate-new-buffer (concat "*" (buffer-name) "*")))
(overlay (make-overlay start end))
(string (buffer-substring start end)))
(string (buffer-substring start end))
(location (cond ((< (point) start) 0)
((> (point) end) (- end start))
(t (- (point) start)))))
;; Dim and protect the original text.
(overlay-put overlay 'face 'poporg-edited-face)
(overlay-put overlay 'intangible t)
@ -239,28 +244,28 @@ A prefix common to all buffer lines, and to PREFIX as well, gets removed."
;; Initialize a popup edit buffer.
(pop-to-buffer edit-buffer)
(insert string)
(goto-char (point-min))
(goto-char (+ (point-min) location))
(org-mode)
;; Reduce prefix as needed.
(goto-char (point-min))
(while (not (eobp))
(setq prefix (or (fill-common-string-prefix
prefix (poporg-current-line))
""))
(forward-line 1))
;; Remove common prefix.
(goto-char (point-min))
(while (not (eobp))
(delete-char (length prefix))
(forward-line 1))
(set-buffer-modified-p nil)
;; Save data and possibly activate hooks.
(unless poporg-data
(push 'poporg-kill-buffer-query kill-buffer-query-functions)
(add-hook 'kill-buffer-hook 'poporg-kill-buffer-routine))
(push (list edit-buffer overlay prefix) poporg-data)
(save-excursion
;; Reduce prefix as needed.
(goto-char (point-min))
(while (not (eobp))
(setq prefix (or (fill-common-string-prefix
prefix (poporg-current-line))
""))
(forward-line 1))
;; Remove common prefix.
(goto-char (point-min))
(while (not (eobp))
(delete-char (length prefix))
(forward-line 1))
(set-buffer-modified-p nil)
;; Save data and possibly activate hooks.
(unless poporg-data
(push 'poporg-kill-buffer-query kill-buffer-query-functions)
(add-hook 'kill-buffer-hook 'poporg-kill-buffer-routine))
(push (list edit-buffer overlay prefix) poporg-data))
;; All set up for edition.
(goto-char (point-min))
(run-hooks 'poporg-edit-hook))))
(defun poporg-edit-exit ()

Loading…
Cancel
Save