Hi, This patch adds support for moving tracks in the playlist.
Since I change other playlist functions (not user-visible, I think), I'll wait a couple of days before merging to see if anybody is opposed to any changes. A small rant: The playlist is a mess. Faces differ depending on how they were inserted into the buffer. The displayed string depends on how it was inserted. The indentation is also a function of insertion method. One thing I would be cool would be use tabulated list (like packaged mode) and have /one/ format-string that controls how items look and are aligned. I'd have to check if cover art can work with this. Rasmus -- Together we will make the possible totalllly impossible!
>From 4c0be3c9ecf66d7fb2dfeac56158fcf89aecf8eb Mon Sep 17 00:00:00 2001 From: Rasmus <[email protected]> Date: Sun, 24 May 2015 14:30:03 +0200 Subject: [PATCH] Add move functions to the playlist view This allows moving track with M-up and M-down (like Org headings). To facilitate a consistent behavior (e.g. not changing fonts or strings), a number of functions were changed: - Kill functions take an optional no-stop argument - emms-playlist-mode-insert-track takes a new optional track-string argument that is used as string if non-nil. Further, it tries to use the same face as track-string if present. --- NEWS | 1 + doc/emms.texinfo | 10 ++++++ lisp/emms-playlist-mode.el | 85 +++++++++++++++++++++++++++++++++++----------- 3 files changed, 77 insertions(+), 19 deletions(-) diff --git a/NEWS b/NEWS index 65c439b..40b45bd 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ News since version 4.0: - emms-lyrics.el now uses eww if present. Also EMMS tries to fetch non-Chinese lyrics from lyricwiki.org. - Add HTTPS support where possible. + - Tracks can be moved in the emms playlist using M-up and M-down. News since version 3.0: diff --git a/doc/emms.texinfo b/doc/emms.texinfo index 26bb10f..c0db3cd 100644 --- a/doc/emms.texinfo +++ b/doc/emms.texinfo @@ -681,6 +681,10 @@ Move to the previous track in the current buffer. @defun emms-playlist-previous Move to the previous track in the current buffer. @end defun +@defun emms-playlist-move-track-up +Move the current track up in the playlist. +@defun emms-playlist-move-track-down +Move the current track down in the playlist. @defun emms-random Jump to a random track. @end defun @@ -1042,9 +1046,15 @@ Set the current playlist buffer. @item n @findex emms-next Start playing the next track in the playlist. +@item M-down +@findex emms-playlist-move-track-down +Move the current track down in the playlist. @item p @findex emms-next Start playing the previous track in the playlist. +@item M-up +@findex emms-playlist-move-track-up +Move the current track up in the playlist. @item s @findex emms-stop Stop playing. diff --git a/lisp/emms-playlist-mode.el b/lisp/emms-playlist-mode.el index e8972c0..ee175a4 100644 --- a/lisp/emms-playlist-mode.el +++ b/lisp/emms-playlist-mode.el @@ -130,6 +130,8 @@ This is true for every invocation of `emms-playlist-mode-go'." (define-key map (kbd "M->") 'emms-playlist-mode-last) (define-key map (kbd "M-n") 'emms-playlist-mode-next) (define-key map (kbd "M-p") 'emms-playlist-mode-previous) + (define-key map [(meta up)] 'emms-playlist-move-track-up) + (define-key map [(meta down)] 'emms-playlist-move-track-down) (define-key map (kbd "a") 'emms-playlist-mode-add-contents) (define-key map (kbd "b") 'emms-playlist-set-playlist-buffer) (define-key map (kbd "D") 'emms-playlist-mode-kill-track) @@ -341,6 +343,38 @@ set it as current." (error "No track at point")))) ;;; -------------------------------------------------------- +;;; Move track +;;; -------------------------------------------------------- + +(defun emms-playlist-move-track-up (&optional n) + "Move track at point upwards in the playlist. +Optional argument n is the number of spaces " + (interactive "p") + (let ((track (emms-playlist-track-at)) + (playing-track (and emms-player-playing-p + (emms-playlist-selected-track-at-p))) + (string (buffer-substring (line-beginning-position) + (line-end-position))) + (n (- (or n 1)))) + (emms-playlist-mode-kill-entire-track t) + (forward-line n) + (save-excursion + (emms-with-inhibit-read-only-t + (emms-playlist-mode-insert-track track nil string) + (emms-playlist-mode-correct-previous-yank))) + (and playing-track + (emms-with-inhibit-read-only-t + (emms-playlist-select (point)))))) + +(defun emms-playlist-move-track-down (&optional n) + "Drag track at point downwards in the playlist. +Optional argument n is the number of spaces " + (interactive "p") + (let ((n (- (or n 1)))) + (emms-playlist-move-track-up n))) + + +;;; -------------------------------------------------------- ;;; Killing and yanking ;;; -------------------------------------------------------- @@ -350,15 +384,17 @@ set it as current." (<= p b))) ;; D -(defun emms-playlist-mode-kill-entire-track () +(defun emms-playlist-mode-kill-entire-track (&optional no-stop) "Kill track at point, including newline." (interactive) (let ((kill-whole-line t)) - (emms-playlist-mode-kill-track))) + (emms-playlist-mode-kill-track no-stop))) ;; C-k -(defun emms-playlist-mode-kill-track () - "Kill track at point." +(defun emms-playlist-mode-kill-track (&optional no-stop) + "Kill track at point. +Optional no-stop allows the track to continue playing. +" (interactive) (emms-with-inhibit-read-only-t (let ((track (emms-playlist-track-at))) @@ -366,8 +402,8 @@ set it as current." (let ((track-region (emms-property-region (point) 'emms-track))) (when (and emms-player-playing-p - (emms-playlist-selected-track-at-p)) - (emms-stop) + (emms-playlist-selected-track-at-p)) + (unless no-stop (emms-stop)) (delete-overlay emms-playlist-mode-selected-overlay) (setq emms-playlist-mode-selected-overlay nil)))) (let ((kill-whole-line emms-playlist-mode-kill-whole-line-p)) @@ -375,7 +411,7 @@ set it as current." (kill-line))))) ;; C-w -(defun emms-playlist-mode-kill () +(defun emms-playlist-mode-kill (&optional no-stop) "Kill from mark to point." (interactive) (emms-with-inhibit-read-only-t @@ -385,7 +421,7 @@ set it as current." (marker-position emms-playlist-selected-marker) (region-beginning) (region-end))) - (emms-stop) + (unless no-stop (emms-stop)) (delete-overlay emms-playlist-mode-selected-overlay) (setq emms-playlist-mode-selected-overlay nil)) (kill-region (region-beginning) @@ -481,18 +517,29 @@ This preserves the current EMMS buffer." ;;; Local functions ;;; -------------------------------------------------------- -(defun emms-playlist-mode-insert-track (track &optional no-newline) +(defun emms-playlist-mode-insert-track (track &optional no-newline track-string) "Insert the description of TRACK at point. -When NO-NEWLINE is non-nil, do not insert a newline after the track." +When NO-NEWLINE is non-nil, do not insert a newline after the track. +When TRACK-STRING is non-nil it will be used as the playlist text. +Otherwise `emms-track-force-description' is used." (emms-playlist-ensure-playlist-buffer) - (emms-with-inhibit-read-only-t - (insert (emms-propertize (emms-track-force-description track) - 'emms-track track - 'face 'emms-playlist-track-face)) - (when (emms-playlist-selected-track-at-p) - (emms-playlist-mode-overlay-selected)) - (unless no-newline - (insert "\n")))) + (let ((face (and track-string + (or (get-text-property 0 'face track-string) + (get-text-property + (next-single-property-change 0 'face track-string) + 'face track-string))))) + (and track-string + (set-text-properties 0 (length track-string) nil track-string)) + (emms-with-inhibit-read-only-t + (insert (emms-propertize (or track-string + (emms-track-force-description track)) + 'emms-track track + 'face (or face 'emms-playlist-track-face))) + (when (save-excursion (beginning-of-line) + (emms-playlist-selected-track-at-p)) + (emms-playlist-mode-overlay-selected)) + (unless no-newline + (insert "\n"))))) (defun emms-playlist-mode-update-track-function () "Update the track display at point." @@ -509,7 +556,7 @@ When NO-NEWLINE is non-nil, do not insert a newline after the track." (when selectedp (delete-overlay emms-playlist-mode-selected-overlay) (setq emms-playlist-mode-selected-overlay nil)) - (emms-playlist-mode-insert-track track t)) + (emms-playlist-mode-insert-trac track t)) (when selectedp (emms-playlist-select (point)))))) -- 2.4.1
_______________________________________________ Emms-help mailing list [email protected] https://lists.gnu.org/mailman/listinfo/emms-help
