aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryonirabkin <yonirabkin>2005-12-05 09:20:00 +0000
committeryonirabkin <mwolson@gnu.org>2005-12-05 09:20:00 +0000
commit41e4e89f944c12bc9187da62d7ec65f22b4fe232 (patch)
tree1165472eec69ce9b055ae57116bff1133acf61e9
parent5773f6565cc179593020af642e75465cfbfbc42e (diff)
Killing and yanking
darcs-hash:20051205092044-be80e-106a5ba397a5cbc621e12180f3332695629944da.gz
-rw-r--r--emms-playlist-mode.el174
1 files changed, 97 insertions, 77 deletions
diff --git a/emms-playlist-mode.el b/emms-playlist-mode.el
index bbad8ed..81d641e 100644
--- a/emms-playlist-mode.el
+++ b/emms-playlist-mode.el
@@ -1,24 +1,16 @@
;;; emms-playlist-mode.el --- Playlist mode for Emms.
-;;; Copyright Yoni Rabkin under the GNU General Public License.
+;;; Copyright 2005 Yoni Rabkin under the GNU General Public License.
;;; This file is a part of the Emacs Multimedia system.
;;; Commentary:
;;;
-;;; I'm designing this as a method of displaying and manipulating the
-;;; different Emms playlist buffers defined by the user.
+;;; This is a method of displaying and manipulating the different Emms
+;;; playlist buffers.
;;;
;;; Emms developer's motto: "When forcer says (require 'jump) we say
;;; (funcall #'jump height)"
-;;; Todo:
-;;;
-;;; emms-add-m3u-playlist displays the first track on the
-;;; mode-line.
-;;;
-;;; Not all of the methods for adding tracks behave correctly in
-;;; regards to marking the current track. Stress test this.
-
;;; Code:
;;; --------------------------------------------------------
@@ -34,6 +26,9 @@
(defvar emms-playlist-mode-switched-buffer nil
"Last buffer visited before calling `emms-playlist-mode-switch-buffer'.")
+(defvar emms-playlist-mode-window-width -25
+ "Width for the emms-playlist-mode pop-up window.")
+
;; The marker is unique for each playlist buffer
(make-variable-buffer-local
'emms-playlist-mode-selected-overlay-marker)
@@ -75,24 +70,26 @@
(defconst emms-playlist-mode-map
(let ((emms-playlist-mode-map (make-sparse-keymap)))
(set-keymap-parent emms-playlist-mode-map text-mode-map)
- (define-key emms-playlist-mode-map (kbd "n") 'emms-next)
- (define-key emms-playlist-mode-map (kbd "p") 'emms-previous)
(define-key emms-playlist-mode-map (kbd "C-x C-s") 'emms-playlist-mode-save-buffer)
- (define-key emms-playlist-mode-map (kbd "C-k") 'emms-playlist-mode-kill-track)
(define-key emms-playlist-mode-map (kbd "C-y") 'emms-playlist-mode-yank)
- (define-key emms-playlist-mode-map (kbd "d") 'emms-playlist-mode-kill-track)
+ (define-key emms-playlist-mode-map (kbd "C-k") 'emms-playlist-mode-kill-track)
+ (define-key emms-playlist-mode-map (kbd "C-w") 'emms-playlist-mode-kill)
+ (define-key emms-playlist-mode-map (kbd "C-n") 'next-line)
+ (define-key emms-playlist-mode-map (kbd "C-p") 'previous-line)
+ (define-key emms-playlist-mode-map (kbd "C-j") 'emms-playlist-mode-insert-newline)
+ (define-key emms-playlist-mode-map (kbd "M-y") 'emms-playlist-mode-yank-pop)
+ (define-key emms-playlist-mode-map (kbd "M-<") 'emms-playlist-mode-first)
+ (define-key emms-playlist-mode-map (kbd "M->") 'emms-playlist-mode-last)
+ (define-key emms-playlist-mode-map (kbd "n") 'emms-next)
+ (define-key emms-playlist-mode-map (kbd "p") 'emms-previous)
(define-key emms-playlist-mode-map (kbd "s") 'emms-stop)
(define-key emms-playlist-mode-map (kbd "f") 'emms-show)
(define-key emms-playlist-mode-map (kbd "c") 'emms-playlist-mode-center-current)
- (define-key emms-playlist-mode-map (kbd "RET") 'emms-playlist-mode-play-current-track)
(define-key emms-playlist-mode-map (kbd "q") 'bury-buffer)
- (define-key emms-playlist-mode-map (kbd "<mouse-2>") 'emms-playlist-mode-play-current-track)
(define-key emms-playlist-mode-map (kbd "?") 'describe-mode)
- (define-key emms-playlist-mode-map (kbd "M-<") 'emms-playlist-mode-first)
- (define-key emms-playlist-mode-map (kbd "M->") 'emms-playlist-mode-last)
- (define-key emms-playlist-mode-map (kbd "C-n") 'emms-playlist-mode-select-next)
- (define-key emms-playlist-mode-map (kbd "C-p") 'emms-playlist-mode-select-previous)
(define-key emms-playlist-mode-map (kbd "r") 'emms-random)
+ (define-key emms-playlist-mode-map (kbd "<mouse-2>") 'emms-playlist-mode-play-current-track)
+ (define-key emms-playlist-mode-map (kbd "RET") 'emms-playlist-mode-play-current-track)
emms-playlist-mode-map)
"Keymap for `emms-playlist-mode'.")
@@ -139,47 +136,6 @@ FUN should be a function."
(emms-stop))
(emms-start))
-;; Buggy
-(defun emms-playlist-mode-yank ()
- "Yank the last Emms track killed into the buffer."
- (interactive)
- (let ((track nil)
- (start nil))
- (with-temp-buffer
- (yank)
- (setq track (get-text-property (point-min) 'emms-track)))
- (if track
- (funcall emms-playlist-insert-track-function track)
- (error "No playlist info to yank"))))
-
-;; The logic for killing tracks in an interactive manner is
-;; suprisingly annoying
-(defun emms-playlist-mode-kill-track ()
- "Kill the track at point."
- (interactive)
- (let ((region (emms-property-region (point) 'emms-track))
- (inhibit-read-only t))
- (cond ((not (emms-playlist-track-at))
- (kill-line 1) (current-kill 1))
- ((and (not (emms-playlist-mode-selected-at))
- (emms-playlist-track-at))
- (kill-region (car region)
- (cdr region))
- (emms-playlist-mode-kill-track))
- ((and emms-player-playing-p
- (emms-playlist-mode-selected-at))
- (emms-stop)
- (emms-next-noerror)
- (kill-region (car region)
- (cdr region))
- (emms-playlist-mode-kill-track))
- ((and (not emms-player-playing-p)
- (emms-playlist-mode-selected-at))
- (kill-region (car region)
- (cdr region))
- (emms-playlist-mode-kill-track))
- (t (error "Cannot kill content at point")))))
-
(defun emms-playlist-mode-switch-buffer ()
"Switch to the playlist buffer and then switch back if called again.
@@ -193,6 +149,69 @@ function switches back to the remembered buffer."
(setq emms-playlist-mode-switched-buffer (current-buffer))
(switch-to-buffer emms-playlist-buffer)))
+(defun emms-playlist-mode-insert-newline ()
+ "Insert a newline at point."
+ (interactive)
+ (let ((inhibit-read-only t))
+ (newline)))
+
+;;; --------------------------------------------------------
+;;; Killing and yanking
+;;; --------------------------------------------------------
+
+(defun emms-playlist-mode-between-p (p a b)
+ "Return t if P is a point between points A and B."
+ (if (eq a b)
+ nil
+ (eq p (cadr (sort (list a b p) #'<=)))))
+
+;; C-k
+(defun emms-playlist-mode-kill-track ()
+ "Kill track at point."
+ (interactive)
+ (let ((track (emms-playlist-track-at))
+ (inhibit-read-only t))
+ (if track
+ (let ((track-region (emms-property-region (point)
+ 'emms-track)))
+ (when (and emms-player-playing-p
+ (equal (emms-playlist-selected-track) track))
+ (emms-stop))
+ (remove-overlays (point-at-bol) (point-at-eol))
+ (kill-region (car track-region) (cdr track-region)))
+ (kill-line))))
+
+;; C-w
+(defun emms-playlist-mode-kill ()
+ "Kill from mark to point."
+ (interactive)
+ (let ((inhibit-read-only t)
+ (m (mark)) ; throw error if no mark
+ (p (point))
+ (sm emms-playlist-selected-marker))
+ (kill-region p m)
+ (when (emms-playlist-mode-between-p
+ (marker-position sm) p m)
+ (setq emms-playlist-selected-marker nil)
+ (setq emms-playlist-mode-selected-overlay-marker nil)
+ (emms-stop)))) ; regardless of state
+
+;; C-y
+(defun emms-playlist-mode-yank ()
+ "Yank into the playlist buffer."
+ (interactive)
+ (let ((inhibit-read-only t))
+ (emms-playlist-mode-remove-overlay-selected)
+ (yank)
+ (emms-playlist-mode-overlay-selected)))
+
+;; M-y
+(defun emms-playlist-mode-yank-pop ()
+ "Cycle through the kill-ring."
+ (interactive)
+ (let ((inhibit-read-only t))
+ (yank-pop)))
+
;;; --------------------------------------------------------
;;; Overlay
;;; --------------------------------------------------------
@@ -219,21 +238,25 @@ FACE should be a... face."
(defun emms-playlist-mode-overlay-selected ()
"Place an overlay over the currently selected track."
- (unless (null emms-playlist-mode-selected-overlay-marker)
- (save-excursion
- (goto-char emms-playlist-mode-selected-overlay-marker)
- (remove-overlays (point-at-bol)
- (point-at-eol))
- (emms-playlist-mode-overlay-at-point
- 'emms-playlist-track-face 1)))
+ (emms-playlist-mode-remove-overlay-selected)
(save-excursion
(goto-char emms-playlist-selected-marker)
(setq emms-playlist-mode-selected-overlay-marker
(point-marker))
(setq emms-playlist-mode-selected-overlay
- (emms-playlist-mode-overlay-at-point
+ (emms-playlist-mode-overlay-at-point
'emms-playlist-selected-face 2))))
+(defun emms-playlist-mode-remove-overlay-selected ()
+ "Remove the overlay from the currently selected track"
+ (unless (null emms-playlist-mode-selected-overlay-marker)
+ (save-excursion
+ (goto-char emms-playlist-mode-selected-overlay-marker)
+ (remove-overlays (point-at-bol)
+ (point-at-eol))
+ (emms-playlist-mode-overlay-at-point
+ 'emms-playlist-track-face 1))))
+
;;; --------------------------------------------------------
;;; Saving/Restoring
;;; --------------------------------------------------------
@@ -332,16 +355,13 @@ of the saved playlist inside."
emms-playlist-buffer-p)
(emms-playlist-mode))))
-(defvar emms-playlist-window-width -25
- "Window width for the emms-playlist window when it's popuped.")
-
(defun emms-playlist-mode-go-popup (&optional window-width)
"Popup emms-playlist buffer as a side window. Default value for
-WINDOW-WIDTH is `emms-playlist-window-width'."
+WINDOW-WIDTH is `emms-playlist-mode-window-width'."
(interactive)
- (setq emms-playlist-window-width
- (or window-width emms-playlist-window-width))
- (split-window-horizontally emms-playlist-window-width)
+ (setq emms-playlist-mode-window-width
+ (or window-width emms-playlist-mode-window-width))
+ (split-window-horizontally emms-playlist-mode-window-width)
(other-window 1)
(emms-playlist-mode-go))