(replace-match with t))))
(with-temp-buffer
(insert-file-contents "~/.mdw.conf")
- (replace "^[ \t]*\\(#.*\\|\\)\n" "")
+ (replace "^[ \t]*\\(#.*\\)?\n" "")
(replace (concat "^[ \t]*"
"\\([-a-zA-Z0-9_.]*\\)"
"[ \t]*=[ \t]*"
- "\\(.*[^ \t\n]\\|\\)"
+ "\\(.*[^ \t\n]\\)?"
"[ \t]**\\(\n\\|$\\)")
"(\\1 . \"\\2\")\n")
(car (read-from-string
(set-frame-parameter frame 'menu-bar-lines 0)
(set-frame-parameter frame 'menu-bar-lines old)))
+;; Page motion.
+
+(defun mdw-fixup-page-position ()
+ (unless (eq (char-before (point)) ?\f)
+ (forward-line 0)))
+
+(defadvice backward-page (after mdw-fixup compile activate)
+ (mdw-fixup-page-position))
+(defadvice forward-page (after mdw-fixup compile activate)
+ (mdw-fixup-page-position))
+
;; Splitting windows.
(unless (fboundp 'scroll-bar-columns)
(months ["Chaos" "Discord" "Confusion"
"Bureaucracy" "Aftermath"])
(day-count [0 31 59 90 120 151 181 212 243 273 304 334])
- (year (- (extract-calendar-year date) 1900))
- (month (1- (extract-calendar-month date)))
- (day (1- (extract-calendar-day date)))
+ (year (- (calendar-extract-year date) 1900))
+ (month (1- (calendar-extract-month date)))
+ (day (1- (calendar-extract-day date)))
(julian (+ (aref day-count month) day))
(dyear (+ year 3066)))
(if (and (= month 1) (= day 28))
Pretend they don't exist. They might be on other display devices."
(ad-set-arg 2 nil))
+;; Rename buffers along with files.
+
+(defvar mdw-inhibit-rename-buffer nil
+ "If non-nil, `rename-file' won't rename the buffer visiting the file.")
+
+(defmacro mdw-advise-to-inhibit-rename-buffer (function)
+ "Advise FUNCTION to set `mdw-inhibit-rename-buffer' while it runs.
+
+This will prevent `rename-file' from renaming the buffer."
+ `(defadvice ,function (around mdw-inhibit-rename-buffer compile activate)
+ "Don't rename the buffer when renaming the underlying file."
+ (let ((mdw-inhibit-rename-buffer t))
+ ad-do-it)))
+(mdw-advise-to-inhibit-rename-buffer recode-file-name)
+(mdw-advise-to-inhibit-rename-buffer set-visited-file-name)
+(mdw-advise-to-inhibit-rename-buffer backup-buffer)
+
+(defadvice rename-file (after mdw-rename-buffers (from to &optional forcep)
+ compile activate)
+ "If a buffer is visiting the file, rename it to match the new name.
+
+Don't do this if `mdw-inhibit-rename-buffer' is non-nil."
+ (unless mdw-inhibit-rename-buffer
+ (let ((buffer (get-file-buffer from)))
+ (when buffer
+ (with-current-buffer buffer
+ (set-visited-file-name to nil t))))))
+
;;;--------------------------------------------------------------------------
;;; Improved compilation machinery.
:key #'car))))
ad-do-it))
+;; Preferred programs.
+
+(setq mailcap-user-mime-data
+ '(((type . "application/pdf") (viewer . "mupdf %s"))))
+
;;;--------------------------------------------------------------------------
;;; Utility functions.
(set (make-local-variable 'mdw-do-misc-mode-hacking) t)
(local-set-key [C-return] 'newline)
(make-local-variable 'page-delimiter)
- (setq page-delimiter "\f\\|^.*-\\{6\\}.*$")
+ (setq page-delimiter (concat "^" "\f"
+ "\\|" "^"
+ ".\\{0,4\\}"
+ "-\\{5\\}"
+ "\\(" " " ".*" " " "\\)?"
+ "-+"
+ ".\\{0,2\\}"
+ "$"))
(setq comment-column 40)
(auto-fill-mode 1)
(setq fill-column mdw-text-width)
(defvar mdw-define-c-styles-hook nil
"Hook run when `cc-mode' starts up to define styles.")
-(defmacro mdw-define-c-style (name &rest assocs)
- "Define a C style, called NAME (a symbol), setting ASSOCs.
+(defun mdw-merge-style-alists (first second)
+ (let ((output nil))
+ (dolist (item first)
+ (let ((key (car item)) (value (cdr item)))
+ (if (string-suffix-p "-alist" (symbol-name key))
+ (push (cons key
+ (mdw-merge-style-alists value
+ (cdr (assoc key second))))
+ output)
+ (push item output))))
+ (dolist (item second)
+ (unless (assoc (car item) first)
+ (push item output)))
+ (nreverse output)))
+
+(cl-defmacro mdw-define-c-style (name (&optional parent) &rest assocs)
+ "Define a C style, called NAME (a symbol) based on PARENT, setting ASSOCs.
A function, named `mdw-define-c-style/NAME', is defined to actually install
the style using `c-add-style', and added to the hook
`mdw-define-c-styles-hook'. If CC Mode is already loaded, then the style is
set."
(declare (indent defun))
(let* ((name-string (symbol-name name))
+ (var (intern (concat "mdw-c-style/" name-string)))
(func (intern (concat "mdw-define-c-style/" name-string))))
`(progn
- (defun ,func () (c-add-style ,name-string ',assocs))
+ (setq ,var
+ ,(if (null parent)
+ `',assocs
+ (let ((parent-list (intern (concat "mdw-c-style/"
+ (symbol-name parent)))))
+ `(mdw-merge-style-alists ',assocs ,parent-list))))
+ (defun ,func () (c-add-style ,name-string ,var))
(and (featurep 'cc-mode) (,func))
- (add-hook 'mdw-define-c-styles-hook ',func))))
+ (add-hook 'mdw-define-c-styles-hook ',func)
+ ',name)))
(eval-after-load "cc-mode"
'(run-hooks 'mdw-define-c-styles-hook))
-(mdw-define-c-style mdw-trustonic-c
- (c-basic-offset . 4)
- (comment-column . 0)
- (c-indent-comment-alist (anchored-comment . (column . 0))
- (end-block . (space . 1))
- (cpp-end-block . (space . 1))
- (other . (space . 1)))
- (c-class-key . "class")
- (c-backslash-column . 0)
- (c-auto-align-backslashes . nil)
- (c-label-minimum-indentation . 0)
- (c-offsets-alist (substatement-open . (add 0 c-indent-one-line-block))
- (defun-open . (add 0 c-indent-one-line-block))
- (arglist-cont-nonempty . mdw-c-indent-arglist-nested)
- (topmost-intro . mdw-c-indent-extern-mumble)
- (cpp-define-intro . 0)
- (knr-argdecl . 0)
- (inextern-lang . [0])
- (label . 0)
- (case-label . +)
- (access-label . -2)
- (inclass . +)
- (inline-open . ++)
- (statement-cont . +)
- (statement-case-intro . +)))
-
-(mdw-define-c-style mdw-c
+(mdw-define-c-style mdw-c ()
(c-basic-offset . 2)
(comment-column . 40)
(c-class-key . "class")
(statement-cont . +)
(statement-case-intro . +)))
+(mdw-define-c-style mdw-trustonic-basic-c (mdw-c)
+ (c-basic-offset . 4)
+ (comment-column . 0)
+ (c-indent-comment-alist (anchored-comment . (column . 0))
+ (end-block . (space . 1))
+ (cpp-end-block . (space . 1))
+ (other . (space . 1)))
+ (c-offsets-alist (access-label . -2)))
+
+(mdw-define-c-style mdw-trustonic-c (mdw-trustonic-basic-c)
+ (c-offsets-alist (arglist-cont-nonempty . mdw-c-indent-arglist-nested)))
+
(defun mdw-set-default-c-style (modes style)
"Update the default CC Mode style for MODES to be STYLE.
;; Fontify include files as strings.
(list (concat "^[ \t]*\\#[ \t]*"
"\\(include\\|import\\)"
- "[ \t]*\\(<[^>]+\\(>\\|\\)\\)")
+ "[ \t]*\\(<[^>]+>?\\)")
'(2 font-lock-string-face))
;; Preprocessor directives are `references'?.
;; Make indentation nice.
-(mdw-define-c-style mdw-java
+(mdw-define-c-style mdw-java ()
(c-basic-offset . 2)
(c-backslash-column . 72)
(c-offsets-alist (substatement-open . 0)
;; 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]+\\|\\)\\)"
+ "[0-9]+\\(\\.[0-9]*\\)?"
+ "\\([eE][-+]?[0-9]+\\)?\\)"
"[lLfFdD]?")
'(0 mdw-number-face))
;; 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]+\\|\\)\\)"
+ "[0-9]+\\(\\.[0-9]*\\)?"
+ "\\([eE][-+]?[0-9]+\\)?\\)"
"[lLfFdD]?")
'(0 mdw-number-face))
;; As usual, not quite right.
(list (concat "\\_<\\("
"0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
- "[0-9]+\\(\\.[0-9]*\\|\\)"
- "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
+ "[0-9]+\\(\\.[0-9]*\\)?"
+ "\\([eE][-+]?[0-9]+\\)?\\)"
"[lLfFdD]?")
'(0 mdw-number-face))
;; Make indentation nice.
-(mdw-define-c-style mdw-csharp
+(mdw-define-c-style mdw-csharp ()
(c-basic-offset . 2)
(c-backslash-column . 72)
(c-offsets-alist (substatement-open . 0)
;; 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]+\\|\\)\\)"
+ "[0-9]+\\(\\.[0-9]*\\)?"
+ "\\([eE][-+]?[0-9]+\\)?\\)"
"[lLfFdD]?")
'(0 mdw-number-face))
;; 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]+\\|\\)\\)")
+ "[0-9]+\\(\\.[0-9]*\\)?"
+ "\\([eE][-+]?[0-9]+\\)?\\)")
'(0 mdw-number-face))
;; And anything else is punctuation.
;; Make Awk indentation nice.
-(mdw-define-c-style mdw-awk
+(mdw-define-c-style mdw-awk ()
(c-basic-offset . 2)
(c-offsets-alist (substatement-open . 0)
(c-backslash-column . 72)
;; 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]+\\|\\)\\)"
+ "[0-9]+\\(\\.[0-9]*\\)?"
+ "\\([eE][-+]?[0-9]+\\)?\\)"
"[uUlL]*")
'(0 mdw-number-face))
;; At least numbers are simpler than C.
(list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
- "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
- "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
+ "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\)?"
+ "\\([eE][-+]?[0-9_]+\\)?")
'(0 mdw-number-face))
;; And anything else is punctuation.
;; At least numbers are simpler than C.
(list (concat "\\_<0\\([xX][0-9a-fA-F]+\\|[oO]?[0-7]+\\|[bB][01]+\\)\\|"
- "\\_<[0-9][0-9]*\\(\\.[0-9]*\\|\\)"
- "\\([eE]\\([-+]\\|\\)[0-9]+\\|[lL]\\|\\)")
+ "\\_<[0-9][0-9]*\\(\\.[0-9]*\\)?"
+ "\\([eE][-+]?[0-9]+\\|[lL]\\)?")
'(0 mdw-number-face))
;; And anything else is punctuation.
(setq font-lock-keywords
(list
(list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
- "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
- "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
+ "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\)?"
+ "\\([eE][-+]?[0-9_]+\\)?")
'(0 mdw-number-face))
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face)))))
'(0 font-lock-keyword-face))
;; At least numbers are simpler than C.
- (list (concat "\\<\\(\\~\\|\\)"
- "\\(0\\(\\([wW]\\|\\)[xX][0-9a-fA-F]+\\|"
+ (list (concat "\\<\\~?"
+ "\\(0\\([wW]?[xX][0-9a-fA-F]+\\|"
"[wW][0-9]+\\)\\|"
- "\\([0-9]+\\(\\.[0-9]+\\|\\)"
- "\\([eE]\\(\\~\\|\\)"
- "[0-9]+\\|\\)\\)\\)")
+ "\\([0-9]+\\(\\.[0-9]+\\)?"
+ "\\([eE]\\~?"
+ "[0-9]+\\)?\\)\\)")
'(0 mdw-number-face))
;; And anything else is punctuation.
(list "\\_<[A-Z]\\(\\sw+\\|\\s_+\\)*\\_>"
'(0 font-lock-variable-name-face))
(list (concat "\\_<0\\([xX][0-9a-fA-F]+\\|[oO][0-7]+\\)\\|"
- "\\_<[0-9]+\\(\\.[0-9]*\\|\\)"
- "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)")
+ "\\_<[0-9]+\\(\\.[0-9]*\\)?"
+ "\\([eE][-+]?[0-9]+\\)?")
'(0 mdw-number-face))
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
'(0 font-lock-keyword-face))
(list (concat "^-\\sw+\\>")
'(0 font-lock-keyword-face))
- (list "\\<[0-9]+\\(\\|#[0-9a-zA-Z]+\\|[eE][+-]?[0-9]+\\)\\>"
+ (list "\\<[0-9]+\\(#[0-9a-zA-Z]+\\|[eE][+-]?[0-9]+\\)?\\>"
'(0 mdw-number-face))
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
'(2 font-lock-variable-name-face))
;; Make sure we get comments properly.
- (list "@c\\(\\|omment\\)\\( .*\\)?$"
+ (list "@c\\(omment\\)?\\( .*\\)?$"
'(0 font-lock-comment-face))
;; Command names are keywords.
(setq messages-mode-keywords
(append (list (list (concat "^[ \t]*\\#[ \t]*"
"\\(include\\|import\\)"
- "[ \t]*\\(<[^>]+\\(>\\|\\)\\)")
+ "[ \t]*\\(<[^>]+\\(>\\)?\\)")
'(2 font-lock-string-face))
(list (concat "^\\([ \t]*#[ \t]*\\(\\("
preprocessor-keywords
(list
(list (concat "^%\\s *\\(}\\|\\(" keywords "\\)\\>\\).*$")
'(0 font-lock-keyword-face))
- (list "^%\\s *\\(#.*\\|\\)$"
+ (list "^%\\s *\\(#.*\\)?$"
'(0 font-lock-comment-face))
(list "^%"
'(0 font-lock-keyword-face))
(list "\\<[A-Z][a-zA-Z0-9]*\\>"
'(0 font-lock-keyword-face))
(list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
- "[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
- "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
+ "[0-9][0-9_]*\\(\\.[0-9_]*\\)?"
+ "\\([eE][-+]?[0-9_]+\\)?")
'(0 mdw-number-face))
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face)))))
(preloads (save-match-data (split-string old-preload ":")))
(any nil)
(filtered nil))
- (while preloads
- (let ((item (pop preloads)))
- (if (save-match-data
- (string-match "\\(/\\|^\\)noip\.so\\(:\\|$\\)" item))
- (setq any t)
- (push item filtered))))
+ (save-match-data
+ (while preloads
+ (let ((item (pop preloads)))
+ (if (string-match "\\(/\\|^\\)noip\.so\\(:\\|$\\)" item)
+ (setq any t)
+ (push item filtered)))))
(if any
(unwind-protect
(progn