diff --git a/helm-buffers.el b/helm-buffers.el index d9bf199ad..761af858b 100644 --- a/helm-buffers.el +++ b/helm-buffers.el @@ -460,7 +460,8 @@ The list is reordered with `helm-buffer-list-reorder-fn'." (defun helm-buffer--details (buffer &optional details) (require 'dired) - (let* ((mode (helm-buffer--format-mode-name buffer)) + (let* ((buffer (or (car-safe buffer) buffer)) + (mode (helm-buffer--format-mode-name buffer)) (buf (get-buffer buffer)) (size (propertize (helm-buffer-size buf) 'face 'helm-buffer-size)) @@ -488,45 +489,45 @@ The list is reordered with `helm-buffer-list-reorder-fn'." name name-prefix file-name size mode dir 'helm-buffer-file 'helm-buffer-process nil details 'filebuf) (cond - (;; A dired buffer. - (rassoc buf dired-buffers) - (helm-buffer--show-details - name name-prefix dir size mode dir - 'helm-buffer-directory 'helm-buffer-process nil details 'dired)) - ;; A buffer file modified somewhere outside of emacs.=>red - ((and file-name - (file-exists-p file-name) - (not (verify-visited-file-modtime buf))) - (helm-buffer--show-details - name name-prefix file-name size mode dir - 'helm-buffer-saved-out 'helm-buffer-process nil details 'modout)) - ;; A new buffer file not already saved on disk (or a deleted file) .=>indianred2 - ((and file-name (not (file-exists-p file-name))) - (helm-buffer--show-details - name name-prefix file-name size mode dir - 'helm-buffer-not-saved 'helm-buffer-process nil details 'notsaved)) - ;; A buffer file modified and not saved on disk.=>orange - ((and file-name (buffer-modified-p buf)) - (helm-buffer--show-details - name name-prefix file-name size mode dir - 'helm-buffer-modified 'helm-buffer-process nil details 'mod)) - ;; A buffer file not modified and saved on disk.=>green - (file-name - (helm-buffer--show-details - name name-prefix file-name size mode dir - 'helm-buffer-file 'helm-buffer-process nil details 'filebuf)) - ;; A non-file, modified buffer See bug#1917 - ((with-current-buffer name - (and helm-buffers-tick-counter - (/= helm-buffers-tick-counter (buffer-modified-tick)))) - (helm-buffer--show-details - name (and proc name-prefix) dir size mode dir - 'helm-no-file-buffer-modified 'helm-buffer-process proc details 'nofile-mod)) - ;; Any non--file buffer.=>italic - (t - (helm-buffer--show-details - name (and proc name-prefix) dir size mode dir - 'helm-non-file-buffer 'helm-buffer-process proc details 'nofile))))))) + (;; A dired buffer. + (rassoc buf dired-buffers) + (helm-buffer--show-details + name name-prefix dir size mode dir + 'helm-buffer-directory 'helm-buffer-process nil details 'dired)) + ;; A buffer file modified somewhere outside of emacs.=>red + ((and file-name + (file-exists-p file-name) + (not (verify-visited-file-modtime buf))) + (helm-buffer--show-details + name name-prefix file-name size mode dir + 'helm-buffer-saved-out 'helm-buffer-process nil details 'modout)) + ;; A new buffer file not already saved on disk (or a deleted file) .=>indianred2 + ((and file-name (not (file-exists-p file-name))) + (helm-buffer--show-details + name name-prefix file-name size mode dir + 'helm-buffer-not-saved 'helm-buffer-process nil details 'notsaved)) + ;; A buffer file modified and not saved on disk.=>orange + ((and file-name (buffer-modified-p buf)) + (helm-buffer--show-details + name name-prefix file-name size mode dir + 'helm-buffer-modified 'helm-buffer-process nil details 'mod)) + ;; A buffer file not modified and saved on disk.=>green + (file-name + (helm-buffer--show-details + name name-prefix file-name size mode dir + 'helm-buffer-file 'helm-buffer-process nil details 'filebuf)) + ;; A non-file, modified buffer See bug#1917 + ((with-current-buffer name + (and helm-buffers-tick-counter + (/= helm-buffers-tick-counter (buffer-modified-tick)))) + (helm-buffer--show-details + name (and proc name-prefix) dir size mode dir + 'helm-no-file-buffer-modified 'helm-buffer-process proc details 'nofile-mod)) + ;; Any non--file buffer.=>italic + (t + (helm-buffer--show-details + name (and proc name-prefix) dir size mode dir + 'helm-non-file-buffer 'helm-buffer-process proc details 'nofile))))))) (defun helm-highlight-buffers (buffers _source) "Transformer function to highlight BUFFERS list. @@ -535,7 +536,7 @@ buffers)." (cl-assert helm-fuzzy-matching-highlight-fn nil "Wrong type argument functionp: nil") (cl-loop with helm-buffers-show-icons = (and (featurep 'all-the-icons) (default-toplevel-value - 'helm-buffers-show-icons)) + 'helm-buffers-show-icons)) for i in buffers for (name size mode meta) = (if helm-buffer-details-flag (helm-buffer--details i 'details) @@ -573,7 +574,7 @@ buffers)." helm-buffers-column-separator meta) (funcall helm-fuzzy-matching-highlight-fn name)) - (get-buffer i))))) + (get-buffer (or (car-safe i) i)))))) (defun helm-buffer--get-preselection (buffer) (let* ((bufname (buffer-name buffer)) diff --git a/helm-core.el b/helm-core.el index 13879cdd5..1f1591a57 100644 --- a/helm-core.el +++ b/helm-core.el @@ -4253,12 +4253,23 @@ Cache the candidates if there is no cached value yet." ;;; Candidate transformers +(defvar helm-candidate-transformer-alist + '() + "An alist of functions to transform candidates for each source. + +Each key is the source name. + +Each value is a function that should take a string and return a (DISPLAY . REAL) +cons cell.") (defun helm-process-candidate-transformer (candidates source) "Execute `candidate-transformer' function(s) on CANDIDATES in SOURCE." - (helm-aif (assoc-default 'candidate-transformer source) - (helm-apply-functions-from-source source it candidates) - candidates)) + (let* ((name (assoc-default 'name source)) + (transformer (assoc-default name helm-candidate-transformer-alist))) + (helm-aif (or transformer + (assoc-default 'candidate-transformer source)) + (helm-apply-functions-from-source source it candidates) + candidates))) (defun helm-process-filtered-candidate-transformer (candidates source) "Execute `filtered-candidate-transformer' function(s) on CANDIDATES in SOURCE." @@ -4778,12 +4789,9 @@ emacs-27 to provide such scoring in emacs<27." for dup = (gethash c hash) for disp = (helm-candidate-get-display c) while (< count limit) - for target = (if (helm-get-attr 'match-on-real source) - ;; Let's fails on error in - ;; case next block returns nil. - (or (cdr-safe c) - (get-text-property 0 'helm-realvalue disp)) - disp) + for target = (or (cdr-safe c) + (get-text-property 0 'helm-realvalue disp) + disp) for prop-part = (get-text-property 0 'match-part target) for part = (and match-part-fn (or prop-part