summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2016-06-24 09:57:53 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2016-06-24 09:59:49 +0200
commit1114418dd45ef9e1e1a7254775baf201a59c7c86 (patch)
tree885527e297ff22b22045e8794e14e9d9c89f1cbc
parentf3642291765229babca4b538e1806c3473df97a0 (diff)
downloadorg-mode-1114418dd45ef9e1e1a7254775baf201a59c7c86.tar.gz
org-colview: Replace `org-columns-eval' with `org-columns--call'
* lisp/org-colview.el (org-columns-edit-value): Small refactoring. Use new function. (org-columns--call): New function. (org-columns-eval): Remove function. (org-columns-next-allowed-value): Use new function.
-rw-r--r--lisp/org-colview.el154
1 files changed, 78 insertions, 76 deletions
diff --git a/lisp/org-colview.el b/lisp/org-colview.el
index db9c388..2a4f187 100644
--- a/lisp/org-colview.el
+++ b/lisp/org-colview.el
@@ -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.