Merge branch 'master' of git+ssh://ponder.ncipher.com/~mwooding/etc/profile
[profile] / dot-emacs.el
index b66a1e0..0599106 100644 (file)
@@ -128,6 +128,19 @@ symbols `sunday', `monday', etc. (or a mixture).  If the date stored in
 
 ;;;----- Utility functions --------------------------------------------------
 
+(defun line-number-at-pos (&optional pos)
+  "Print the current buffer line number and narrowed line number of point."
+  (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 +502,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)
@@ -638,8 +654,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 +666,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 +679,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 +693,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 +710,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 +744,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
@@ -940,6 +954,95 @@ 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
+          't
+
+          ;; --- 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 ---
@@ -1209,6 +1312,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 ()