X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/ae7460d4559f39809a748eb483ca70917424c50f..a2364c4bc3bae63d6d2382b162df337db8f7008e:/el/dot-emacs.el diff --git a/el/dot-emacs.el b/el/dot-emacs.el index f3d57e5..1704f7d 100644 --- a/el/dot-emacs.el +++ b/el/dot-emacs.el @@ -137,6 +137,33 @@ library." ((eq side 'left) 1) (t 2)))) +(defun mdw-horizontal-window-overhead () + "Computes the horizontal window overhead. +This is the number of columns used by fringes, scroll bars and other such +cruft." + (if (not window-system) + 1 + (let ((tot 0)) + (dolist (what '(scroll-bar fringe)) + (dolist (side '(left right)) + (incf tot (funcall (intern (concat (symbol-name what) "-columns")) + side)))) + tot))) + +(defun mdw-split-window-horizontally (&optional width) + "Split a window horizontally. +Without a numeric argument, split the window approximately in +half. With a numeric argument WIDTH, allocate WIDTH columns to +the left-hand window (if positive) or -WIDTH columns to the +right-hand window (if negative). Space for scroll bars and +fringes is not taken out of the allowance for WIDTH, unlike +\\[split-window-horizontally]." + (interactive "P") + (split-window-horizontally + (cond ((null width) nil) + ((>= width 0) (+ width (mdw-horizontal-window-overhead))) + ((< width 0) width)))) + (defun mdw-divvy-window (&optional width) "Split a wide window into appropriate widths." (interactive "P") @@ -146,16 +173,7 @@ library." 77) (t 78))) (let* ((win (selected-window)) - (sb-width (if (not window-system) - 1 - (let ((tot 0)) - (dolist (what '(scroll-bar fringe)) - (dolist (side '(left right)) - (incf tot - (funcall (intern (concat (symbol-name what) - "-columns")) - side)))) - tot))) + (sb-width (mdw-horizontal-window-overhead)) (c (/ (+ (window-width) sb-width) (+ width sb-width)))) (while (> c 1) @@ -164,6 +182,25 @@ library." (other-window 1)) (select-window win))) +;; Transient mark mode hacks. + +(defadvice exchange-point-and-mark + (around mdw-highlight (&optional arg) activate compile) + "Maybe don't actually exchange point and mark. +If `transient-mark-mode' is on and the mark is inactive, then +just activate it. A non-trivial prefix argument will force the +usual behaviour. A trivial prefix argument (i.e., just C-u) will +activate the mark and temporarily enable `transient-mark-mode' if +it's currently off." + (cond ((or mark-active + (and (not transient-mark-mode) (not arg)) + (and arg (or (not (consp arg)) + (not (= (car arg) 4))))) + ad-do-it) + (t + (or transient-mark-mode (setq transient-mark-mode 'only)) + (set-mark (mark t))))) + ;; Functions for sexp diary entries. (defun mdw-weekday (l) @@ -321,6 +358,9 @@ so that it can be used for convenient filtering." (setenv "REAL_MOVEMAIL" try)) (setq path (cdr path))))) +(eval-after-load "erc" + '(load "~/.ercrc.el")) + ;;;-------------------------------------------------------------------------- ;;; Utility functions. @@ -497,7 +537,8 @@ If NEW-SESSION-P, start a new session." (select-window window))))) (defvar mdw-good-url-browsers - '((w3m . mdw-w3m-browse-url) + '(browse-url-generic + (w3m . mdw-w3m-browse-url) browse-url-w3 browse-url-mozilla) "List of good browsers for mdw-good-url-browsers. @@ -579,7 +620,7 @@ It in turn is a list of things: (defvar mdw-hanging-indents (concat "\\(\\(" - "\\([*o]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)" + "\\([*o+]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)" "[ \t]+" "\\)?\\)") "*Standard regexp matching parts of a hanging indent. @@ -680,6 +721,15 @@ case." (defvar mdw-auto-indent t "Whether to indent automatically after a newline.") +(defun mdw-whitespace-mode (&optional arg) + "Turn on/off whitespace mode, but don't highlight trailing space." + (interactive "P") + (when (and (boundp 'whitespace-style) + (fboundp 'whitespace-mode)) + (let ((whitespace-style (remove 'trailing whitespace-style))) + (whitespace-mode arg)) + (setq show-trailing-whitespace whitespace-mode))) + (defun mdw-misc-mode-config () (and mdw-auto-indent (cond ((eq major-mode 'lisp-mode) @@ -690,24 +740,23 @@ case." (t (local-set-key "\C-m" 'newline-and-indent)))) (local-set-key [C-return] 'newline) - (make-variable-buffer-local 'page-delimiter) + (make-local-variable 'page-delimiter) (setq page-delimiter "\f\\|^.*-\\{6\\}.*$") (setq comment-column 40) (auto-fill-mode 1) (setq fill-column 77) (setq show-trailing-whitespace t) - (let ((whitespace-style (remove 'trailing whitespace-style))) - (trap (whitespace-mode t))) + (mdw-whitespace-mode 1) (and (fboundp 'gtags-mode) (gtags-mode)) - (outline-minor-mode t) - (hs-minor-mode t) + (if (fboundp 'hs-minor-mode) + (hs-minor-mode t) + (outline-minor-mode t)) (reveal-mode t) (trap (turn-on-font-lock))) (defun mdw-post-config-mode-hack () - (let ((whitespace-style (remove 'trailing whitespace-style))) - (trap (whitespace-mode t)))) + (mdw-whitespace-mode 1)) (eval-after-load 'gtags '(progn @@ -748,26 +797,13 @@ doesn't match any of the regular expressions in (when (and frame-display (eq window-system 'x) (not (some (lambda (fr) - (message "checking frame %s" frame) (and (not (eq fr frame)) (string= (frame-parameter fr 'display) - frame-display) - (progn "frame %s still uses us" nil))) + frame-display))) (frame-list)))) (run-with-idle-timer 0 nil #'x-close-connection frame-display)))) (add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights) -(defvar mdw-frame-parameters-alist - '((nil (menu-bar-lines . 0)))) -(defun mdw-set-frame-parameters (frame) - (let ((params (assq (if (fboundp 'window-system) - (window-system frame) - window-system) - mdw-frame-parameters-alist))) - (when params - (modify-frame-parameters frame (cdr params))))) -(add-hook 'after-make-frame-functions 'mdw-set-frame-parameters) - ;;;-------------------------------------------------------------------------- ;;; General fontification. @@ -794,7 +830,7 @@ doesn't match any of the regular expressions in (mdw-define-face variable-pitch (((type x)) :family "sans" :height 100)) (mdw-define-face variable-pitch - (((type x)) :family "helvetica" :height 120))) + (((type x)) :family "helvetica" :height 90))) (mdw-define-face region (((type tty) (class color)) :background "blue") (((type tty) (class mono)) :inverse-video t) @@ -833,6 +869,13 @@ doesn't match any of the regular expressions in (mdw-define-face comint-highlight-input (t nil)) +(mdw-define-face dired-directory + (t :foreground "cyan" :weight bold)) +(mdw-define-face dired-symlink + (t :foreground "cyan")) +(mdw-define-face dired-perm-write + (t nil)) + (mdw-define-face trailing-whitespace (((class color)) :background "red") (t :inverse-video t)) @@ -890,6 +933,8 @@ doesn't match any of the regular expressions in (((type tty)) :foreground "green") (t :foreground "SeaGreen1")) (mdw-define-face message-header-name (((type tty)) :foreground "green") (t :foreground "SeaGreen1")) +(mdw-define-face which-func + (t nil)) (mdw-define-face diff-index (t :weight bold)) @@ -940,6 +985,13 @@ doesn't match any of the regular expressions in (mdw-define-face whizzy-error-face (t :background "darkred")) +;; Ellipses used to indicate hidden text (and similar). +(mdw-define-face mdw-ellipsis-face + (((type tty)) :foreground "blue") (t :foreground "grey60")) +(let ((dot (make-glyph-code ?. 'mdw-ellipsis-face))) + (set-display-table-slot standard-display-table 4 + (vector dot dot dot))) + ;;;-------------------------------------------------------------------------- ;;; C programming configuration. @@ -984,13 +1036,14 @@ doesn't match any of the regular expressions in (arglist-cont-nonempty . mdw-c-lineup-arglist) (topmost-intro . mdw-c-indent-extern-mumble) (cpp-define-intro . 0) + (knr-argdecl . 0) (inextern-lang . [0]) (label . 0) (case-label . +) (access-label . -) (inclass . +) (inline-open . ++) - (statement-cont . 0) + (statement-cont . +) (statement-case-intro . +))) t)) @@ -1520,6 +1573,7 @@ strip numbers instead." ;; Miscellaneous fiddling. (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)") + (setq indent-tabs-mode nil) ;; Now define fontification things. (make-local-variable 'font-lock-keywords) @@ -1897,8 +1951,7 @@ strip numbers instead." ;;;-------------------------------------------------------------------------- ;;; Erlang configuration. -(setq erlang-electric-commannds - '(erlang-electric-newline erlang-electric-semicolon)) +(setq erlang-electric-commands nil) (defun mdw-fontify-erlang () @@ -2041,7 +2094,7 @@ strip numbers instead." (interactive) (sgml-mode) (mdw-standard-fill-prefix "") - (make-variable-buffer-local 'sgml-delimiters) + (make-local-variable 'sgml-delimiters) (setq sgml-delimiters '("AND" "&" "COM" "--" "CRO" "&#" "DSC" "]" "DSO" "[" "DTGC" "]" "DTGO" "[" "ERO" "&" "ETAGO" ":e" "GRPC" ")" "GRPO" "(" "LIT" "\"" @@ -2093,13 +2146,21 @@ strip numbers instead." (save-match-data (replace-regexp-in-string "\\..*$" "" (system-name))) " " - (eshell/pwd) + (let* ((pwd (eshell/pwd)) (npwd (length pwd)) + (home (expand-file-name "~")) (nhome (length home))) + (if (and (>= npwd nhome) + (or (= nhome npwd) + (= (elt pwd nhome) ?/)) + (string= (substring pwd 0 nhome) home)) + (concat "~" (substring pwd (length home))) + pwd)) right))) (setq eshell-prompt-function 'mdw-eshell-prompt) -(setq eshell-prompt-regexp "^\\[[^]]+\\]") +(setq eshell-prompt-regexp "^\\[[^]>]+\\(\\]\\|>>?\\)") -(defalias 'eshell/e 'find-file) -(defalias 'eshell/w3m 'w3m-goto-url) +(defun eshell/e (file) (find-file file) nil) +(defun eshell/ee (file) (find-file-other-window file) nil) +(defun eshell/w3m (url) (w3m-goto-url url) nil) (mdw-define-face eshell-prompt (t :weight bold)) (mdw-define-face eshell-ls-archive (t :weight bold :foreground "red")) @@ -2166,7 +2227,6 @@ strip numbers instead." (modify-syntax-entry ?\n ">" messages-mode-syntax-table) (setq comment-start "# ") (setq comment-end "") - (turn-on-font-lock-if-enabled) (run-hooks 'messages-mode-hook)) (defun cpp-messages-mode () @@ -2193,7 +2253,6 @@ strip numbers instead." "\\)\\>\\|[0-9]+\\|$\\)\\)") '(1 font-lock-keyword-face))) messages-mode-keywords))) - (turn-on-font-lock-if-enabled) (run-hooks 'cpp-messages-mode-hook)) (add-hook 'messages-mode-hook 'mdw-misc-mode-config t) @@ -2244,7 +2303,6 @@ strip numbers instead." (modify-syntax-entry ?\n ">" mallow-driver-mode-syntax-table) (setq comment-start "%# ") (setq comment-end "") - (turn-on-font-lock-if-enabled) (run-hooks 'mallow-driver-mode-hook)) (add-hook 'mallow-driver-hook 'mdw-misc-mode-config t) @@ -2287,7 +2345,6 @@ strip numbers instead." '("\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" (0 mdw-punct-face)))) (setq font-lock-defaults '(nfast-debug-mode-keywords nil nil nil nil)) - (turn-on-font-lock-if-enabled) (run-hooks 'nfast-debug-mode-hook)) ;;;-------------------------------------------------------------------------- @@ -2298,7 +2355,7 @@ strip numbers instead." (defun mdw-setup-smalltalk () (and mdw-auto-indent (local-set-key "\C-m" 'smalltalk-newline-and-indent)) - (make-variable-buffer-local 'mdw-auto-indent) + (make-local-variable 'mdw-auto-indent) (setq mdw-auto-indent nil) (local-set-key "\C-i" 'smalltalk-reindent)) @@ -2337,7 +2394,7 @@ strip numbers instead." (multiple-value-bind . ((&whole 4 &rest 1) 4 &body)))))) (defun mdw-common-lisp-indent () - (make-variable-buffer-local 'lisp-indent-function) + (make-local-variable 'lisp-indent-function) (setq lisp-indent-function 'common-lisp-indent-function)) (setq lisp-simple-loop-indentation 2 @@ -2427,6 +2484,20 @@ strip numbers instead." (define-key term-raw-map [M-left] 'term-send-meta-left) (define-key term-raw-map [?\e ?\M-O ?D] 'term-send-meta-left))) +(defadvice term-exec (before program-args-list compile activate) + "If the PROGRAM argument is a list, interpret it as (PROGRAM . SWITCHES). +This allows you to pass a list of arguments through `ansi-term'." + (let ((program (ad-get-arg 2))) + (if (listp program) + (progn + (ad-set-arg 2 (car program)) + (ad-set-arg 4 (cdr program)))))) + +(defun ssh (host) + "Open a terminal containing an ssh session to the HOST." + (interactive "sHost: ") + (ansi-term (list "ssh" host) (format "ssh@%s" host))) + ;;;-------------------------------------------------------------------------- ;;; Inferior Emacs Lisp.