diff options
author | wenbinye <wenbinye> | 2006-11-21 09:39:00 +0000 |
---|---|---|
committer | wenbinye <mwolson@gnu.org> | 2006-11-21 09:39:00 +0000 |
commit | 557b66c48ac913b29028394a10f836e6022d21e9 (patch) | |
tree | 05de748739ac1daf065eb170586985d81bcabd8d | |
parent | 3b044df7a4b8ccee82809e548692d89e901af8ef (diff) |
Add emms-mark and emms-history
darcs-hash:20061121093951-08d48-1f8e847e723722158371686a8e237205a2d8eae0.gz
-rw-r--r-- | emms-history.el | 103 | ||||
-rw-r--r-- | emms-mark.el | 182 |
2 files changed, 285 insertions, 0 deletions
diff --git a/emms-history.el b/emms-history.el new file mode 100644 index 0000000..2be3bd4 --- /dev/null +++ b/emms-history.el @@ -0,0 +1,103 @@ +;;; emms-history.el.gz --- + +;; Copyright 2006 Ye Wenbin +;; +;; Author: wenbinye@163.com +;; Time-stamp: <Ye Wenbin 2006-11-21 16:57:59> +;; Version: $Id: emms-history.el,v 0.0 <2006-11-21 16:30:22> ywb Exp $ +;; Keywords: +;; X-URL: not distributed yet + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; Save playlists when exit emacs. +;; Next time use M-x emms-playlist-load-saved-list to load saved +;; playlist + +;; Put this file into your load-path and the following into your ~/.emacs: +;; (require 'emms-history) + +;;; Code: + +(provide 'emms-history) +(require 'emms) +(eval-when-compile + (require 'cl)) + +(defvar emms-history-saved-list-file "~/.emacs.d/.emms-history") + +(defun emms-history-save-on-exit () + (when (stringp emms-history-saved-list-file) + (let ((oldbuf emms-playlist-buffer) + emms-playlist-buffer playlists) + (save-excursion + (dolist (buf (remove-if-not 'buffer-live-p + (emms-playlist-buffer-list))) + (set-buffer buf) + (when (> (buffer-size) 0) ; make sure there is track in the buffer + (setq emms-playlist-buffer buf + playlists + (cons + (list (buffer-name) + (or + (and emms-playlist-selected-marker + (marker-position emms-playlist-selected-marker)) + (point-min)) + (save-excursion + (widen) + (nreverse + (emms-playlist-tracks-in-region (point-min) + (point-max))))) + playlists)))) + (with-temp-buffer + (insert "(\n;; active playlist\n") + (prin1 (buffer-name oldbuf) (current-buffer)) + (insert "\n;; playlists: ((BUFFER_NAME SELECT_POSITION TRACKS) ...)\n") + (prin1 playlists (current-buffer)) + (insert "\n;; play method\n") + (prin1 `((emms-repeat-track . ,emms-repeat-track) + (emms-repeat-playlist . ,emms-repeat-playlist)) + (current-buffer)) + (insert "\n)") + (write-file emms-history-saved-list-file)))))) + +(add-hook 'kill-emacs-hook 'emms-history-save-on-exit) + +(defun emms-history-load-saved-list () + (interactive) + (when (and (stringp emms-history-saved-list-file) + (file-exists-p emms-history-saved-list-file)) + (let (history buf) + (with-temp-buffer + (insert-file-contents emms-history-saved-list-file) + (setq history (read (current-buffer))) + (dolist (playlist (cadr history)) + (with-current-buffer (emms-playlist-new (car playlist)) + (setq emms-playlist-buffer (current-buffer)) + (if (string= (car playlist) (car history)) + (setq buf (current-buffer))) + (mapc 'emms-playlist-insert-track + (nth 2 playlist)) + (condition-case nil + (emms-playlist-select (cadr playlist)) + (error nil)))) + (setq emms-playlist-buffer buf) + (dolist (method (nth 2 history)) + (set (car method) (cdr method))) + (emms-start))))) + +;;; emms-history.el ends here diff --git a/emms-mark.el b/emms-mark.el new file mode 100644 index 0000000..bd9814f --- /dev/null +++ b/emms-mark.el @@ -0,0 +1,182 @@ +;;; emms-mark.el.gz --- + +;; Copyright 2006 Ye Wenbin +;; +;; Author: wenbinye@163.com +;; Time-stamp: <Ye Wenbin 2006-11-21 17:02:28> +;; Version: $Id: emms-mark.el,v 0.0 <2006-11-21 14:06:38> ywb Exp $ +;; Keywords: +;; X-URL: not distributed yet + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; Provide mark operation to tracks + +;; Put this file into your load-path and the following into your ~/.emacs: +;; (require 'emms-mark) + +;;; Code: + +(provide 'emms-mark) +(require 'emms) +(eval-when-compile + (require 'cl)) + +;;{{{ set new description-function +(defun emms-mark-track-description (track) + "Return a description of the current track." + (concat " " ; for mark char + (let ((artist (emms-track-get track 'info-artist)) + (title (emms-track-get track 'info-title))) + (if (and artist title) + (format "%s - %s" artist title) + (emms-track-simple-description track))))) + +(setq emms-track-description-function 'emms-mark-track-description) +;;}}} + +;;{{{ functions to mark tracks +(defvar emms-mark-char ?*) +(defvar emms-mark-face-alist + '((?* . font-lock-warning-face) + (?\040 . emms-playlist-track-face))) + +(defun emms-mark-track (&optional arg) + (interactive "p") + (or arg (setq arg 1)) + (let ((face (assoc-default emms-mark-char emms-mark-face-alist)) + buffer-read-only track) + (save-excursion + (beginning-of-line) + (while (and (not (eobp)) + (> arg 0)) + (setq track (get-text-property (point) 'emms-track)) + (delete-char 1) + (insert (propertize (string emms-mark-char) + 'emms-track track)) + (backward-char 1) + (put-text-property (point) (progn (forward-line 1) (point)) + 'face face) + (setq arg (1- arg)))))) + +(defun emms-mark-unmark-track (&optional arg) + (interactive "p") + (let ((emms-mark-char ?\040)) + (emms-mark-track arg))) + +(defun emms-mark-forward (arg) + (interactive "p") + (emms-mark-track arg) + (forward-line arg)) + +(defun emms-mark-unmark-forward (arg) + (interactive "p") + (emms-mark-unmark-track arg) + (forward-line arg)) + +(defun emms-mark-all () + (interactive) + (save-excursion + (goto-char (point-min)) + (emms-mark-track (count-lines (point-min) (point-max))))) + +(defun emms-mark-unmark-all () + (interactive) + (emms-mark-do-with-marked-track 'emms-mark-unmark-track)) + +(defun emms-mark-regexp (regexp) + (interactive "sMark track match: ") + (save-excursion + (goto-char (point-min)) + (while (re-search-forward regexp nil t) + (emms-mark-track 1) + (forward-line 1)))) + +(defun emms-mark-unmark-regexp (regexp) + (interactive "sUnmark track match: ") + (let ((emms-mark-char ?\040)) + (emms-mark-regexp regexp))) + +(defun emms-mark-toggle () + (interactive) + (save-excursion + (goto-char (point-min)) + (let (buffer-read-only) + (while (not (eobp)) + (if (eq ?\040 (following-char)) + (emms-mark-track) + (emms-mark-unmark-track)) + (forward-line 1))))) +;;}}} + +;;{{{ functions to operate marked tracks +(defun emms-mark-do-with-marked-track (func) + (let ((regexp (format "^[%c]" emms-mark-char))) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward regexp nil t) + (backward-char 1) ; move to beginning of line + (funcall func))))) + +(defun emms-mark-mapcar-marked-track (func) + (let (result) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward "^[*]" nil t) + (backward-char 1) ; move to beginning of line + (setq result (cons (funcall func) result))) + (nreverse result)))) + +(defun emms-mark-delete-marked-tracks () + (interactive) + (emms-with-inhibit-read-only-t + (emms-mark-do-with-marked-track + (lambda nil (delete-region (point) + (progn (forward-line 1) (point))))))) + +(defun emms-mark-kill-marked-tracks () + (interactive) + (let (tracks buffer-read-only) + (emms-mark-do-with-marked-track + (lambda nil + (setq tracks + (concat tracks + (delete-and-extract-region (point) + (progn (forward-line 1) (point))))))) + (kill-new tracks))) + +(defun emms-mark-copy-marked-tracks () + (interactive) + (let (tracks) + (emms-mark-do-with-marked-track + (lambda nil + (setq tracks + (concat tracks + (buffer-substring (point) + (progn (forward-line 1) (point))))))) + (kill-new tracks))) +;;}}} + +(let ((map emms-playlist-mode-map)) + (define-key map "m" 'emms-mark-forward) + (define-key map "u" 'emms-mark-unmark-forward) + (define-key map "U" 'emms-mark-unmark-all) + (define-key map "t" 'emms-mark-toggle) + (define-key map "%m" 'emms-mark-regexp) + (define-key map "%u" 'emms-mark-unmark-regexp)) + +;;; emms-mark.el ends here |