diff options
| -rw-r--r-- | lisp/emms-playlist-limit.el | 105 | 
1 files changed, 59 insertions, 46 deletions
diff --git a/lisp/emms-playlist-limit.el b/lisp/emms-playlist-limit.el index e9f864a..38a3f28 100644 --- a/lisp/emms-playlist-limit.el +++ b/lisp/emms-playlist-limit.el @@ -23,10 +23,13 @@  ;;; Commentary: -;;  This code allows you to "limit" the current playlist by creating a -;;  derived playlist containing only those tracks with a type -;;  (info-artist and the like) matching a regexp.  The derived -;;  playlist then becomes current. +;;  This code allows you to "limit" a playlist in the current buffer +;;  by creating, and switching to, a derived playlist containing only +;;  those tracks with a type (info-artist and the like) matching a +;;  regexp. + +;;  If the current buffer is the current playlist then the derived +;;  playlist is made current.  ;;  Usage:  ;;  ------------------------------------------------------------------ @@ -60,29 +63,34 @@    :group 'emms)  (defcustom emms-playlist-limit-hook nil -  "Hooks to run after each limit operations." +  "Hooks to run after each limit operation."    :type 'symbol    :group 'emms-playlist-limit)  (defmacro define-emms-playlist-limit (attribute)    "Macro for defining emms playlist limit to ATTRIBUTE function."    `(defun ,(intern (format "emms-playlist-limit-to-%s" attribute)) (regexp) -     ,(format "Limit playlist to tracks that have %s matching REGEXP." attribute) +     ,(format "Switch to a playlist comprising tracks with %s matching REGEXP. + +REGEXP defaults to the value of %1$s for the track at point. + +When the current buffer is the current playlist, make the derived playlist +the current playlist." attribute)       (interactive        (list         (let* ((curr -               (or (emms-track-get -                    (or  (emms-playlist-track-at) -			 (emms-playlist-track-at (max 1 (1- (point))))) ; at eol +	       (or (emms-track-get +		    (or (emms-playlist-track-at) +			(emms-playlist-track-at (max 1 (1- (point))))) ; at eol  		    (quote ,attribute))  		   (emms-track-get -                    (emms-playlist-selected-track) (quote ,attribute)))) -              (attr-name ,(emms-replace-regexp-in-string -                           "info-" "" (symbol-name attribute))) -              (fmt (if curr -                       (format "Limit to %s (regexp = %s): " attr-name curr) -                     (format "Limit to %s (regexp): " attr-name)))) -         (read-string fmt)))) +		    (emms-playlist-selected-track) (quote ,attribute)))) +	      (attr-name ,(emms-replace-regexp-in-string +			   "info-" "" (symbol-name attribute))) +	      (fmt (if curr +		       (format "Limit to %s (regexp = %s): " attr-name curr) +		     (format "Limit to %s (regexp): " attr-name)))) +	 (read-string fmt))))       (when (string= regexp "")         (setq regexp (or (emms-track-get  			 (or (emms-playlist-track-at) @@ -94,8 +102,6 @@  	 (emms-playlist-limit-do (quote ,attribute) regexp)         (message "Limit cancelled: no regexp.")))) - -  (define-emms-playlist-limit info-artist)  (define-emms-playlist-limit info-composer)  (define-emms-playlist-limit info-performer) @@ -105,17 +111,22 @@  (define-emms-playlist-limit info-genre)  (define-emms-playlist-limit name) -(defvar-local emms-playlist-limit-original-playlist nil -  "Playlist buffer we are filtering.") +(defvar-local emms-playlist-limit--original-playlist nil +  "Playlist buffer from which we derive the limited playlist.")  (defun emms-playlist-limit-to-all () -  "Show all tracks again." +  "Switch to playlist from which this playlist was derived (if it still exists) +and bury this playlist. + +If this playlist is current, make the playlist we switch to current."    (interactive) -  (when (and  emms-playlist-limit-original-playlist -	      (eq (current-buffer) emms-playlist-buffer)) -    (let ((old-buf (current-buffer))) -      (switch-to-buffer emms-playlist-limit-original-playlist) -      (emms-playlist-set-playlist-buffer) +  (when (and emms-playlist-limit--original-playlist +	     (buffer-live-p emms-playlist-limit--original-playlist)) +    (let* ((old-buf (current-buffer)) +	   (old-buf-is-current-playlist (eq old-buf emms-playlist-buffer))) +      (switch-to-buffer emms-playlist-limit--original-playlist) +      (when old-buf-is-current-playlist +	(emms-playlist-set-playlist-buffer))        (bury-buffer old-buf))))  (define-key emms-playlist-mode-map (kbd "/ n") 'emms-playlist-limit-to-name) @@ -160,35 +171,37 @@ usable date when TYPE is 'info-year."  	 (new-playlist (or (get-buffer bufname)  			   (emms-playlist-new bufname))))      (with-current-buffer new-playlist -      (erase-buffer) +      (emms-with-inhibit-read-only-t (erase-buffer))        (mapc #'emms-playlist-insert-track filtered-tracks))      new-playlist))  (defun emms-playlist-limit-do (type regexp) -  "Limit by TYPE with REGEXP. +  "Switch to a derived playlist containing the tracks with TYPE matching REGEXP.  e.g.,      (emms-playlist-limit-do 'info-artist \"Jane Zhang\")  See `emms-info-mp3find-arguments' for possible options for TYPE." -  (with-current-emms-playlist -    (emms-playlist-ensure-playlist-buffer) -    (let ((curr (emms-playlist-current-selected-track)) -	  (old-buf (current-buffer)) -	  (buf (emms-playlist-limit--limit-playlist (current-buffer) type regexp))) -      (with-current-buffer buf -	(if (= (point-min) (point-max)) -	    (progn -	      (message "No matching tracks found!") -	      (kill-buffer)) -	  (let ((pos (when curr (text-property-any (point-min) (point-max) -						   'emms-track curr)))) -	    (emms-playlist-select (or pos 1))) -	  (emms-playlist-mode-center-current) -	  (setq emms-playlist-limit-original-playlist old-buf) -	  (emms-playlist-set-playlist-buffer) -	  (run-hooks 'emms-playlist-limit-hook) -	  (switch-to-buffer buf)))))) +  (emms-playlist-ensure-playlist-buffer) +  (let* ((curr (emms-playlist-selected-track)) +	 (old-buf (current-buffer)) +	 (old-buf-is-current-playlist (eq old-buf emms-playlist-buffer)) +	 (buf (emms-playlist-limit--limit-playlist old-buf type regexp))) +    (with-current-buffer buf +      (if (= (point-min) (point-max)) +	  (progn +	    (message "No matching tracks found!") +	    (kill-buffer)) +	(let ((pos (when curr (text-property-any (point-min) (point-max) +						 'emms-track curr)))) +	  (emms-playlist-select (or pos 1))) +	(emms-playlist-mode-center-current) +	(setq emms-playlist-limit--original-playlist old-buf) +	(when old-buf-is-current-playlist +	  (emms-playlist-set-playlist-buffer)) +	(run-hooks 'emms-playlist-limit-hook) +	(switch-to-buffer buf))))) +  (provide 'emms-playlist-limit)  | 
