-;;;
-;;; lilypond-mode.el --- Major mode for editing GNU LilyPond music scores
-;;;
-;;; source file of the GNU LilyPond music typesetter
-;;;
-;;; (c) 1999--2005 Jan Nieuwenhuizen <janneke@gnu.org>
-;;;
-;;; Changed 2001--2003 Heikki Junes <heikki.junes@hut.fi>
-;;; * Add PS-compilation, PS-viewing and MIDI-play (29th Aug 2001)
-;;; * Keyboard shortcuts (12th Sep 2001)
-;;; * Inserting tags, inspired on sgml-mode (11th Oct 2001)
-;;; * Autocompletion & Info (23rd Nov 2002)
+;;;;
+;;;; lilypond-mode.el --- Major mode for editing GNU LilyPond music scores
+;;;;
+;;;; source file of the GNU LilyPond music typesetter
+;;;;
+;;;; (c) 1999--2007 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;;
+;;;; Changed 2001--2003 Heikki Junes <heikki.junes@hut.fi>
+;;;; * Add PS-compilation, PS-viewing and MIDI-play (29th Aug 2001)
+;;;; * Keyboard shortcuts (12th Sep 2001)
+;;;; * Inserting tags, inspired on sgml-mode (11th Oct 2001)
+;;;; * Autocompletion & Info (23rd Nov 2002)
;;; Inspired on auctex
(require 'easymenu)
(require 'compile)
-(defconst LilyPond-version "2.3.17"
+(defconst LilyPond-version "2.5.20"
"`LilyPond-mode' version number.")
(defconst LilyPond-help-address "bug-lilypond@gnu.org"
(defun LilyPond-running ()
"Check the currently running LilyPond compiling jobs."
- (let ((process-names (list "lilypond" "tex" "2dvi" "2ps" "2midi"
+ (let ((process-names (list "lilypond" "tex" "2ps" "2midi"
"book" "latex"))
(running nil))
(while (setq process-name (pop process-names))
;; variable instead of quering the user.
(defvar LilyPond-command-force nil)
-(defcustom LilyPond-xdvi-command "xdvi"
- "Command used to display DVI files."
-
+(defcustom LilyPond-lilypond-command "lilypond"
+ "Command used to compile LY files."
:group 'LilyPond
:type 'string)
-(defcustom LilyPond-gv-command "gv -watch"
+(defcustom LilyPond-ps-command "gv --watch"
"Command used to display PS files."
:group 'LilyPond
:type 'string)
+(defcustom LilyPond-pdf-command "xpdf"
+ "Command used to display PDF files."
+
+ :group 'LilyPond
+ :type 'string)
+
(defcustom LilyPond-midi-command "timidity"
"Command used to play MIDI files."
(interactive)
(LilyPond-command (LilyPond-command-menu "MidiAll") 'LilyPond-get-master-file))
+(defun count-matches-as-number (re)
+ "Count-matches in emacs 22 backwards-incompatibly returns a number"
+ (let ((result (count-matches re)))
+ (if (stringp result)
+ (string-to-number result)
+ result)))
+
(defun count-rexp (start end rexp)
"Print number of found regular expressions in the region."
(interactive "r")
(save-restriction
(narrow-to-region start end)
(goto-char (point-min))
- (count-matches rexp))))
+ (count-matches-as-number rexp))))
(defun count-midi-words ()
"Check number of midi-scores before the curser."
(let ((fnameprefix (if (eq LilyPond-command-current 'LilyPond-command-master)
(substring (LilyPond-get-master-file) 0 -3); suppose ".ly"
LilyPond-region-file-prefix))
- (allcount (string-to-number (substring (count-midi-words) 0 -12)))
- (count (string-to-number (substring (count-midi-words-backwards) 0 -12))))
+ (allcount (count-midi-words))
+ (count (count-midi-words-backwards)))
(concat fnameprefix
(if (and (> allcount 1) (> count 0)) ; not first score
(if (eq count allcount) ; last score
(let ((fnameprefix (if (eq LilyPond-command-current 'LilyPond-command-master)
(substring (LilyPond-get-master-file) 0 -3); suppose ".ly"
LilyPond-region-file-prefix))
- (allcount (string-to-number (substring (count-midi-words) 0 -12))))
+ (allcount (count-midi-words)))
(concat (if (> allcount 0) ; at least one midi-score
(concat fnameprefix ".midi "))
(if (> allcount 1) ; more than one midi-score
;; Should expand this to include possible keyboard shortcuts which
;; could then be mapped to define-key and menu.
`(
- ("LilyPond" . ("lilypond -ftex %s" "%s" "%l" "View"))
- ("TeX" . ("tex '\\nonstopmode\\input %t'" "%t" "%d" "View"))
-
- ("2Dvi" . ("lilypond -f tex %s" "%s" "%d" "LaTeX"))
- ("2PS" . ("lilypond -f ps %s" "%s" "%p" "ViewPS"))
- ("2Midi" . ("lilypond -m %s" "%s" "%m" "Midi"))
+ ("LilyPond" . (,(concat LilyPond-lilypond-command " %s") "%s" "%l" "View"))
+ ("2PS" . (,(concat LilyPond-lilypond-command " -f ps %s") "%s" "%p" "ViewPS"))
+ ("2Gnome" . (,(concat LilyPond-lilypond-command " -b gnome %s")))
("Book" . ("lilypond-book %x" "%x" "%l" "LaTeX"))
- ("LaTeX" . ("latex '\\nonstopmode\\input %l'" "%l" "%d" "View"))
-
- ;; point-n-click (arg: exits upop USR1)
- ("SmartView" . ("xdvi %d"))
+ ("LaTeX" . ("latex '\\nonstopmode\\input %l'" "%l" "%d" "ViewDVI"))
;; refreshes when kicked USR1
- ("View" . (,(concat LilyPond-xdvi-command " %d")))
- ("ViewPS" . (,(concat LilyPond-gv-command " %p")))
+ ("View" . (,(concat LilyPond-pdf-command " %f")))
+ ("ViewPDF" . (,(concat LilyPond-pdf-command " %f")))
+ ("ViewPS" . (,(concat LilyPond-ps-command " %p")))
;; The following are refreshed in LilyPond-command:
;; - current-midi depends on cursor position and
- ("Midi" . (,(concat LilyPond-midi-command " " (LilyPond-string-current-midi)))) ;
+ ("Midi" . ("")) ;
;; - all-midi depends on number of midi-score.
- ("MidiAll" . (,(concat LilyPond-all-midi-command " " (LilyPond-string-all-midi))))
+ ("MidiAll" . (""))
)
"AList of commands to execute on the current document.
("%s" . ".ly")
("%t" . ".tex")
("%d" . ".dvi")
+ ("%f" . ".pdf")
("%p" . ".ps")
("%l" . ".tex")
("%x" . ".tely")
(LilyPond-command (LilyPond-command-menu "LilyPond") 'LilyPond-get-master-file)
)
-(defun LilyPond-command-formatdvi ()
- "Format the dvi output of the current document."
- (interactive)
- (LilyPond-command (LilyPond-command-menu "2Dvi") 'LilyPond-get-master-file)
-)
-
(defun LilyPond-command-formatps ()
"Format the ps output of the current document."
(interactive)
(LilyPond-command (LilyPond-command-menu "2PS") 'LilyPond-get-master-file)
)
+(defun LilyPond-command-formatgnome ()
+ "Format the gnome output of the current document."
+ (interactive)
+ (LilyPond-command (LilyPond-command-menu "2Gnome") 'LilyPond-get-master-file))
+
(defun LilyPond-command-formatmidi ()
"Format the midi output of the current document."
(interactive)
- (LilyPond-command (LilyPond-command-menu "2Midi") 'LilyPond-get-master-file)
-)
+ (LilyPond-command (LilyPond-command-menu "2Midi") 'LilyPond-get-master-file))
-(defun LilyPond-command-smartview ()
- "View the dvi output of current document."
+(defun LilyPond-command-view ()
+ "View the output of current document."
(interactive)
- (LilyPond-command (LilyPond-command-menu "SmartView") 'LilyPond-get-master-file)
-)
+ (LilyPond-command-viewpdf))
-(defun LilyPond-command-view ()
- "View the dvi output of current document."
+(defun LilyPond-command-viewpdf ()
+ "View the ps output of current document."
(interactive)
- (LilyPond-command (LilyPond-command-menu "View") 'LilyPond-get-master-file)
-)
+ (LilyPond-command (LilyPond-command-menu "ViewPDF") 'LilyPond-get-master-file))
(defun LilyPond-command-viewps ()
"View the ps output of current document."
(interactive)
- (LilyPond-command (LilyPond-command-menu "ViewPS") 'LilyPond-get-master-file)
-)
+ (LilyPond-command (LilyPond-command-menu "ViewPS") 'LilyPond-get-master-file))
;; FIXME, this is broken
(defun LilyPond-region-file (begin end)
(base (cadr l)))
(LilyPond-command-expand
(concat (substring string 0 b)
- dir
- base
+ (shell-quote-argument (concat dir base))
(let ((entry (assoc (substring string b e)
LilyPond-expand-alist)))
(if entry (cdr entry) ""))
(while (LilyPond-running)
(message "Starts playing midi once it is built.")
(sit-for 0 100))))))
- (if (member name (list "LilyPond" "TeX" "2Midi" "2PS" "2Dvi"
+ (if (member name (list "LilyPond" "TeX" "2Midi" "2PS"
"Book" "LaTeX"))
(if (setq jobs (LilyPond-running))
(progn
(define-key LilyPond-mode-map "\C-c\C-k" 'LilyPond-kill-jobs)
(define-key LilyPond-mode-map "\C-c\C-c" 'LilyPond-command-master)
(define-key LilyPond-mode-map "\C-cm" 'LilyPond-command-formatmidi)
- (define-key LilyPond-mode-map "\C-c\C-d" 'LilyPond-command-formatdvi)
(define-key LilyPond-mode-map "\C-c\C-f" 'LilyPond-command-formatps)
- (define-key LilyPond-mode-map "\C-c\C-s" 'LilyPond-command-smartview)
- (define-key LilyPond-mode-map "\C-c\C-v" 'LilyPond-command-view)
+ (define-key LilyPond-mode-map "\C-c\C-g" 'LilyPond-command-formatgnome)
+ (define-key LilyPond-mode-map "\C-c\C-s" 'LilyPond-command-view)
(define-key LilyPond-mode-map "\C-c\C-p" 'LilyPond-command-viewps)
(define-key LilyPond-mode-map [(control c) return] 'LilyPond-command-current-midi)
(define-key LilyPond-mode-map [(control c) (control return)] 'LilyPond-command-all-midi)
;;; Some kind of mapping which includes :keys might be more elegant
;;; Put keys to LilyPond-command-alist and fetch them from there somehow.
'([ "LilyPond" LilyPond-command-lilypond t])
- '([ "TeX" (LilyPond-command (LilyPond-command-menu "TeX") 'LilyPond-get-master-file) ])
- '([ "2Dvi" LilyPond-command-formatdvi t])
'([ "2PS" LilyPond-command-formatps t])
'([ "2Midi" LilyPond-command-formatmidi t])
'([ "Book" (LilyPond-command (LilyPond-command-menu "Book") 'LilyPond-get-master-file) ])
'([ "LaTeX" (LilyPond-command (LilyPond-command-menu "LaTeX") 'LilyPond-get-master-file) ])
'([ "Kill jobs" LilyPond-kill-jobs t])
'("-----")
- '([ "SmartView" LilyPond-command-smartview t])
'([ "View" LilyPond-command-view t])
'([ "ViewPS" LilyPond-command-viewps t])
'("-----")
\\{LilyPond-mode-map}
VARIABLES
-LilyPond-command-alist\t\talist from name to command
-LilyPond-xdvi-command\t\tcommand to display dvi files -- bit superfluous"
+LilyPond-command-alist\t\talist from name to command"
(interactive)
;; set up local variables
(kill-all-local-variables)
(defun LilyPond-guile ()
(interactive)
(require 'ilisp)
- (guile "lilyguile" (LilyPond-command-expand (cadr (assoc "2Dvi" LilyPond-command-alist))
+ (guile "lilyguile" (LilyPond-command-expand (cadr (assoc "LilyPond" LilyPond-command-alist))
(funcall 'LilyPond-get-master-file)))
(comint-default-send (ilisp-process) "(define-module (*anonymous-ly-0*))")
(comint-default-send (ilisp-process) "(set! %load-path (cons \"/usr/share/ilisp/\" %load-path))")