help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Howto change [enter] behaviour?


From: François Fleuret
Subject: Howto change [enter] behaviour?
Date: 14 Feb 2003 09:09:51 +0100
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2

Hi,

I am writing a major mode to play mp3s (I know something like this
already exists, but mine is simpler and it was more an exercice in
elisp than a real project ... anyway). My only problem so far is how
to change the behaviour of the [enter] key. How am I supposed to do
that ?

Thanks in advance,

FF

;; -*-Emacs-Lisp-*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; This program is free software; you can redistribute it and/or              ;;
;; modify it under the terms of the GNU General Public License                ;;
;; version 2 as published by the Free Software Foundation.                    ;;
;;                                                                            ;;
;; 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.                                   ;;
;;                                                                            ;;
;; Written and (c) by François Fleuret                                        ;;
;; Contact <francois.fleuret@noos.fr> for comment & bug reports               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; A very (I mean it) simple mp3 handling mode for emacs. Tested with
;; emacs-21.2 on GNU/Linux Debian.

;; Just add in your .emacs :
;;
;; (load "mp3play.el")
;; (setq mp3play-playlist '("~/my_mp3_dir" "/nfs/stuff/my_other_dir"))
;;
;; and invoke the player with M-x mp3play. You can also add :
;;
;; (define-key global-map [(meta \\)] 'mp3play)
;;
;; So that meta-\ goes to mp3play. Type 'h' for help, ' ' to play a
;; song and 'q' to burry the buffer.

(defvar mp3play-mode-map nil "Keymap for mp3play mode")
(defvar mp3play-playlist nil "List of the directories containing the mp3s for 
mp3play")
(defvar mp3play-player "mpg321" "Program to use to play mp3s")
(defvar mp3play-mode-hook nil "List of hook functions run by `mp3play-mode' 
(see `run-hooks')")

(setq mpg321-process nil)

(defun mp3play-kill () (interactive)
  (kill-buffer (get-buffer "*mp3play*")))

(defun mp3play-quit () (interactive)
  (bury-buffer))

(defun mp3play-help () (interactive)
  (message "<space> play, <h> help, <n> next, <k> kill, <p> previous, <q> quit, 
<r> refresh list, <s> stop, <?> properties"))

(defun mp3play-play () "Starts mpg321 with the mp3 at the point" (interactive)
  (let ((filename (get-text-property (point) 'filename)))
    (when filename

      (when mpg321-process
        (delete-process mpg321-process)
        (message "Stoping current song!")
        (sleep-for 0.1))

      (setq mpg321-process (start-process "mp3player" nil mp3play-player 
filename))
      (sleep-for 0.1)

      (when (not (eq (process-status mpg321-process) 'run))
        (message (concat mp3play-player " Error! (sound device already in use ? 
non-existing file ?)"))
        (setq mpg321-process nil))

      (when mpg321-process
        (message (format "Play \"%s\"" filename)))
      )))

(defun mp3play-stop () (interactive)
  (if (not mpg321-process) (message "Not playing!")
    (delete-process mpg321-process)
    (message "Stopped")
    (setq mpg321-process nil))
  )

;; Handling of properties

(defun mp3play-current-filename ()
  (get-text-property (point) 'filename))

(defun mp3play-show-properties ()
  (interactive)
  (message (format "File \"%s\"" (mp3play-current-filename)))
  )

;; (defun mp3play-set-properties (filename &rest l)
;;   (let ((start (text-property-any (point-min) (point-max) 'filename 
filename))
;;         (end (and start (next-single-property-change start 'filename))))
;;     (if start
;;         (eval `(add-text-properties start end ,@l)))))

;; (defun mp3play-line-string (props)
;;   )

;; Here we add a new line with a given filename. Remove existing lines
;; with the same filename property

(defun mp3play-add-file (filename)
  (when (file-regular-p filename)

    (with-current-buffer (get-buffer "*mp3play*")

      (let ((start (text-property-any (point-min) (point-max) 'filename 
filename)))
        (if start
            (progn
              (goto-char start)
              (kill-region (line-beginning-position) (1+ (line-end-position))))
          (end-of-buffer)))

      (let ((s (format "%s\n" (file-name-nondirectory filename))))
        (add-text-properties 0 (1- (length s))
                             (list 'filename filename)
                             s)
        (insert s))
      ))
  )

(defun mp3play-add-directory (dir) (interactive)
  (mapc (lambda (filename) ()
          (mp3play-add-file (command-line-normalize-file-name (concat dir "/" 
filename))))
        (directory-files dir))
  t)

(defun mp3play-refresh-list () (interactive)

  (switch-to-buffer (get-buffer "*mp3play*"))
  (kill-region (point-min) (point-max))
  (mapc (lambda (dir) () (mp3play-add-directory (expand-file-name dir)))
        mp3play-playlist)
  (goto-char (point-min))

  )

(defun mp3play-mode ()
  "Major mode to play mp3s taken in various directories"
  (interactive)

  (unless mp3play-mode-map
    (setq mp3play-mode-map (make-keymap))
    (suppress-keymap mp3play-mode-map)
    (define-key mp3play-mode-map "n" 'next-line)
    (define-key mp3play-mode-map "p" 'previous-line)
    (define-key mp3play-mode-map "q" 'mp3play-quit)
    (define-key mp3play-mode-map "k" 'mp3play-kill)
    (define-key mp3play-mode-map " " 'mp3play-play)
    (define-key mp3play-mode-map "r" 'mp3play-refresh-list)
    (define-key mp3play-mode-map "s" 'mp3play-stop)
    (define-key mp3play-mode-map "h" 'mp3play-help)
    (define-key mp3play-mode-map "?" 'mp3play-show-properties)
    (define-key mp3play-mode-map "\C-m" 'next-line)
    )

  (kill-all-local-variables)

  (use-local-map mp3play-mode-map)
  (setq mode-name "Mp3play")
  (setq major-mode 'mp3play-mode)
  (run-hooks 'mp3play-mode-hook)

  )

(defun mp3play () "Switches to the mp3play buffer, creates it if
necessary. This buffer contains the list of all the mp3s from the
directories listed in `mp3play-playlist'. You can invoke mpg321 on a
given mp3 by typing <space> on the mp3 in this buffer. Use 'q' to
burry the buffer, and 'k' to kill it."
  (interactive)
  (if (not (and (boundp 'mp3play-playlist) mp3play-playlist))
      (message "No playlist in mp3play-playlist!")
    (if (get-buffer "*mp3play*")
        (switch-to-buffer (get-buffer "*mp3play*"))
      (switch-to-buffer (get-buffer-create "*mp3play*"))
      (mp3play-mode)
      (mp3play-refresh-list))
    )
  )


reply via email to

[Prev in Thread] Current Thread [Next in Thread]