branch: externals/mpdired
commit e78adc1fd237131ff779b7e3f5dbe6fb796bdf12
Author: Manuel Giraud <man...@ledu-giraud.fr>
Commit: Manuel Giraud <man...@ledu-giraud.fr>

    position with songid in queue view
---
 mpdired.el | 38 +++++++++++++++++++++++++++++---------
 1 file changed, 29 insertions(+), 9 deletions(-)

diff --git a/mpdired.el b/mpdired.el
index 729e9ebc65..6bd286deb3 100644
--- a/mpdired.el
+++ b/mpdired.el
@@ -210,10 +210,13 @@
 (defvar-local mpdired--view nil)
 (defvar-local mpdired--comm-buffer nil
   "Communication buffer associated to this MPDired buffer.")
+
+;; I tried to use markers but since I often erase the buffer content,
+;; these markers are reset to 1.
 (defvar-local mpdired--browser-point nil
   "Saved point position in the browser view.")
-(defvar-local mpdired--queue-point nil
-  "Saved point position in the queue view.")
+(defvar-local mpdired--songid-point nil
+  "Songid for point position in the queue view.")
 
 (defun mpdired--bol ()
   "Correct beginning of line in a MPDired buffer."
@@ -264,6 +267,13 @@
   (goto-char point)
   (goto-char (mpdired--bol)))
 
+(defun mpdired--goto-id (songid)
+  (let ((max (point-max)))
+    (while (and (< (point) max)
+               (let ((id (get-text-property (mpdired--bol) 'id)))
+                 (and id (/= songid id))))
+      (mpdired--next-line))))
+
 (defun mpdired--present-listall (proc)
   ;; Called by filter of the communication buffer.
   (let* ((peer-info (process-contact proc t))
@@ -342,8 +352,8 @@
              (put-text-property bol (+ bol x) 'face 'mpdired-progress))))
        ;; Set mode, restore point and memorize stuff
        (mpdired-mode)
-       (when mpdired--queue-point
-         (mpdired--reset-point mpdired--queue-point))
+       (when mpdired--songid-point
+         (mpdired--goto-id mpdired--songid-point))
        (setq mpdired--comm-buffer (process-buffer proc)
              mpdired--view 'queue)))))
 
@@ -478,20 +488,30 @@
 
 (defun mpdired--save-point ()
   (cond ((eq mpdired--view 'queue)
-        (setf mpdired--queue-point (point)))
+        (let ((bol (mpdired--bol)))
+          (unless (> bol (point-max))
+            (setf mpdired--songid-point (get-text-property bol 'id)))))
        ((eq mpdired--view 'browser)
         (setf mpdired--browser-point (point)))))
 
+(defun mpdired--next-line ()
+  (forward-line)
+  (goto-char (mpdired--bol)))
+
 (defun mpdired-next-line ()
+  "Next line with saving."
   (interactive)
-  (forward-line)
-  (goto-char (mpdired--bol))
+  (mpdired--next-line)
   (mpdired--save-point))
 
+(defun mpdired--previous-line ()
+  (forward-line -1)
+  (goto-char (mpdired--bol)))
+
 (defun mpdired-previous-line ()
+  "Previous line with saving."
   (interactive)
-  (forward-line -1)
-  (goto-char (mpdired--bol))
+  (mpdired--previous-line)
   (mpdired--save-point))
 
 (defun mpdired-listall-at-point ()

Reply via email to