dot-emacs: Make `trap' report the erroneous code.
[profile] / dot-emacs.el
index b66a1e0..e10f9ed 100644 (file)
@@ -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)
@@ -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)
@@ -544,6 +581,8 @@ doesn't cope with anything approximating a complicated case."
               '(:family "courier new" :height 85))
              ((eq window-system 'x)
               '(:family "misc-fixed" :width semi-condensed))))
+    (fixed-pitch)
+    (minibuffer-prompt)
     (modeline :foreground "blue" :background "yellow"
              :box (:line-width 1 :style released-button))
     (scroll-bar :foreground "black" :background "lightgrey")
@@ -638,8 +677,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 +689,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 +702,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 +716,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 +733,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 +767,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 +798,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Fontify include files as strings ---
 
@@ -842,7 +878,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -917,7 +952,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -940,6 +974,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 +1104,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -1041,7 +1162,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1098,7 +1218,6 @@ strip numbers instead."
                        "while" "yield"))))
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1177,7 +1296,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Handle numbers too ---
         ;;
@@ -1209,6 +1327,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 +1343,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 +1411,6 @@ strip numbers instead."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1339,7 +1463,6 @@ strip numbers instead."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1390,7 +1513,6 @@ strip numbers instead."
 
     (setq font-lock-keywords
          (list
-          't
           (list "--.*$"
                 '(0 font-lock-comment-face))
           (list (concat "\\<\\(" haskell-keywords "\\)\\>")
@@ -1415,7 +1537,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Environment names are keywords ---
 
@@ -1463,7 +1584,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Environment names are keywords ---
 
@@ -1745,7 +1865,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
         (list "\\<[A-Z][a-zA-Z0-9]*\\>"
               '(0 font-lock-keyword-face))
         (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
@@ -1786,7 +1905,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
               '(0 mdw-punct-face)))))