diff --git a/utils/emacs-format-file.el b/utils/emacs-format-file.el new file mode 100755 index 00000000..95daab43 --- /dev/null +++ b/utils/emacs-format-file.el @@ -0,0 +1,45 @@ +;;; File: emacs-format-file.el +;;; Description: use this for batch indentation with emacs (see indent.sh) +;;; Author: Romain Goffe +;;; Date: 27/10/2010 +;;; Commentary: based on the work of Stan Warford (emacs-format-mode) and Scott Andrew Borton (indent-mode) + +(defun songbook-indent-line () + "Indent current line as SONGBOOK code." + (interactive) + (beginning-of-line) + (if (bobp) + (indent-line-to 0) ; First line is always non-indented + (let ((not-indented t) cur-indent) + (if (looking-at "^[ \t]*\\(\\\\end\\(song\\|verse\\|chorus\\)\\)") ; If the line we are looking at is the end of a block, then decrease the indentation + (progn + (save-excursion + (forward-line -1) + (setq cur-indent (- (current-indentation) 2))) + (if (< cur-indent 0) ; We can't indent past the left margin + (setq cur-indent 0))) + (save-excursion + (while not-indented ; Iterate backwards until we find an indentation hint + (forward-line -1) + (if (looking-at "^[ \t]*\\(\\\\end\\(song\\|verse\\|chorus\\)\\)") ; This hint indicates that we need to indent at the level of the END_ token + (progn + (setq cur-indent (current-indentation)) + (setq not-indented nil)) + (if (looking-at "^[ \t]*\\(\\\\begin\\(song\\|verse\\|chorus\\)\\)") ; This hint indicates that we need to indent an extra level + (progn + (setq cur-indent (+ (current-indentation) 2)) ; Do the actual indenting + (setq not-indented nil)) + (if (bobp) + (setq not-indented nil))))))) + (if cur-indent + (indent-line-to cur-indent) + (indent-line-to 0)))) ; If we didn't see an indentation hint, then allow no indentation + ) + +(defun emacs-format-function () + "Format the whole buffer." + (set (make-local-variable 'indent-line-function) 'songbook-indent-line) + (indent-region (point-min) (point-max) nil) + (untabify (point-min) (point-max)) + (save-buffer) + ) diff --git a/utils/indent.sh b/utils/indent.sh new file mode 100755 index 00000000..08584721 --- /dev/null +++ b/utils/indent.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +#Author: Romain Goffe +#Date: 27/10/2010 +#Descritpion: correctly indent all songs with emacs +#Commentary: can't manage to use a relative path to emacs-format-file.el +# so be sure to indicate the right path + +for song in songs/*/*.sg ; do + emacs -batch $song -l ~/songbook/utils/emacs-format-file.el -f emacs-format-function ; +done;