X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/473ff3b04bd3d4b67e1db1a418089edbd8cd976b..15581433d63e606b3dcbb6296fef5afbb2c51c27:/dot-emacs.el diff --git a/dot-emacs.el b/dot-emacs.el index 7b7d4d5..e2e8998 100644 --- a/dot-emacs.el +++ b/dot-emacs.el @@ -1,4 +1,4 @@ -;;; -*-emacs-lisp-*- +;;; -*- mode: emacs-lisp; coding: utf-8 -*- ;;; ;;; $Id$ ;;; @@ -13,12 +13,12 @@ ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -34,7 +34,9 @@ "Execute FORMS without allowing errors to propagate outside." `(condition-case err ,(if (cdr forms) (cons 'progn forms) (car forms)) - (error (message "Error (trapped): %s" (error-message-string err))))) + (error (message "Error (trapped): %s in %s" + (error-message-string err) + ',forms)))) ;; --- Configuration reading --- @@ -79,18 +81,37 @@ path. The non-nil value is the filename we found for the library." ;; --- Splitting windows --- -(defconst mdw-scrollbar-width (if window-system 6 1) - "Guessed width of scroll bar.") +(or (and (fboundp 'scroll-bar-columns) + (fboundp 'fringe-columns)) + (progn + (defun scroll-bar-columns (side) + (cond ((eq side 'left) 0) + (window-system 3) + (t 1))) + (defun fringe-columns (side) + (cond ((not window-system) 0) + ((eq side 'left) 1) + (t 2))))) + (defun mdw-divvy-window (&optional w) "Split a wide window into appropriate widths." (interactive) - (or w (setq w 78)) - (let ((win (selected-window)) - (c (/ (+ (window-width) mdw-scrollbar-width) - (+ w mdw-scrollbar-width)))) + (or w (setq w (if (and window-system + (>= emacs-major-version 22)) + 77 + 78))) + (let* ((win (selected-window)) + (sb-width (if (not window-system) + 1 + (+ (scroll-bar-columns 'left) + (scroll-bar-columns 'right) + (fringe-columns 'left) + (fringe-columns 'right)))) + (c (/ (+ (window-width) sb-width) + (+ w sb-width)))) (while (> c 1) (setq c (1- c)) - (split-window-horizontally (+ w mdw-scrollbar-width)) + (split-window-horizontally (+ w sb-width)) (other-window 1)) (select-window win))) @@ -128,6 +149,19 @@ symbols `sunday', `monday', etc. (or a mixture). If the date stored in ;;;----- Utility functions -------------------------------------------------- +(or (fboundp 'line-number-at-pos) + (defun line-number-at-pos (&optional pos) + (let ((opoint (or pos (point))) start) + (save-excursion + (save-restriction + (goto-char (point-min)) + (widen) + (forward-line 0) + (setq start (point)) + (goto-char opoint) + (forward-line 0) + (1+ (count-lines 1 (point)))))))) + ;; --- mdw-uniquify-alist --- (defun mdw-uniquify-alist (&rest alists) @@ -226,9 +260,9 @@ input lists are not modified, although they'll probably become garbage." (interactive) (save-excursion (or arg (progn - (goto-char (point-max)) + (goto-char (point-max)) (insert "\nNP: ") - (insert-file np-file))))) + (insert-file np-file))))) (trap (require 'tramp) @@ -489,11 +523,14 @@ doesn't cope with anything approximating a complicated case." (and mdw-auto-indent (cond ((eq major-mode 'lisp-mode) (local-set-key "\C-m" 'mdw-indent-newline-and-indent)) - ((eq major-mode 'slime-repl-mode) nil) + ((or (eq major-mode 'slime-repl-mode) + (eq major-mode 'asm-mode)) + nil) (t (local-set-key "\C-m" 'newline-and-indent)))) (local-set-key [C-return] 'newline) - (local-set-key [?\;] 'self-insert-command) + (or (eq major-mode 'asm-mode) + (local-set-key [?\;] 'self-insert-command)) (local-set-key [?\#] 'self-insert-command) (local-set-key [?\"] 'self-insert-command) (setq comment-column 40) @@ -543,11 +580,15 @@ doesn't cope with anything approximating a complicated case." ,@(cond ((eq window-system 'w32) '(:family "courier new" :height 85)) ((eq window-system 'x) - '(:family "misc-fixed" :width semi-condensed)))) - (modeline :foreground "blue" :background "yellow" - :box (:line-width 1 :style released-button)) + '(:family "misc-fixed" :height 130 :width semi-condensed)))) + (fixed-pitch) + (minibuffer-prompt) + (mode-line :foreground "blue" :background "yellow" + :box (:line-width 1 :style released-button)) + (mode-line-inactive :foreground "yellow" :background "blue" + :box (:line-width 1 :style released-button)) (scroll-bar :foreground "black" :background "lightgrey") - (fringe :foreground "yellow" :background "grey30") + (fringe :foreground "yellow" :background "black") (show-paren-match-face :background "darkgreen") (show-paren-mismatch-face :background "red") (font-lock-warning-face :background "red" :weight bold) @@ -564,6 +605,9 @@ doesn't cope with anything approximating a complicated case." (mdw-number-face :foreground "yellow") (font-lock-function-name-face :weight bold) (font-lock-variable-name-face :slant italic) + (font-lock-comment-delimiter-face + :foreground ,(if window-system "SeaGreen1" "green") + :slant italic) (font-lock-comment-face :foreground ,(if window-system "SeaGreen1" "green") :slant italic) @@ -617,7 +661,7 @@ doesn't cope with anything approximating a complicated case." (label . 0) (case-label . +) (access-label . -) - (inclass . ++) + (inclass . +) (inline-open . ++) (statement-cont . 0) (statement-case-intro . +))) @@ -638,8 +682,6 @@ doesn't cope with anything approximating a complicated case." (setq c-hanging-comment-ender-p nil) (setq c-backslash-column 72) (setq c-label-minimum-indentation 0) - (setq comment-start "/* ") - (setq comment-end " */") (setq mdw-fill-prefix `((,(concat "\\([ \t]*/?\\)" "\\([\*/][ \t]*\\)" @@ -652,12 +694,12 @@ doesn't cope with anything approximating a complicated case." (make-local-variable 'font-lock-keywords) (let ((c-keywords (make-regexp '( - ;; "and" ;C++ - ;; "and_eq" ;C++ + "and" ;C++ + "and_eq" ;C++ "asm" ;K&R, GCC "auto" ;K&R, C89 - ;; "bitand" ;C++ - ;; "bitor" ;C++ + "bitand" ;C++ + "bitor" ;C++ "bool" ;C++, C9X macro "break" ;K&R, C89 "case" ;K&R, C89 @@ -665,7 +707,7 @@ doesn't cope with anything approximating a complicated case." "char" ;K&R, C89 "class" ;C++ "complex" ;C9X macro, C++ template type - ;; "compl" ;C++ + "compl" ;C++ "const" ;C89 "const_cast" ;C++ "continue" ;K&R, C89 @@ -679,12 +721,12 @@ doesn't cope with anything approximating a complicated case." ;; "entry" ;K&R -- never used "enum" ;C89 "explicit" ;C++ - ;; "export" ;C++ + "export" ;C++ "extern" ;K&R, C89 "false" ;C++, C9X macro "float" ;K&R, C89 "for" ;K&R, C89 - "fortran" ;K&R + ;; "fortran" ;K&R "friend" ;C++ "goto" ;K&R, C89 "if" ;K&R, C89 @@ -696,8 +738,8 @@ doesn't cope with anything approximating a complicated case." "namespace" ;C++ "new" ;C++ "operator" ;C++ - ;; "or" ;C++ - ;; "or_eq" ;C++ + "or" ;C++ + "or_eq" ;C++ "private" ;C++ "protected" ;C++ "public" ;C++ @@ -730,8 +772,8 @@ doesn't cope with anything approximating a complicated case." "volatile" ;C89 "wchar_t" ;C++, C89 library type "while" ;K&R, C89 - ;; "xor" ;C++ - ;; "xor_eq" ;C++ + "xor" ;C++ + "xor_eq" ;C++ "_Bool" ;C9X "_Complex" ;C9X "_Imaginary" ;C9X @@ -761,7 +803,6 @@ doesn't cope with anything approximating a complicated case." (setq font-lock-keywords (list - 't ;; --- Fontify include files as strings --- @@ -842,7 +883,6 @@ doesn't cope with anything approximating a complicated case." (setq font-lock-keywords (list - 't ;; --- Handle the keywords defined above --- @@ -917,7 +957,6 @@ doesn't cope with anything approximating a complicated case." (setq font-lock-keywords (list - 't ;; --- Handle the keywords defined above --- @@ -940,6 +979,94 @@ doesn't cope with anything approximating a complicated case." (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" '(0 mdw-punct-face)))))) +;;;----- C# programming configuration --------------------------------------- + +;; --- Make indentation nice --- + +(defun mdw-csharp-style () + (c-add-style "[mdw] C# style" + '((c-basic-offset . 2) + (c-tab-always-indent . nil) + (c-offsets-alist (substatement-open . 0) + (label . 0) + (case-label . +) + (access-label . 0) + (inclass . +) + (statement-case-intro . +))) + t)) + +;; --- Declare C# fontification style --- + +(defun mdw-fontify-csharp () + + ;; --- Other stuff --- + + (mdw-csharp-style) + (modify-syntax-entry ?_ "w") + (setq c-hanging-comment-ender-p nil) + (setq c-backslash-column 72) + (setq comment-start "/* ") + (setq comment-end " */") + (setq mdw-fill-prefix + `((,(concat "\\([ \t]*/?\\)" + "\\([\*/][ \t]*\\)" + "\\([A-Za-z]+:[ \t]*\\)?" + mdw-hanging-indents) + (pad . 1) (match . 2) (pad . 3) (pad . 4)))) + + ;; --- Now define things to be fontified --- + + (make-local-variable 'font-lock-keywords) + (let ((csharp-keywords + (make-regexp '("abstract" "as" "base" "bool" "break" + "byte" "case" "catch" "char" "checked" + "class" "const" "continue" "decimal" "default" + "delegate" "do" "double" "else" "enum" + "event" "explicit" "extern" "false" "finally" + "fixed" "float" "for" "foreach" "goto" + "if" "implicit" "in" "int" "interface" + "internal" "is" "lock" "long" "namespace" + "new" "null" "object" "operator" "out" + "override" "params" "private" "protected" "public" + "readonly" "ref" "return" "sbyte" "sealed" + "short" "sizeof" "stackalloc" "static" "string" + "struct" "switch" "this" "throw" "true" + "try" "typeof" "uint" "ulong" "unchecked" + "unsafe" "ushort" "using" "virtual" "void" + "volatile" "while" "yield")))) + + (setq font-lock-keywords + (list + + ;; --- Handle the keywords defined above --- + + (list (concat "\\<\\(" csharp-keywords "\\)\\>") + '(0 font-lock-keyword-face)) + + ;; --- Handle numbers too --- + ;; + ;; The following isn't quite right, but it's close enough. + + (list (concat "\\<\\(" + "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|" + "[0-9]+\\(\\.[0-9]*\\|\\)" + "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)" + "[lLfFdD]?") + '(0 mdw-number-face)) + + ;; --- And anything else is punctuation --- + + (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" + '(0 mdw-punct-face)))))) + +(defun csharp-mode () + (interactive) + (java-mode) + (setq major-mode 'csharp-mode) + (setq mode-name "C#") + (mdw-fontify-csharp) + (run-hooks 'csharp-mode-hook)) + ;;;----- Awk programming configuration -------------------------------------- ;; --- Make Awk indentation nice --- @@ -982,7 +1109,6 @@ doesn't cope with anything approximating a complicated case." (setq font-lock-keywords (list - 't ;; --- Handle the keywords defined above --- @@ -1041,7 +1167,6 @@ doesn't cope with anything approximating a complicated case." (setq font-lock-keywords (list - 't ;; --- Set up the keywords defined above --- @@ -1098,7 +1223,6 @@ strip numbers instead." "while" "yield")))) (setq font-lock-keywords (list - 't ;; --- Set up the keywords defined above --- @@ -1177,7 +1301,6 @@ strip numbers instead." (make-local-variable 'font-lock-keywords) (setq font-lock-keywords (list - 't ;; --- Handle numbers too --- ;; @@ -1209,6 +1332,14 @@ strip numbers instead." (run-hooks 'arm-assembler-mode-hook)) +;;;----- Assembler mode ----------------------------------------------------- + +(defun mdw-fontify-asm () + (modify-syntax-entry ?' "\"") + (modify-syntax-entry ?. "w") + (setf fill-prefix nil) + (mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)")) + ;;;----- TCL configuration -------------------------------------------------- (defun mdw-fontify-tcl () @@ -1217,7 +1348,6 @@ strip numbers instead." (make-local-variable 'font-lock-keywords) (setq font-lock-keywords (list - 't (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|" "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)" "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)") @@ -1286,7 +1416,6 @@ strip numbers instead." (setq font-lock-keywords (list - 't ;; --- Set up the keywords defined above --- @@ -1339,7 +1468,6 @@ strip numbers instead." (setq font-lock-keywords (list - 't ;; --- Set up the keywords defined above --- @@ -1350,10 +1478,10 @@ strip numbers instead." (list (concat "\\<\\(\\~\\|\\)" "\\(0\\(\\([wW]\\|\\)[xX][0-9a-fA-F]+\\|" - "[wW][0-9]+\\)\\|" - "\\([0-9]+\\(\\.[0-9]+\\|\\)" - "\\([eE]\\(\\~\\|\\)" - "[0-9]+\\|\\)\\)\\)") + "[wW][0-9]+\\)\\|" + "\\([0-9]+\\(\\.[0-9]+\\|\\)" + "\\([eE]\\(\\~\\|\\)" + "[0-9]+\\|\\)\\)\\)") '(0 mdw-number-face)) ;; --- And anything else is punctuation --- @@ -1390,7 +1518,6 @@ strip numbers instead." (setq font-lock-keywords (list - 't (list "--.*$" '(0 font-lock-comment-face)) (list (concat "\\<\\(" haskell-keywords "\\)\\>") @@ -1415,7 +1542,6 @@ strip numbers instead." (make-local-variable 'font-lock-keywords) (setq font-lock-keywords (list - 't ;; --- Environment names are keywords --- @@ -1463,7 +1589,6 @@ strip numbers instead." (make-local-variable 'font-lock-keywords) (setq font-lock-keywords (list - 't ;; --- Environment names are keywords --- @@ -1485,31 +1610,31 @@ strip numbers instead." ;; --- Handle @/.../ for italics --- ;; (list "\\(@/\\)\\([^/]*\\)\\(/\\)" - ;; '(1 font-lock-keyword-face) - ;; '(3 font-lock-keyword-face)) + ;; '(1 font-lock-keyword-face) + ;; '(3 font-lock-keyword-face)) ;; --- Handle @*...* for boldness --- ;; (list "\\(@\\*\\)\\([^*]*\\)\\(\\*\\)" - ;; '(1 font-lock-keyword-face) - ;; '(3 font-lock-keyword-face)) + ;; '(1 font-lock-keyword-face) + ;; '(3 font-lock-keyword-face)) ;; --- Handle @`...' for literal syntax things --- ;; (list "\\(@`\\)\\([^']*\\)\\('\\)" - ;; '(1 font-lock-keyword-face) - ;; '(3 font-lock-keyword-face)) + ;; '(1 font-lock-keyword-face) + ;; '(3 font-lock-keyword-face)) ;; --- Handle @<...> for nonterminals --- ;; (list "\\(@<\\)\\([^>]*\\)\\(>\\)" - ;; '(1 font-lock-keyword-face) - ;; '(3 font-lock-keyword-face)) + ;; '(1 font-lock-keyword-face) + ;; '(3 font-lock-keyword-face)) ;; --- Handle other @-commands --- ;; (list "@\\([^a-zA-Z]\\|[a-zA-Z]*\\)" - ;; '(0 font-lock-keyword-face)) + ;; '(0 font-lock-keyword-face)) ;; --- Make sure we get comments properly --- @@ -1521,6 +1646,26 @@ strip numbers instead." (list "[$^_{}#&]" '(0 mdw-punct-face))))) +;;;----- SGML hacking ------------------------------------------------------- + +(defun mdw-sgml-mode () + (interactive) + (sgml-mode) + (mdw-standard-fill-prefix "") + (make-variable-buffer-local 'sgml-delimiters) + (setq sgml-delimiters + '("AND" "&" "COM" "--" "CRO" "&#" "DSC" "]" "DSO" "[" "DTGC" "]" + "DTGO" "[" "ERO" "&" "ETAGO" ":e" "GRPC" ")" "GRPO" "(" "LIT" "\"" + "LITA" "'" "MDC" ">" "MDO" "" "PIO" "" + "XML-ECOM" "-->" "XML-PIC" "?>" "XML-SCOM" "