|
@@ -536,75 +536,75 @@ Where possible, use the standard interface for changing this line."
|
|
|
(interactive)
|
|
|
(org-columns-check-computed)
|
|
|
(let* ((col (current-column))
|
|
|
- (key (or key (get-char-property (point) 'org-columns-key)))
|
|
|
- (value (get-char-property (point) 'org-columns-value))
|
|
|
- (bol (point-at-bol)) (eol (point-at-eol))
|
|
|
- (pom (or (get-text-property bol 'org-hd-marker)
|
|
|
- (point))) ; keep despite of compiler waring
|
|
|
+ (bol (line-beginning-position))
|
|
|
+ (eol (line-end-position))
|
|
|
+ (pom (or (get-text-property bol 'org-hd-marker) (point)))
|
|
|
(org-columns--time (float-time (current-time)))
|
|
|
- nval eval allowed)
|
|
|
+ (action
|
|
|
+ (pcase (or key (get-char-property (point) 'org-columns-key))
|
|
|
+ ("CLOCKSUM"
|
|
|
+ (error "This special column cannot be edited"))
|
|
|
+ ("ITEM"
|
|
|
+ (lambda () (org-with-point-at pom (org-edit-headline))))
|
|
|
+ ("TODO"
|
|
|
+ (lambda ()
|
|
|
+ (org-with-point-at pom (call-interactively #'org-todo))))
|
|
|
+ ("PRIORITY"
|
|
|
+ (lambda ()
|
|
|
+ (org-with-point-at pom
|
|
|
+ (call-interactively #'org-priority))))
|
|
|
+ ("TAGS"
|
|
|
+ (lambda ()
|
|
|
+ (org-with-point-at pom
|
|
|
+ (let ((org-fast-tag-selection-single-key
|
|
|
+ (if (eq org-fast-tag-selection-single-key 'expert)
|
|
|
+ t
|
|
|
+ org-fast-tag-selection-single-key)))
|
|
|
+ (call-interactively #'org-set-tags)))))
|
|
|
+ ("DEADLINE"
|
|
|
+ (lambda ()
|
|
|
+ (org-with-point-at pom (call-interactively #'org-deadline))))
|
|
|
+ ("SCHEDULED"
|
|
|
+ (lambda ()
|
|
|
+ (org-with-point-at pom (call-interactively #'org-schedule))))
|
|
|
+ ("BEAMER_env"
|
|
|
+ (lambda ()
|
|
|
+ (org-with-point-at pom
|
|
|
+ (call-interactively #'org-beamer-select-environment))))
|
|
|
+ (key
|
|
|
+ (let* ((allowed (org-property-get-allowed-values pom key 'table))
|
|
|
+ (value (get-char-property (point) 'org-columns-value))
|
|
|
+ (nval (org-trim
|
|
|
+ (if (null allowed) (read-string "Edit: " value)
|
|
|
+ (completing-read
|
|
|
+ "Value: " allowed nil
|
|
|
+ (not (get-text-property
|
|
|
+ 0 'org-unrestricted (caar allowed))))))))
|
|
|
+ (and (not (equal nval value))
|
|
|
+ (lambda () (org-entry-put pom key nval))))))))
|
|
|
(cond
|
|
|
- ((equal key "CLOCKSUM")
|
|
|
- (error "This special column cannot be edited"))
|
|
|
- ((equal key "ITEM")
|
|
|
- (setq eval `(org-with-point-at ,pom
|
|
|
- (org-edit-headline))))
|
|
|
- ((equal key "TODO")
|
|
|
- (setq eval `(org-with-point-at ,pom
|
|
|
- (call-interactively 'org-todo))))
|
|
|
- ((equal key "PRIORITY")
|
|
|
- (setq eval `(org-with-point-at ,pom
|
|
|
- (call-interactively 'org-priority))))
|
|
|
- ((equal key "TAGS")
|
|
|
- (setq eval `(org-with-point-at ,pom
|
|
|
- (let ((org-fast-tag-selection-single-key
|
|
|
- (if (eq org-fast-tag-selection-single-key 'expert)
|
|
|
- t org-fast-tag-selection-single-key)))
|
|
|
- (call-interactively 'org-set-tags)))))
|
|
|
- ((equal key "DEADLINE")
|
|
|
- (setq eval `(org-with-point-at ,pom
|
|
|
- (call-interactively 'org-deadline))))
|
|
|
- ((equal key "SCHEDULED")
|
|
|
- (setq eval `(org-with-point-at ,pom
|
|
|
- (call-interactively 'org-schedule))))
|
|
|
- ((equal key "BEAMER_env")
|
|
|
- (setq eval `(org-with-point-at ,pom
|
|
|
- (call-interactively 'org-beamer-select-environment))))
|
|
|
+ ((null action))
|
|
|
+ ((eq major-mode 'org-agenda-mode)
|
|
|
+ (org-columns--call action)
|
|
|
+ ;; The following let preserves the current format, and makes
|
|
|
+ ;; sure that in only a single file things need to be updated.
|
|
|
+ (let* ((org-agenda-overriding-columns-format org-columns-current-fmt)
|
|
|
+ (buffer (marker-buffer pom))
|
|
|
+ (org-agenda-contributing-files
|
|
|
+ (list (with-current-buffer buffer
|
|
|
+ (buffer-file-name (buffer-base-buffer))))))
|
|
|
+ (org-agenda-columns)))
|
|
|
(t
|
|
|
- (setq allowed (org-property-get-allowed-values pom key 'table))
|
|
|
- (if allowed
|
|
|
- (setq nval (completing-read
|
|
|
- "Value: " allowed nil
|
|
|
- (not (get-text-property 0 'org-unrestricted
|
|
|
- (caar allowed)))))
|
|
|
- (setq nval (read-string "Edit: " value)))
|
|
|
- (setq nval (org-trim nval))
|
|
|
- (when (not (equal nval value))
|
|
|
- (setq eval `(org-entry-put ,pom ,key ,nval)))))
|
|
|
- (when eval
|
|
|
- (cond
|
|
|
- ((equal major-mode 'org-agenda-mode)
|
|
|
- (org-columns-eval eval)
|
|
|
- ;; The following let preserves the current format, and makes sure
|
|
|
- ;; that in only a single file things need to be updated.
|
|
|
- (let* ((org-agenda-overriding-columns-format org-columns-current-fmt)
|
|
|
- (buffer (marker-buffer pom))
|
|
|
- (org-agenda-contributing-files
|
|
|
- (list (with-current-buffer buffer
|
|
|
- (buffer-file-name (buffer-base-buffer))))))
|
|
|
- (org-agenda-columns)))
|
|
|
- (t
|
|
|
- (let ((inhibit-read-only t))
|
|
|
- (org-with-silent-modifications
|
|
|
- (remove-text-properties
|
|
|
- (max (point-min) (1- bol)) eol '(read-only t)))
|
|
|
- (org-columns-eval eval))
|
|
|
- ;; Some properties can modify headline (e.g., "TODO"), and
|
|
|
- ;; possible shuffle overlays. Make sure they are still all at
|
|
|
- ;; the right place on the current line.
|
|
|
- (let ((org-columns-inhibit-recalculation)) (org-columns-redo))
|
|
|
- (org-columns-update key)
|
|
|
- (org-move-to-column col))))))
|
|
|
+ (let ((inhibit-read-only t))
|
|
|
+ (org-with-silent-modifications
|
|
|
+ (remove-text-properties (max (point-min) (1- bol)) eol '(read-only t)))
|
|
|
+ (org-columns--call action))
|
|
|
+ ;; Some properties can modify headline (e.g., "TODO"), and
|
|
|
+ ;; possible shuffle overlays. Make sure they are still all at
|
|
|
+ ;; the right place on the current line.
|
|
|
+ (let ((org-columns-inhibit-recalculation)) (org-columns-redo))
|
|
|
+ (org-columns-update key)
|
|
|
+ (org-move-to-column col)))))
|
|
|
|
|
|
(defun org-columns-edit-allowed ()
|
|
|
"Edit the list of allowed values for the current property."
|
|
@@ -627,13 +627,15 @@ Where possible, use the standard interface for changing this line."
|
|
|
(t pom))
|
|
|
key1 nval)))
|
|
|
|
|
|
-(defun org-columns-eval (form)
|
|
|
- (let (hidep)
|
|
|
- (save-excursion
|
|
|
- (ignore-errors (move-beginning-of-line 2))
|
|
|
- (setq hidep (org-at-heading-p 1)))
|
|
|
- (eval form)
|
|
|
- (and hidep (outline-hide-entry))))
|
|
|
+(defun org-columns--call (fun)
|
|
|
+ "Call function FUN while preserving heading visibility.
|
|
|
+FUN is a function called with no argument."
|
|
|
+ (let ((hide-body (and (/= (line-end-position) (point-max))
|
|
|
+ (save-excursion
|
|
|
+ (move-beginning-of-line 2)
|
|
|
+ (org-at-heading-p t)))))
|
|
|
+ (unwind-protect (funcall fun)
|
|
|
+ (when hide-body (outline-hide-entry)))))
|
|
|
|
|
|
(defun org-columns-previous-allowed-value ()
|
|
|
"Switch to the previous allowed value for this column."
|
|
@@ -674,10 +676,10 @@ an integer, select that value."
|
|
|
(when (= l 1) (error "Only one allowed value for this property"))
|
|
|
(or (nth 1 (member value allowed)) (car allowed)))
|
|
|
(t (car allowed))))
|
|
|
- (sexp `(org-entry-put ,pom ,key ,new)))
|
|
|
+ (action (lambda () (org-entry-put pom key new))))
|
|
|
(cond
|
|
|
((equal major-mode 'org-agenda-mode)
|
|
|
- (org-columns-eval sexp)
|
|
|
+ (org-columns--call action)
|
|
|
;; The following let preserves the current format, and makes
|
|
|
;; sure that in only a single file things need to be updated.
|
|
|
(let* ((org-agenda-overriding-columns-format org-columns-current-fmt)
|
|
@@ -690,7 +692,7 @@ an integer, select that value."
|
|
|
(let ((inhibit-read-only t))
|
|
|
(remove-text-properties (line-end-position 0) (line-end-position)
|
|
|
'(read-only t))
|
|
|
- (org-columns-eval sexp))
|
|
|
+ (org-columns--call action))
|
|
|
;; Some properties can modify headline (e.g., "TODO"), and
|
|
|
;; possible shuffle overlays. Make sure they are still all at
|
|
|
;; the right place on the current line.
|