aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/pd-mode.el164
1 files changed, 164 insertions, 0 deletions
diff --git a/scripts/pd-mode.el b/scripts/pd-mode.el
new file mode 100644
index 00000000..c18ee920
--- /dev/null
+++ b/scripts/pd-mode.el
@@ -0,0 +1,164 @@
+;;; pd-mode.el --- major mode for editing Pd configuration files
+
+;; Author: Hans-Christoph Steiner <hans@at.or.at>
+;; Keywords: languages, faces
+;; Last edit:
+;; Version: 1.0.1
+
+;; This file is an add-on for XEmacs or GNU Emacs (not tested with the latter).
+;;
+;; It 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.x
+;;
+;; It 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 your copy of Emacs; see the file COPYING. If not, write
+;; to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; There isn't really much to say. The list of keywords was derived from
+;; the Pd there may be some errors or omissions.
+;;
+;; There are currently no local keybindings defined, but the hooks are
+;; there in the event that anyone gets around to adding any.
+;;
+;; To enable automatic selection of this mode when appropriate files are
+;; visited, add the following to your favourite site or personal Emacs
+;; configuration file:
+;;
+;; (autoload 'pd-mode "pd-mode" "autoloaded" t)
+;; (add-to-list 'auto-mode-alist '("\\.max$" . pd-mode))
+;; (add-to-list 'auto-mode-alist '("\\.pd$" . pd-mode))
+;;
+
+;;; Code:
+
+;; Requires
+(require 'regexp-opt)
+
+
+;; Variables
+(defvar pd-mode-map nil
+ "Keymap used for Pd file buffers")
+
+(defvar pd-mode-syntax-table nil
+ "Pd file mode syntax table")
+
+(defvar pd-mode-hook nil
+ "*List of hook functions run by `pd-mode' (see `run-hooks')")
+
+
+;; Font lock
+(defconst pd-font-lock-keywords
+ (purecopy
+ (list
+ (list (concat ; object types
+ "^#X \\("
+ (regexp-opt '("canvas" "connect" "floatatom" "msg"
+ "obj" "restore" "scalar" "struct"
+ "symbolatom" "text"))
+ "\\) ")
+ 1 'font-lock-type-face)
+
+ ; connect numbers
+ (list "^#X connect \\([0-9]+\\) [0-9]+ [0-9]+ [0-9]+"
+ 1 'font-lock-variable-name-face)
+ (list "^#X connect [0-9]+ \\([0-9]+\\) [0-9]+ [0-9]+"
+ 1 'font-lock-function-name-face)
+ (list "^#X connect [0-9]+ [0-9]+ \\([0-9]+\\) [0-9]+"
+ 1 'font-lock-variable-name-face)
+ (list "^#X connect [0-9]+ [0-9]+ [0-9]+ \\([0-9]+\\)"
+ 1 'font-lock-function-name-face)
+
+ ; x y coords
+ (list "^#X [a-z]+ \\([0-9]+ [0-9]+\\) "
+ 1 'font-lock-reference-face)
+
+; terminating semi-colon
+ (list ";$" 0 'font-lock-warning-face t)
+
+ (list "\\(^#X\\)" 0 'font-lock-builtin-face t)
+
+ (list "\\(^#N\\)" 0 'font-lock-constant-face t)
+
+; (list "^#N.*$" 0 'font-lock-comment-face t)
+
+ (list (concat ; object names
+ "\\Wobj\\W[0-9]+\\W[0-9]+\\W\\("
+ (regexp-opt '("+" "+~" "-" "-~"
+ "a2l" "adc~" "any2list" "bang" "bng" "cnv"
+ "dac~" "del" "delay"
+ "expr"
+ "f" "float"
+ "hsl"
+ "i" "int" "loadbang"
+ "makefilename" "metro" "mod"
+ "openpanel"
+ "pack" "pddp" "pddplink"
+ "print"
+ "r" "route"
+ "s" "savepanel" "sel" "select" "symbol"
+ "t" "tgl" "trigger"
+ "unpack" "vsl"))
+ "\\)\\W")
+ 1 'font-lock-constant-face)))
+ "Expressions to highlight in Pd config buffers.")
+
+(put 'pd-mode 'font-lock-defaults '(pd-font-lock-keywords nil t
+ ((?_ . "w")
+ (?- . "w"))))
+;; Syntax table
+(if pd-mode-syntax-table
+ nil
+ (setq pd-mode-syntax-table (copy-syntax-table nil))
+ (modify-syntax-entry ?_ "_" pd-mode-syntax-table)
+ (modify-syntax-entry ?- "_" pd-mode-syntax-table)
+ (modify-syntax-entry ?\( "(\)" pd-mode-syntax-table)
+ (modify-syntax-entry ?\) ")\(" pd-mode-syntax-table)
+ (modify-syntax-entry ?\< "(\>" pd-mode-syntax-table)
+ (modify-syntax-entry ?\> ")\<" pd-mode-syntax-table)
+ (modify-syntax-entry ?\" "\"" pd-mode-syntax-table))
+
+
+;;;###autoload
+(defun pd-mode ()
+ "Major mode for editing Pd configuration files.
+
+\\{pd-mode-map}
+
+\\[pd-mode] runs the hook `pd-mode-hook'."
+ (interactive)
+ (kill-all-local-variables)
+ (use-local-map pd-mode-map)
+ (set-syntax-table pd-mode-syntax-table)
+
+ (make-local-variable 'comment-start)
+ (setq comment-start "#N ")
+ (make-local-variable 'comment-start-skip)
+ (setq comment-start-skip "#\\W*")
+ (make-local-variable 'comment-column)
+ (setq comment-column 48)
+
+ ;;font-lock stuff (may not be initially necessary for XEmacs)
+ (font-lock-mode 1)
+ (setq font-lock-keywords pd-font-lock-keywords)
+ (font-lock-fontify-buffer)
+
+ (setq mode-name "Pd")
+ (setq major-mode 'pd-mode)
+
+ (run-hooks 'pd-mode-hook))
+
+
+;; Provides
+(provide 'pd-mode)
+
+;;; pd-mode.el ends here