diff options
author | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2015-04-26 10:32:20 +0200 |
---|---|---|
committer | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2015-04-26 11:37:52 +0200 |
commit | 58af85a4a2a11bb2ff611786ee921cd12aeba187 (patch) | |
tree | e5d314d8715c184b377fd30982a533e6b8f54782 | |
parent | c347b87ffe479824269ae0825e467c35d0946eed (diff) | |
download | org-mode-58af85a4a2a11bb2ff611786ee921cd12aeba187.tar.gz |
org-src: Allow editing elements remotely
* lisp/org-src.el (org-src--remote-p): New variable.
(org-src--edit-element): Add optional argument.
(org-edit-src-exit): Handle new optional argument.
-rw-r--r-- | lisp/org-src.el | 79 |
1 files changed, 49 insertions, 30 deletions
diff --git a/lisp/org-src.el b/lisp/org-src.el index 6f4befe..11354d5 100644 --- a/lisp/org-src.el +++ b/lisp/org-src.el @@ -195,6 +195,7 @@ issued in the language major mode buffer." ;;; Internal functions and variables (defvar org-src--allow-write-back t) +(defvar org-src--remote nil) (defvar org-src--beg-marker nil) (defvar org-src--block-indentation nil) (defvar org-src--code-timer nil) @@ -341,16 +342,22 @@ Assume point is in the corresponding edit buffer." (forward-line)))) (buffer-string)))) -(defun org-src--edit-element (element name &optional major write-back contents) - "Edit ELEMENT contents in a dedicated buffer. +(defun org-src--edit-element + (element name &optional major write-back contents remote) + "Edit ELEMENT contents in a dedicated buffer NAME. MAJOR is the major mode used in the edit buffer. A nil value is -equivalent to `fundamental-mode'. When WRITE-BACK is non-nil, -assume contents will replace original region. If it is -a function, it will be applied in the edit buffer before -returning the contents. When CONTENTS is non-nil, display them -in the edit buffer. Otherwise, assume they are located in -property `:value'. +equivalent to `fundamental-mode'. + +When WRITE-BACK is non-nil, assume contents will replace original +region. If it is a function, applied in the edit buffer, from +point min, before returning the contents. + +When CONTENTS is non-nil, display them in the edit buffer. +Otherwise, assume they are located in property `:value'. + +When REMOTE is non-nil, do not try to preserve point or mark when +moving from the edit area to the source. Leave point in edit buffer." (setq org-src--saved-temp-window-config (current-window-configuration)) @@ -378,8 +385,10 @@ Leave point in edit buffer." org-src-preserve-indentation))) ;; Store relative positions of mark (if any) and point ;; within the edited area. - (point-coordinates (org-src--coordinates (point) beg end)) - (mark-coordinates (and (org-region-active-p) + (point-coordinates (and (not remote) + (org-src--coordinates (point) beg end))) + (mark-coordinates (and (not remote) + (org-region-active-p) (let ((m (mark))) (and (>= m beg) (>= end m) (org-src--coordinates m beg end))))) @@ -409,6 +418,7 @@ Leave point in edit buffer." (org-set-local 'org-src--beg-marker beg) (org-set-local 'org-src--end-marker end) (org-set-local 'org-src--type type) + (org-set-local 'org-src--remote remote) (org-set-local 'org-src--block-indentation ind) (org-set-local 'org-src-preserve-indentation preserve-ind) (org-set-local 'org-src--overlay overlay) @@ -436,7 +446,13 @@ Leave point in edit buffer." (org-src--goto-coordinates mark-coordinates (point-min) (point-max)) (push-mark (point) 'no-message t) (setq deactivate-mark nil)) - (org-src--goto-coordinates point-coordinates (point-min) (point-max))) + (if (not remote) + (org-src--goto-coordinates + point-coordinates (point-min) (point-max)) + (goto-char (or (text-property-any + (point-min) (point-max) 'read-only nil) + (point-max))) + (skip-chars-forward " \r\t\n"))) ;; Install idle auto save feature, if necessary. (or org-src--code-timer (zerop org-edit-src-auto-save-idle-delay) @@ -806,35 +822,38 @@ Throw an error if there is no such buffer." "Kill current sub-editing buffer and return to source buffer." (interactive) (unless (org-src-edit-buffer-p) (error "Not in a sub-editing buffer")) - (let* ((allow-write-back org-src--allow-write-back) - (beg org-src--beg-marker) + (let* ((beg org-src--beg-marker) (end org-src--end-marker) - (coordinates (org-src--coordinates (point) 1 (point-max))) - (code (and allow-write-back (org-src--contents-for-write-back)))) + (write-back org-src--allow-write-back) + (remote org-src--remote) + (coordinates (and (not remote) + (org-src--coordinates (point) 1 (point-max)))) + (code (and write-back (org-src--contents-for-write-back)))) (set-buffer-modified-p nil) ;; Switch to source buffer. Kill sub-editing buffer. (let ((edit-buffer (current-buffer))) (org-src-switch-to-buffer (marker-buffer beg) 'exit) (kill-buffer edit-buffer)) ;; Insert modified code. Ensure it ends with a newline character. - (when (and allow-write-back - (not (equal (buffer-substring-no-properties beg end) code))) - (undo-boundary) - (goto-char beg) - (delete-region beg end) - (when (org-string-nw-p code) - (insert code) - (unless (bolp) (insert "\n")))) + (org-with-wide-buffer + (when (and write-back (not (equal (buffer-substring beg end) code))) + (undo-boundary) + (goto-char beg) + (delete-region beg end) + (when (org-string-nw-p code) + (insert code) + (unless (bolp) (insert "\n"))))) ;; If we are to return to source buffer, put point at an ;; appropriate location. In particular, if block is hidden, move ;; to the beginning of the block opening line. - (goto-char beg) - (cond - ;; Block is hidden; move at start of block. - ((org-some (lambda (o) (eq (overlay-get o 'invisible) 'org-hide-block)) - (overlays-at (point))) - (beginning-of-line 0)) - (allow-write-back (org-src--goto-coordinates coordinates beg end))) + (unless remote + (goto-char beg) + (cond + ;; Block is hidden; move at start of block. + ((org-some (lambda (o) (eq (overlay-get o 'invisible) 'org-hide-block)) + (overlays-at (point))) + (beginning-of-line 0)) + (write-back (org-src--goto-coordinates coordinates beg end)))) ;; Clean up left-over markers and restore window configuration. (set-marker beg nil) (set-marker end nil) |