| 1 | ;;; -*- mode: emacs-lisp; coding: utf-8 -*- |
| 2 | ;;; |
| 3 | ;;; Emacs configuration file |
| 4 | ;;; |
| 5 | ;;; (c) 1996-1999 Mark Wooding |
| 6 | ;;; |
| 7 | |
| 8 | ;;;----- Licensing notice --------------------------------------------------- |
| 9 | ;;; |
| 10 | ;;; This program is free software; you can redistribute it and/or modify |
| 11 | ;;; it under the terms of the GNU General Public License as published by |
| 12 | ;;; the Free Software Foundation; either version 2 of the License, or |
| 13 | ;;; (at your option) any later version. |
| 14 | ;;; |
| 15 | ;;; This program is distributed in the hope that it will be useful, |
| 16 | ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 | ;;; GNU General Public License for more details. |
| 19 | ;;; |
| 20 | ;;; You should have received a copy of the GNU General Public License |
| 21 | ;;; along with this program; if not, write to the Free Software |
| 22 | ;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
| 23 | |
| 24 | (let ((path "~/lib/emacs/") |
| 25 | (pkgs (list "bbdb/" "multiple-cursors/" "rust-mode/")) |
| 26 | pkg) |
| 27 | (setq load-path (nconc load-path (list path))) |
| 28 | (while (setq pkg (pop pkgs)) |
| 29 | (let ((dir (concat path pkg))) |
| 30 | (if (file-exists-p dir) |
| 31 | (setq load-path (nconc load-path (list dir)))))) |
| 32 | (let ((boot (concat path "mdw-pkgs.el"))) |
| 33 | (if (file-exists-p boot) |
| 34 | (load boot)))) |
| 35 | |
| 36 | (require 'cl) |
| 37 | (require 'dot-emacs) |
| 38 | |
| 39 | (unless (mdw-emacs-version-p 25) |
| 40 | (trap (require 'bracketed-paste) (bracketed-paste-enable))) |
| 41 | |
| 42 | ;;;-------------------------------------------------------------------------- |
| 43 | ;;; Some random initialisation. |
| 44 | |
| 45 | (setq mdw-init-window (selected-window)) |
| 46 | |
| 47 | ;; Load some other bits of code. |
| 48 | |
| 49 | ;; Magic to make ELPA packages work. |
| 50 | (trap |
| 51 | (package-initialize) |
| 52 | ) |
| 53 | |
| 54 | (maybe-autoload 'cc-mode "cc-mode" nil t) |
| 55 | (maybe-autoload 'rexx-mode "rexx-mode" nil t) |
| 56 | (maybe-autoload 'cvs-update "pcl-cvs" nil t) |
| 57 | (maybe-autoload 'debian-changelog-mode "debian-changelog-mode" nil t) |
| 58 | (maybe-autoload 'git-status "git" nil t) |
| 59 | (maybe-autoload 'git-blame-mode "git-blame" nil t) |
| 60 | (maybe-autoload 'stgit "stgit" nil t) |
| 61 | (maybe-autoload 'nc-timesheet-prepare "nc-timesheet" nil t nil) |
| 62 | (maybe-autoload 'nc-timesheet-submit "nc-timesheet" nil t nil) |
| 63 | (maybe-autoload 'org-bbdb-anniversaries "org" nil t) |
| 64 | |
| 65 | (and (library-exists-p "debian-changelog-mode") |
| 66 | (add-to-list 'auto-mode-alist |
| 67 | `(,(concat "/debian/" |
| 68 | "\\(" |
| 69 | "[" "[:lower:]" "[:digit:]" "]" |
| 70 | "[" "[:lower:]" "[:digit:]" ".+-" "]+" |
| 71 | "\\." |
| 72 | "\\)?" |
| 73 | "changelog\\'") |
| 74 | . debian-changelog-mode))) |
| 75 | |
| 76 | (and (library-exists-p "vc-git") |
| 77 | (not (memq 'GIT vc-handled-backends)) |
| 78 | (not (memq 'Git vc-handled-backends)) |
| 79 | (not (memq 'git vc-handled-backends)) |
| 80 | (setq vc-handled-backends (cons 'GIT vc-handled-backends))) |
| 81 | |
| 82 | (setq magit-log-cutoff-length 512 |
| 83 | magit-log-section-arguments '("-n256" "--decorate" "--graph")) |
| 84 | (defun mdw-magit-try-load-config-extensions () |
| 85 | (trap (magit-load-config-extensions))) |
| 86 | (add-hook 'magit-mode-hook 'mdw-magit-try-load-config-extensions) |
| 87 | |
| 88 | (trap (or mdw-fast-startup (require 'p4))) |
| 89 | |
| 90 | (trap (or mdw-fast-startup (require 'tex-site))) |
| 91 | |
| 92 | (trap (or mdw-fast-startup t (semantic-load-enable-code-helpers))) |
| 93 | (setq semanticdb-default-save-directory "~/.emacs.d/semanticdb/") |
| 94 | (eval-after-load "senator" |
| 95 | '(setq isearch-mode-hook |
| 96 | (remq 'senator-isearch-mode-hook isearch-mode-hook) |
| 97 | isearch-mode-end-hook |
| 98 | (remq 'senator-isearch-mode-hook isearch-mode-end-hook))) |
| 99 | |
| 100 | ;; Skeleton stuff. |
| 101 | |
| 102 | (trap (or mdw-fast-startup (require 'skel-init))) |
| 103 | |
| 104 | ;; Window system-dependent things. |
| 105 | |
| 106 | (require 'paren) |
| 107 | (trap (show-paren-mode t)) |
| 108 | (or window-system (mdw-emacs-version-p 22) (menu-bar-mode -1)) |
| 109 | (setq x-select-enable-clipboard nil |
| 110 | x-select-enable-primary t |
| 111 | mouse-drag-copy-region t) |
| 112 | |
| 113 | ;; Multiple cursors. |
| 114 | |
| 115 | (global-set-key [?\C-c ?r] 'mdw-multiple-cursors-keymap) |
| 116 | (autoload 'mdw-multiple-cursors-keymap "mdw-multiple-cursors.el" |
| 117 | "A keymap for Magnar Sveen's awesome multiple-cursors." nil 'keymap) |
| 118 | |
| 119 | ;; Rust mode. |
| 120 | |
| 121 | (autoload 'rust-mode "rust-mode" nil t) |
| 122 | (add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode)) |
| 123 | |
| 124 | ;; Temporary directory handling. |
| 125 | |
| 126 | (defun mdw-check-dir-exists (dir) |
| 127 | (and dir |
| 128 | (file-directory-p dir) |
| 129 | dir)) |
| 130 | (setq tmpdir (or (mdw-check-dir-exists (getenv "TMPDIR")) |
| 131 | (mdw-check-dir-exists (format "/tmp/%s" (user-login-name))) |
| 132 | "/tmp")) |
| 133 | |
| 134 | ;; Emacs server behaviour. |
| 135 | |
| 136 | (and (or window-system (mdw-emacs-version-p 23)) |
| 137 | (not mdw-fast-startup) |
| 138 | (not (and (fboundp 'daemonp) (daemonp))) |
| 139 | (progn (setq server-temp-file-regexp (concat "^" tmpdir "\\|/draft$") |
| 140 | edit-server-new-frame nil |
| 141 | gnuserv-frame t) |
| 142 | (trap (let ((warning-suppress-types |
| 143 | (cons '(server) |
| 144 | (and (boundp 'warning-suppress-types) |
| 145 | warning-suppress-types)))) |
| 146 | (server-start))) |
| 147 | (trap (progn |
| 148 | (require 'edit-server) |
| 149 | (edit-server-start) |
| 150 | (let ((edit (get-process "edit-server"))) |
| 151 | (and edit |
| 152 | (set-process-query-on-exit-flag edit nil))))))) |
| 153 | |
| 154 | ;; Saving state. |
| 155 | |
| 156 | (or mdw-fast-startup (savehist-mode 1)) |
| 157 | (setq history-length 200) |
| 158 | |
| 159 | ;; Control backup behaviour. |
| 160 | |
| 161 | (setq backup-by-copying nil) |
| 162 | (setq backup-by-copying-when-linked t) |
| 163 | (setq backup-by-copying-when-mismatch t) |
| 164 | |
| 165 | (setq mdw-backup-disable-regexps |
| 166 | '("/\\.git/COMMIT_EDITMSG$" |
| 167 | "/\\.stgit\\(-edit\\.txt\\|msg\\.txt\\|\\.msg\\)$" |
| 168 | "^/tmp/" "^/var/tmp/")) |
| 169 | |
| 170 | ;; Safe variables. |
| 171 | |
| 172 | (setq safe-local-variable-values |
| 173 | '((make-backup-files . nil))) |
| 174 | |
| 175 | ;; Calculator fiddling. |
| 176 | |
| 177 | (setq calc-settings-file "~/.emacs-calc") |
| 178 | (load calc-settings-file) |
| 179 | |
| 180 | ;; Saving window-configuration state. |
| 181 | |
| 182 | (or mdw-fast-startup |
| 183 | (winner-mode 1)) |
| 184 | |
| 185 | ;; Some mail and news configuration. |
| 186 | |
| 187 | (setq mail-from-style 'angles |
| 188 | mail-signature t |
| 189 | mail-yank-prefix "> " |
| 190 | mail-archive-file-name nil |
| 191 | message-default-mail-headers |
| 192 | "X-Auto-Response-Suppress: DR, RN, NRN, OOF\n" |
| 193 | message-default-news-headers "" |
| 194 | compose-mail-user-agent-warnings nil) |
| 195 | |
| 196 | (setq rmail-display-summary t) |
| 197 | (setq rmail-file-name "~/Mail/rmail") |
| 198 | |
| 199 | (setq sendmail-program "~/bin/sendmail-hack" |
| 200 | send-mail-function 'sendmail-send-it |
| 201 | mail-interactive t |
| 202 | mail-specify-envelope-from t |
| 203 | mail-envelope-from 'header |
| 204 | sendmail-error-reporting-interactive '("-odb" "-oee")) |
| 205 | (autoload 'sendmail-send-it "sendmail") |
| 206 | (autoload 'smtpmail-send-it "smtpmail") |
| 207 | |
| 208 | (setq mail-user-agent 'message-user-agent |
| 209 | read-mail-command 'gnus) |
| 210 | (setq message-signature-separator "^-- \\(\\[mdw\\]\\)?$" |
| 211 | message-yank-prefix "> " |
| 212 | message-yank-cited-prefix "> " |
| 213 | message-send-mail-function 'message-send-mail-with-sendmail |
| 214 | message-interactive t |
| 215 | message-sendmail-extra-arguments '("-odb" "-oee") |
| 216 | message-sendmail-envelope-from 'header |
| 217 | message-indent-citation-function '(message-indent-citation |
| 218 | mdw-trim-spaces-after-citing)) |
| 219 | |
| 220 | (defun mdw-trim-spaces-after-citing () |
| 221 | (save-excursion |
| 222 | (save-restriction |
| 223 | (narrow-to-region (point) (mark t)) |
| 224 | (while (re-search-forward "^> +$" nil t) |
| 225 | (replace-match ">"))))) |
| 226 | |
| 227 | (and (fboundp 'turn-on-gnus-dired-mode) |
| 228 | (not mdw-fast-startup) |
| 229 | (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)) |
| 230 | |
| 231 | (or mdw-fast-startup |
| 232 | (trap (bbdb-initialize 'gnus 'sendmail 'message))) |
| 233 | (setq bbdb-file "~/etc/brain/bbdb" |
| 234 | bbdb-north-american-phone-numbers-p nil |
| 235 | bbdb-dwim-net-address-allow-redundancy t |
| 236 | bbdb-extract-address-components-func 'bbdb-extract-address-components |
| 237 | bbdb-allow-duplicates t |
| 238 | bbdb/news-auto-create-p |
| 239 | (lambda () |
| 240 | (let ((group gnus-newsgroup-name)) |
| 241 | (and (string-match "^nn\\(imap\\|folder\\)\\+" group) |
| 242 | (not (string-match (concat ":" "\\(" "\\(" "crap" |
| 243 | "\\|" "spam" |
| 244 | "\\|" "lists" |
| 245 | "\\|" "corpus" |
| 246 | "\\)" "\\." |
| 247 | "\\|" "Junk Email$" |
| 248 | "\\)") |
| 249 | group))))) |
| 250 | bbdb-user-mail-names |
| 251 | (concat "^" |
| 252 | "\\(" "\\(mdw\\|markw\\|root\\|postmaster\\)" |
| 253 | "\\([-+][^@]*\\)?" |
| 254 | "@\\(\\(dist\\|esc\\)orted\\.org\\.uk\\|odin\\.gg\\)" |
| 255 | "\\|" "\\(" "\\(mdw\\|mwooding\\)" |
| 256 | "\\(\\+[^@]*\\)?" |
| 257 | "\\|" "0" "\\(mdw\\|mwooding\\)" "k\\.[^@]*" |
| 258 | "\\)" "@" |
| 259 | "\\(chiark\\|slimy\\|coriolis\\)\\.greenend\\.org\\.uk" |
| 260 | "\\|" "distorted\\.mdw@g\\(oogle\\)?mail.com" |
| 261 | "\\|" "mwooding@\\(good\\|blackberry\\)\\.com" |
| 262 | "\\|" "mark\\.wooding@trustonic\\.com" |
| 263 | "\\)$") |
| 264 | bbdb-canonicalize-net-hook |
| 265 | (lambda (addr) |
| 266 | (cond ((null addr) |
| 267 | nil) |
| 268 | ((or (string-match "^mailer-daemon@" addr) |
| 269 | (string-match "\.invalid$" addr) |
| 270 | (string-match (concat "^reply-[0-9a-f]+-[0-9a-f]+_" |
| 271 | "HTML-[0-9]+-[0-9]+-[0-9]+" |
| 272 | "@\\(nationwide-communications\\." |
| 273 | "co\\.uk\\)$") |
| 274 | addr) |
| 275 | (string-match (concat "^[0-9]+@bugs\\." |
| 276 | "\\(" "debian\\.org" |
| 277 | "\\|" "distorted\\.org\\.uk" |
| 278 | "\\)$") |
| 279 | addr) |
| 280 | (string-match (concat "^MicrosoftExchange[0-9a-f]*" |
| 281 | "@newincco\\.onmicrosoft\\.com") |
| 282 | addr) |
| 283 | (member (md5 addr) |
| 284 | '("8815c5583970856799c85a3ee0eb6a9f" ;work wiki spam |
| 285 | "0b94ab4d25dacaa5ac07243a09c9e22e" ;work bug spam |
| 286 | "35fb1633379a1e4d4be3b139cae20111" ;work crucible spam |
| 287 | )) |
| 288 | (and (string-match "^news\\([0-9]+\\)@\\(.*\\)$" addr) |
| 289 | (string= (md5 (match-string 2 addr)) |
| 290 | "879b795aed959b1a000e9f95c132b16c"))) |
| 291 | nil) |
| 292 | ((string-match "^\\([^@+]+\\)\\+[^@]*\\(@.*\\)$" addr) |
| 293 | (concat (match-string 1 addr) (match-string 2 addr))) |
| 294 | (t addr)))) |
| 295 | |
| 296 | ;; Customization. |
| 297 | |
| 298 | (setq custom-file "~/.emacs-custom") |
| 299 | (trap (load custom-file)) |
| 300 | |
| 301 | (trap (load "~/.emacs-local")) |
| 302 | |
| 303 | ;; Internationalization twiddling. |
| 304 | |
| 305 | (trap |
| 306 | ;; Have top-bit-set characters work properly in terminals. |
| 307 | (let ((im (current-input-mode))) |
| 308 | (apply #'set-input-mode |
| 309 | (nconc (list (nth 0 im) (nth 1 im) 0) (nthcdr 3 im))))) |
| 310 | |
| 311 | ;; Some unpleasant terminal hackery. Screen prefixes the current terminal |
| 312 | ;; name with `screen.', and Emacs is too dim to split the name at the `.'. |
| 313 | ;; Help it out. |
| 314 | |
| 315 | (defun terminal-init-screen.xterm () |
| 316 | (tty-run-terminal-initialization (selected-frame) "screen")) |
| 317 | (defun terminal-init-screen.putty () |
| 318 | (tty-run-terminal-initialization (selected-frame) "screen")) |
| 319 | |
| 320 | ;; Don't disable any commands. |
| 321 | |
| 322 | (mapatoms #'(lambda (sym) (put sym 'disabled nil))) |
| 323 | |
| 324 | ;; Split a wide window. |
| 325 | |
| 326 | (mdw-divvy-window) |
| 327 | |
| 328 | ;; Postscript printing. |
| 329 | |
| 330 | (let ((mm (/ 72 25.4))) |
| 331 | (setq ps-paper-type 'a4 |
| 332 | ps-print-only-one-header t |
| 333 | ps-print-color-p t |
| 334 | ps-landscape-mode t ps-number-of-columns 4 |
| 335 | ps-line-number t ps-line-number-step 5 ps-line-number-start 5 |
| 336 | ps-zebra-stripes nil ps-zebra-stripe-height 5 |
| 337 | ps-spool-duplex t ps-spool-tumble nil ps-spool-config 'setpagedevice |
| 338 | ps-top-margin (* 12 mm) |
| 339 | ps-bottom-margin (* 16 mm) |
| 340 | ps-header-offset (* 8 mm) |
| 341 | ps-left-margin (* 12 mm) |
| 342 | ps-right-margin (* 12 mm) |
| 343 | ps-inter-column (* 4 mm) |
| 344 | ps-font-family 'CourierCondensed ps-font-size '(4.5 . 5.16) |
| 345 | ps-line-number-font 'Palatino ps-line-number-font-size 3 |
| 346 | ps-header-font-family 'Helvetica |
| 347 | ps-header-title-font-size '(8 . 10) |
| 348 | ps-header-font-size '(6 . 8))) |
| 349 | |
| 350 | ;; Splash screen stuff. |
| 351 | |
| 352 | (if (not mdw-splashy-startup) |
| 353 | (setq inhibit-splash-screen t |
| 354 | inhibit-startup-message t)) |
| 355 | |
| 356 | ;; Other goodies. |
| 357 | |
| 358 | (trap (resize-minibuffer-mode 1)) ;Make minibuffer grow dynamically |
| 359 | (auto-compression-mode 1) ;Enable automatic compression |
| 360 | (setq enable-local-variables :safe |
| 361 | enable-local-eval nil) |
| 362 | (setq dabbrev-case-replace nil) ;Retain case when completing |
| 363 | (setq linum-format "%7d ") |
| 364 | (setq next-line-add-newlines nil) ;Don't add weird newlines |
| 365 | (setq split-height-threshold nil) ;Reuse windows where sensible |
| 366 | (setq display-buffer-reuse-frames nil ;Don't confuse me by showing buffers |
| 367 | iswitchb-default-method 'samewindow ;in other random frames |
| 368 | ido-default-file-method 'selected-window |
| 369 | ido-default-buffer-method 'selected-window) |
| 370 | (setq ido-enable-prefix t |
| 371 | ido-enable-flex-matching t |
| 372 | ido-everywhere t |
| 373 | ido-confirm-unique-completion t |
| 374 | ido-use-filename-at-point nil |
| 375 | ido-auto-merge-work-directories-length -1) |
| 376 | (setq pcomplete-cycle-completions nil ;Who thought that was a good idea? |
| 377 | eshell-cmpl-cycle-completions nil) |
| 378 | (setq dired-deletion-confirmer ;Make deletion easier in dired |
| 379 | (symbol-function 'y-or-n-p) |
| 380 | delete-by-moving-to-trash (mdw-emacs-version-p 24) |
| 381 | dired-listing-switches "-alF" ;Do `ls -F' things in dired windows |
| 382 | wdired-allow-to-change-permissions 'advanced) |
| 383 | (setq read-quoted-char-radix 16) ;C-q HEX-STUFF [RET] |
| 384 | (setq case-fold-file-names nil) ;Don't translate file names (grr...) |
| 385 | (setq scroll-step 5) ;Don't scroll too much at a time |
| 386 | (setq custom-unlispify-tag-names nil ;Display variable names properly |
| 387 | custom-unlispify-menu-entries nil |
| 388 | custom-buffer-done-kill t) |
| 389 | (setq blink-cursor-blinks 0) ;Keep blinking the cursor |
| 390 | (setq-default fill-column mdw-text-width) ;I use rather narrow windows |
| 391 | (setq adaptive-fill-mode nil) ;I have my own machinery instead |
| 392 | (setq reb-re-syntax 'string) ;Enough backslashes even with this |
| 393 | (setq-default comment-column 40) ;Set a standard comment column |
| 394 | (setq-default truncate-partial-width-windows nil |
| 395 | truncate-lines t) |
| 396 | (setq line-move-visual t |
| 397 | visual-order-cursor-movement t) |
| 398 | (setq default-indicate-empty-lines t) |
| 399 | (setq view-read-only t) |
| 400 | (setq-default view-exit-action #'kill-buffer) |
| 401 | (and window-system (not mdw-fast-startup) |
| 402 | (setq confirm-kill-emacs #'yes-or-no-p)) |
| 403 | (setq whitespace-style '(trailing empty indentation face lines-tail |
| 404 | space-before-tab space-after-tab) |
| 405 | whitespace-line-column mdw-text-width) |
| 406 | (setq woman-use-own-frame nil ;Keep man pages somewhere sensible |
| 407 | woman-fill-column 72) ;Right margin position. |
| 408 | (setq diff-switches "-u" ;I like reading unified diffs |
| 409 | cvs-diff-flags (list diff-switches)) |
| 410 | (setq echo-keystrokes 10) ;Long delay before keystrokes echo |
| 411 | (setq ange-ftp-ftp-program-name "pftp") ;Use passive FTP |
| 412 | (setq find-ls-option ;Build file lists efficiently |
| 413 | '("-print0 | xargs -0r ls -ld" . "ld")) |
| 414 | (setq bookmark-save-flag 0) ;Save bookmarks automatically |
| 415 | (setq vc-follow-symlinks t |
| 416 | vc-git-resolve-conflicts nil) |
| 417 | (setq x-gtk-file-dialog-help-text nil) |
| 418 | (setq use-dialog-box nil) |
| 419 | (setq Info-fontify-maximum-menu-size 100000) |
| 420 | (setq set-mark-command-repeat-pop t) |
| 421 | (setq password-cache-expiry nil) |
| 422 | (setq mouse-autoselect-window nil) |
| 423 | (setq-default proced-filter 'all |
| 424 | proced-sort 'user) |
| 425 | (setq ispell-program-name "aspell-hack" |
| 426 | ispell-local-dictionary "en_GB-ize-w_accents" |
| 427 | flyspell-default-dictionary "en_GB-ize-w_accents" |
| 428 | ispell-local-dictionary-alist |
| 429 | '(("en_GB-ize-w_accents" "[[:alpha:]]" "[^[:alpha:]]" "'" t |
| 430 | ("-d" "en_GB-ize-w_accents") nil utf-8)) |
| 431 | ispell-silently-savep t) |
| 432 | (setq-default viper-case-fold-search t |
| 433 | viper-electric-mode t |
| 434 | viper-ex-style-motion nil |
| 435 | viper-ex-style-editing nil |
| 436 | viper-expert-level 5 |
| 437 | viper-inhibit-startup-message t |
| 438 | ;;viper-insert-state-cursor-color "red" |
| 439 | viper-no-multiple-ESC nil |
| 440 | viper-re-query-replace t |
| 441 | viper-re-search t |
| 442 | ;;viper-replace-overlay-cursor-color "red" |
| 443 | viper-shift-width 2 |
| 444 | viper-vi-style-in-minibuffer nil |
| 445 | viper-want-ctl-h-help t) |
| 446 | (trap |
| 447 | (require 'uniquify) |
| 448 | (setq uniquify-buffer-name-style 'post-forward-angle-brackets) |
| 449 | (setq uniquify-after-kill-buffer-p t)) |
| 450 | (transient-mark-mode t) |
| 451 | (setq mark-even-if-inactive t |
| 452 | shift-select-mode nil |
| 453 | delete-active-region nil |
| 454 | delete-selection-mode nil) |
| 455 | (trap |
| 456 | (tooltip-mode 0) |
| 457 | (tool-bar-mode 0)) |
| 458 | (trap (or mdw-fast-startup (global-auto-revert-mode t))) |
| 459 | |
| 460 | (defun mdw-set-viper-cursor-colour () |
| 461 | ;; ?? doesn't seem to work |
| 462 | (set-frame-parameter nil 'cursor-color "green") |
| 463 | (message ";; %S" post-command-hook) |
| 464 | (sit-for 2)) |
| 465 | ;;(add-hook 'viper-vi-state-hook 'mdw-set-viper-cursor-colour) |
| 466 | |
| 467 | (defcustom mdw-black-background t |
| 468 | "Whether the Emacs background is black (or dark, at any rate)." |
| 469 | :type 'boolean) |
| 470 | |
| 471 | (eval-after-load "outline" |
| 472 | '(progn |
| 473 | (trap (require 'foldout)) |
| 474 | (define-key outline-mode-prefix-map [?\C-r] 'reveal-mode) |
| 475 | (define-key outline-mode-prefix-map [?\C--] 'mdw-outline-collapse-all))) |
| 476 | |
| 477 | (define-key isearch-mode-map [?\C-?] 'isearch-del-char) |
| 478 | (define-key isearch-mode-map [backspace] 'isearch-del-char) |
| 479 | (define-key isearch-mode-map [?\e ?\C-?] 'isearch-delete-char) |
| 480 | |
| 481 | (setq imenu-auto-rescan t |
| 482 | imenu-auto-rescan-maxout (* 128 1024) |
| 483 | imenu-max-items 60) |
| 484 | |
| 485 | (setq cltl2-root-url (mdw-config 'cltl-url)) |
| 486 | (setq common-lisp-hyperspec-root (mdw-config 'hyperspec-url)) |
| 487 | |
| 488 | (setq ediff-split-window-function 'split-window-horizontally) |
| 489 | |
| 490 | (setq rfcview-rfc-location-pattern |
| 491 | "/ftp@mirror.distorted.org.uk:/pub/mirrors/rfc/rfc%s.txt" |
| 492 | rfcview-std-location-pattern |
| 493 | "/ftp@mirror.distorted.org.uk:/pub/mirrors/rfc/std/std%s.txt" |
| 494 | rfcview-index-location |
| 495 | "/ftp@mirror.distorted.org.uk:/pub/mirrors/rfc/rfc-index.txt") |
| 496 | |
| 497 | ;;;-------------------------------------------------------------------------- |
| 498 | ;;; W3 and URL fetching stuff. |
| 499 | |
| 500 | (let ((proxy (mdw-config 'http-proxy))) |
| 501 | (setq url-proxy-services |
| 502 | `(("http" . ,proxy) |
| 503 | ("ftp" . ,proxy) |
| 504 | ("gopher" . ,proxy)))) |
| 505 | (setq url-cookie-untrusted-urls '(".")) |
| 506 | |
| 507 | (setq browse-url-browser-function (mdw-good-url-browser) |
| 508 | browse-url-generic-program "mdw-chrome" |
| 509 | browse-url-mozilla-program "mdw-iceweasel") |
| 510 | |
| 511 | (setq w3m-default-display-inline-images t |
| 512 | w3m-use-cookies t) |
| 513 | |
| 514 | (eval-after-load "w3m" |
| 515 | '(let ((entries '(("application/pdf" "\\.pdf\\'" ("xdg-open" file) nil) |
| 516 | ("application/x-pdf" "\\.pdf\\'" ("xdg-open" file) nil)))) |
| 517 | (dolist (e entries) |
| 518 | (setq w3m-content-type-alist |
| 519 | (cons e (remove* (car e) w3m-content-type-alist |
| 520 | :key #'car :test #'string=)))))) |
| 521 | |
| 522 | (setq w3-do-incremental-display t |
| 523 | w3-use-menus '(file edit view go bookmark options |
| 524 | buffers style search emacs nil help) |
| 525 | w3-display-inline-image t |
| 526 | w3-keybinding 'info) |
| 527 | |
| 528 | ;;;-------------------------------------------------------------------------- |
| 529 | ;;; Calendar configuration. |
| 530 | |
| 531 | (setq diary-file |
| 532 | (let ((main-diary "~/etc/brain/diary") |
| 533 | (index "~/etc/index.diary")) |
| 534 | (if (file-exists-p index) |
| 535 | index |
| 536 | main-diary))) |
| 537 | |
| 538 | ;; Trivial stuff for the sunrise/sunset calculations. |
| 539 | |
| 540 | (setq calendar-latitude 52.2) |
| 541 | (setq calendar-longitude 0.1) |
| 542 | (setq calendar-location-name "Cambridge, UK") |
| 543 | |
| 544 | ;; Holidays. |
| 545 | |
| 546 | (and (not mdw-fast-startup) |
| 547 | (trap |
| 548 | (require 'ew-hols) |
| 549 | (setq other-holidays (append english-and-welsh-bank-holidays |
| 550 | other-holidays)))) |
| 551 | |
| 552 | ;; Date format fiddling. |
| 553 | |
| 554 | (setq european-calendar-style t |
| 555 | calendar-date-style 'european |
| 556 | calendar-time-display-form |
| 557 | '(24-hours ":" minutes |
| 558 | (if time-zone " (") time-zone (if time-zone ")"))) |
| 559 | |
| 560 | (setq diary-date-forms |
| 561 | '((day "[-/]" month "[^-/0-9]") |
| 562 | (day " *" monthname "[ \t]*\\(\^M\\|\n\\)") |
| 563 | (backup day " *" monthname "\\W+\\<\\([^*0-9]\\|[0-9]+[:aApP]\\)") |
| 564 | (day "[-/]" month "[-/]" year "[^0-9]") |
| 565 | (day " *" monthname " *" year "[^0-9]") |
| 566 | (year "[-/]" month "[-/]" day "[^0-9]") |
| 567 | (dayname "\\W"))) |
| 568 | |
| 569 | ;; Fancy diary handling. |
| 570 | |
| 571 | (add-hook 'diary-display-hook 'fancy-diary-display) |
| 572 | (setq diary-list-include-blanks t) |
| 573 | (cond ((mdw-emacs-version-p 23 1) |
| 574 | (add-hook 'list-diary-entries-hook 'diary-include-other-diary-files) |
| 575 | (add-hook 'mark-diary-entries-hook 'diary-mark-included-diary-files)) |
| 576 | (t |
| 577 | (add-hook 'list-diary-entries-hook 'include-other-diary-files) |
| 578 | (add-hook 'mark-diary-entries-hook 'mark-included-diary-files))) |
| 579 | |
| 580 | ;; Appointment management. |
| 581 | |
| 582 | (add-hook 'diary-hook 'appt-make-list) |
| 583 | (setq appt-issue-message t |
| 584 | appt-display-interval 3 |
| 585 | appt-message-warning-time 10 |
| 586 | appt-display-diary nil) |
| 587 | (and (not mdw-fast-startup) |
| 588 | (trap (require 'org) |
| 589 | (require 'bbdb) |
| 590 | (appt-activate 1))) |
| 591 | |
| 592 | ;; Org-mode agenda. |
| 593 | |
| 594 | (setq org-agenda-include-diary t |
| 595 | org-directory "~/etc/brain.local/" |
| 596 | org-default-notes-file (concat org-directory "local.org") |
| 597 | org-tags-column -77 |
| 598 | org-agenda-align-tags-to-column org-tags-column) |
| 599 | |
| 600 | ;; Cosmetic stuff. |
| 601 | |
| 602 | (setq calendar-view-diary-initially-flag nil |
| 603 | calendar-view-holidays-initially-flag nil |
| 604 | calendar-mark-diary-entries-flag t) |
| 605 | |
| 606 | (setq display-time-24hr-format t) |
| 607 | (display-time) |
| 608 | (column-number-mode 1) |
| 609 | (trap |
| 610 | (if mdw-splashy-startup |
| 611 | (let ((calendar-view-diary-initially-flag t)) |
| 612 | (calendar)))) |
| 613 | |
| 614 | ;;;-------------------------------------------------------------------------- |
| 615 | ;;; MailCrypt. |
| 616 | |
| 617 | ;; Define more mode hooks for MailCrypt. |
| 618 | |
| 619 | (setq mdw-mc-modes |
| 620 | '((mdwmail-mode (encrypt . mdwmail-mc-encrypt) |
| 621 | (sign . mdwmail-mc-sign)))) |
| 622 | |
| 623 | ;; Load the MailCrypt support. |
| 624 | |
| 625 | (trap |
| 626 | (and (string-match "linux" (symbol-name system-type)) |
| 627 | (not mdw-fast-startup) |
| 628 | (progn (require 'mailcrypt-init) |
| 629 | (require 'mailcrypt) |
| 630 | (setq mc-default-scheme 'mc-scheme-gpg) |
| 631 | (setq mc-pgp-user-id "mdw-nsict-pgp") |
| 632 | (setq mc-gpg-user-id "mdw-nsict-gpg") |
| 633 | (setq mc-modes-alist (append mc-modes-alist mdw-mc-modes)) |
| 634 | (setq mc-pgp-always-sign t) |
| 635 | (setq mc-gpg-always-sign t) |
| 636 | (setq mc-always-replace 'never) |
| 637 | (setq mc-passwd-timeout 3600) |
| 638 | (setq mc-temp-directory tmpdir) |
| 639 | (setq mc-modes-alist (append mc-modes-alist mdw-mc-modes)) |
| 640 | (define-key mc-write-mode-map "\C-c/S" 'mc-sign-region) |
| 641 | (define-key mc-write-mode-map "\C-c/E" 'mc-encrypt-region) |
| 642 | (add-hook 'text-mode-hook 'mc-install-write-mode)))) |
| 643 | |
| 644 | (setq epa-pinentry-mode 'loopback) |
| 645 | |
| 646 | ;;;-------------------------------------------------------------------------- |
| 647 | ;;; Other common declarations. |
| 648 | |
| 649 | ;; Default frame size. |
| 650 | |
| 651 | (setq frame-background-mode (if mdw-black-background 'dark 'light) |
| 652 | frame-inhibit-implied-resize t |
| 653 | default-frame-alist |
| 654 | `((width . ,(+ mdw-column-width mdw-frame-width-fudge)) |
| 655 | (height . 33) |
| 656 | (vertical-scroll-bars . right) |
| 657 | (cursor-type . bar) |
| 658 | (cursor-blink . t) |
| 659 | (left-fringe . 5) |
| 660 | (right-fringe . 5) |
| 661 | (scroll-bar-width . 15) |
| 662 | (tool-bar-lines . 0) |
| 663 | (menu-bar-lines . 1) |
| 664 | (cursor-color . "red") |
| 665 | (background-mode . ,frame-background-mode)) |
| 666 | initial-frame-alist |
| 667 | `((width . ,(+ mdw-column-width |
| 668 | (if (>= emacs-major-version 21) 0 1))) |
| 669 | (menu-bar-lines . ,(if window-system 1 0))) |
| 670 | window-system-default-frame-alist |
| 671 | '((pm (font . "-os2-System VIO-medium-r-normal--*-40-*-*-m-*-cp850") |
| 672 | (menu-font . "8.Helv") |
| 673 | (background-color . "lightgrey")) |
| 674 | (w32 (font . "fixed613 10") |
| 675 | (background-color . "black") |
| 676 | (foreground-color . "white")) |
| 677 | (nil (menu-bar-lines . 0) |
| 678 | (background-color . nil)))) |
| 679 | (let ((backg (frame-parameter nil 'background-color))) |
| 680 | (if (and backg window-system) |
| 681 | (push (cons 'background-color backg) default-frame-alist))) |
| 682 | |
| 683 | ;; Other frame fiddling. |
| 684 | |
| 685 | (defcustom mdw-hostname |
| 686 | (if (string-match "\\." system-name) |
| 687 | (substring system-name 0 (match-beginning 0)) |
| 688 | system-name) |
| 689 | "Unqualified hostname Emacs is running on." |
| 690 | :type 'string |
| 691 | :safe 'stringp) |
| 692 | (setq frame-title-format '("Emacs " user-login-name "@" mdw-hostname " – %b") |
| 693 | icon-title-format frame-title-format) |
| 694 | |
| 695 | ;; Global keymap changes. |
| 696 | |
| 697 | (trap |
| 698 | (windmove-default-keybindings)) |
| 699 | (setq windmove-wrap-around t) |
| 700 | (trap (require 'ido) (ido-mode 1) |
| 701 | (require 'ido-completing-read+) |
| 702 | (unless (fboundp 'ido-ubiquitous-mode) (require 'ido-ubiquitous)) |
| 703 | (ido-ubiquitous-mode 1) |
| 704 | (setq ido-cr+-max-items nil) |
| 705 | (let ((excludes `(,(concat "\\`" |
| 706 | "gtags-find-" |
| 707 | "\\(" "tag" |
| 708 | "\\|file" |
| 709 | "\\|rtag" |
| 710 | "\\|symbol" |
| 711 | "\\)" |
| 712 | "\\(" "\\|-other-window" |
| 713 | "\\)" |
| 714 | "\\'")))) |
| 715 | (if (boundp 'ido-ubiquitous-command-overrides) |
| 716 | (setq ido-ubiquitous-command-overrides |
| 717 | (append ido-ubiquitous-command-overrides |
| 718 | (mapcar (lambda (exclude) |
| 719 | (if (symbolp exclude) |
| 720 | `(enable-old exact |
| 721 | ,(symbol-name exclude)) |
| 722 | `(enable-old regexp ,exclude))) |
| 723 | excludes))) |
| 724 | (setq ido-cr+-function-blacklist |
| 725 | (append ido-cr+-function-blacklist excludes)))) |
| 726 | (setq magit-completing-read-function 'magit-ido-completing-read) |
| 727 | (require 'smex) (smex-initialize) (global-set-key [?\M-x] 'smex)) |
| 728 | |
| 729 | (progn |
| 730 | (global-set-key [?\e ?\e] 'mdw-wrong) |
| 731 | (global-set-key [?\e ?\C-\] ?\C-\]] 'keyboard-escape-quit) |
| 732 | (global-set-key [?\C-c ?\M-x] 'execute-extended-command) |
| 733 | (global-set-key [?\C-c ?d ?a] 'devhelp-assistant-word-at-point) |
| 734 | (global-set-key [?\C-c ?d ?w] 'devhelp-word-at-point) |
| 735 | (global-set-key [?\C-c ?g ?a] 'org-agenda) |
| 736 | (global-set-key [?\C-c ?g ?b] 'org-iswitchb) |
| 737 | (global-set-key [?\C-c ?g ?l] 'org-store-link) |
| 738 | (global-set-key [?\C-c ?k] 'mdw-compile) |
| 739 | (global-set-key [?\C-c ?m ?4 ?f] 'magit-find-file-other-window) |
| 740 | (global-set-key [?\C-c ?m ?b] 'magit-blame) |
| 741 | (global-set-key [?\C-c ?m ?d] 'magit-dispatch-popup) |
| 742 | (global-set-key [?\C-c ?m ?f] 'magit-find-file) |
| 743 | (global-set-key [?\C-c ?m ?l] 'magit-toggle-buffer-lock) |
| 744 | (global-set-key [?\C-c ?m ?m] 'magit-status) |
| 745 | (global-set-key [?\C-c ?m ?r] 'magit-list-repositories) |
| 746 | (global-set-key [?\C-c ?m ?w] 'magit-wip-log) |
| 747 | (global-set-key [?\C-c ?p ?s] 'mdw-mpc-stop) |
| 748 | (global-set-key [?\C-c ?p ?<] 'mdw-mpc-prev) |
| 749 | (global-set-key [?\C-c ?p ?>] 'mdw-mpc-next) |
| 750 | (global-set-key [?\C-c ?p ?+] 'mdw-mpc-louder) |
| 751 | (global-set-key [?\C-c ?p ?-] 'mdw-mpc-quieter) |
| 752 | (global-set-key [?\C-c ?p ??] 'mdw-mpc-now-playing) |
| 753 | (global-set-key [?\C-c ?p ?p] 'mdw-mpc-play-or-pause) |
| 754 | (global-set-key [?\C-c ?t ?4 ?.] 'gtags-find-tag-other-window) |
| 755 | (global-set-key [?\C-c ?t ?.] 'gtags-find-tag) |
| 756 | (global-set-key [?\C-c ?t ?R] 'timeclock-reread-log) |
| 757 | (global-set-key [?\C-c ?t ?,] 'gtags-pop-stack) |
| 758 | (global-set-key [?\C-c ?t ?c] 'timeclock-change) |
| 759 | (global-set-key [?\C-c ?t ?i] 'timeclock-in) |
| 760 | (global-set-key [?\C-c ?t ?o] 'timeclock-out) |
| 761 | (global-set-key [?\C-c ?t ?r] 'gtags-find-rtag) |
| 762 | (global-set-key [?\C-c ?t ?s] 'timeclock-status-string) |
| 763 | (global-set-key [?\C-c ?t ?t] 'gtags-find-tag-from-here) |
| 764 | (global-set-key [?\C-c ?t ?w] 'timeclock-workday-remaining-string) |
| 765 | (global-set-key [?\C-c ?v ?f] 'view-file) |
| 766 | (global-set-key [?\C-c ?v ?i] 'vm-visit-imap-folder) |
| 767 | (global-set-key [?\C-c ?v ?m] 'vm-visit-folder) |
| 768 | (global-set-key [?\C-c ?v ?v] 'mdw-auto-revert) |
| 769 | (global-set-key [?\C-c ?w ? ] 'mdw-designate-window) |
| 770 | (global-set-key [?\C-c ?w ?b] 'w3m-bookmark-view) |
| 771 | (global-set-key [?\C-c ?w ?c] 'mdw-set-frame-colour) |
| 772 | (global-set-key [?\C-c ?w ?d] 'mdw-divvy-window) |
| 773 | (global-set-key [?\C-c ?w ?h] 'windmove-left) |
| 774 | (global-set-key [?\C-c ?w ?j] 'windmove-down) |
| 775 | (global-set-key [?\C-c ?w ?k] 'windmove-up) |
| 776 | (global-set-key [?\C-c ?w ?l] 'windmove-right) |
| 777 | (global-set-key [?\C-c ?w ?r] 'winner-redo) |
| 778 | (global-set-key [?\C-c ?w ?s] 'mdw-switch-window-configuration) |
| 779 | (global-set-key [?\C-c ?w ?u] 'winner-undo) |
| 780 | (global-set-key [?\C-c ?w ?w] 'mdw-set-frame-width) |
| 781 | (global-set-key [?\C-c ?w up] 'windmove-up) |
| 782 | (global-set-key [?\C-c ?w down] 'windmove-down) |
| 783 | (global-set-key [?\C-c ?w left] 'windmove-left) |
| 784 | (global-set-key [?\C-c ?w right] 'windmove-right) |
| 785 | (global-set-key [?\C-h ?\C-m] 'manual-entry) |
| 786 | (global-set-key [?\C-x ?4 ?\C-j] 'dired-jump-other-window) |
| 787 | (global-set-key [?\C-x ?4 ?j] 'dired-jump-other-window) |
| 788 | (global-set-key [?\C-x ?\C-j] 'dired-jump) |
| 789 | (global-set-key [?\C-x ?\C-n] 'skel-create-file) |
| 790 | (global-set-key [?\C-x ?4 ?n] 'skel-create-file-other-window) |
| 791 | (global-set-key [?\C-x ?5 ?n] 'skel-create-file-other-frame) |
| 792 | (global-set-key [?\C-x ?3] 'mdw-split-window-horizontally) |
| 793 | (global-set-key [?\C-x ?/] 'auto-fill-mode) |
| 794 | (global-set-key [?\M-#] 'calc-dispatch) |
| 795 | (global-set-key [?\M-q] 'mdw-fill-paragraph) |
| 796 | (global-set-key [delete] 'delete-char) |
| 797 | (global-set-key [insertchar] 'overwrite-mode) |
| 798 | (global-set-key [C-M-backspace] 'backward-kill-sexp) |
| 799 | (global-set-key [mode-line C-mouse-1] 'mouse-tear-off-window) |
| 800 | (global-set-key [vertical-scroll-bar C-down-mouse-1] |
| 801 | 'mouse-drag-vertical-line) |
| 802 | (global-set-key [vertical-scroll-bar C-mouse-1] |
| 803 | #'(lambda () (interactive))) |
| 804 | (global-set-key [M-S-mouse-3] 'imenu) |
| 805 | (global-set-key [XF86WakeUp] "") |
| 806 | (global-set-key [f11] 'mdw-toggle-full-screen) |
| 807 | (and (not mdw-fast-startup) (fboundp 'hippie-expand) |
| 808 | (global-set-key [?\M-?] 'hippie-expand))) |
| 809 | |
| 810 | (eval-after-load "hippie-exp" |
| 811 | '(setq hippie-expand-try-functions-list |
| 812 | (remove-if (lambda (name) |
| 813 | (memq name '(try-expand-list |
| 814 | try-expand-list-all-buffers))) |
| 815 | hippie-expand-try-functions-list))) |
| 816 | |
| 817 | (autoload 'dired-jump "dired-x") |
| 818 | (autoload 'dired-jump-other-window "dired-x") |
| 819 | |
| 820 | (eval-after-load "dired" |
| 821 | '(progn |
| 822 | (or (lookup-key dired-mode-map [?\C-x ?\C-q]) |
| 823 | (define-key dired-mode-map [?\C-x ?\C-q] |
| 824 | 'wdired-change-to-wdired-mode)) |
| 825 | (trap (require 'dired-x)) |
| 826 | (and (fboundp 'dired-do-relsymlink) |
| 827 | (define-key dired-mode-map [?\C-c ?\C-s] 'dired-do-relsymlink)))) |
| 828 | (setq dired-guess-shell-alist-user |
| 829 | '(("\\.pdf\\'" "mupdf"))) |
| 830 | |
| 831 | (add-hook 'org-mode-hook |
| 832 | #'(lambda () (mdw-clobber-evil-keymap org-mode-map))) |
| 833 | (add-hook 'org-agenda-mode-hook |
| 834 | #'(lambda () (mdw-clobber-evil-keymap org-agenda-mode-map))) |
| 835 | (or mdw-fast-startup |
| 836 | (trap (progn |
| 837 | (org-remember-insinuate) |
| 838 | (global-set-key [?\C-c ?g ?r] 'org-remember)))) |
| 839 | |
| 840 | ;; Minor mode listing |
| 841 | |
| 842 | (setq minor-mode-alist |
| 843 | (mdw-uniquify-alist '((reveal-mode (hs-minor-mode |
| 844 | " hs/r" |
| 845 | (global-reveal-mode |
| 846 | "" " Reveal"))) |
| 847 | (hs-minor-mode (reveal-mode "" " hs")) |
| 848 | (abbrev-mode "") |
| 849 | (gtags-mode "")) |
| 850 | minor-mode-alist)) |
| 851 | |
| 852 | ;; Recognising types of files. |
| 853 | |
| 854 | (setq auto-mode-alist |
| 855 | (append `(("\\.p[lm]$" . cperl-mode) |
| 856 | ("\\.sage$" . python-mode) |
| 857 | ("\\.m$" . objc-mode) |
| 858 | ("\\.mxd$" . c-mode) |
| 859 | ("\\.cs$" . csharp-mode) |
| 860 | ("\\.go$" . go-mode) |
| 861 | ("\\.org$" . org-mode) |
| 862 | ("\\.make$" . makefile-mode) |
| 863 | ("\\.mk?d$" . markdown-mode) |
| 864 | ;; ("/[ch]/" . c-mode) |
| 865 | (,(concat "/\\(" |
| 866 | "\\.stgit\\.msg" "\\|" |
| 867 | "\\.topmsg" "\\|" |
| 868 | "\\.git/COMMIT_EDITMSG" "\\|" |
| 869 | "svn-commit\\.tmp" "\\|" |
| 870 | "svk-commit[^/.]*\\.tmp" |
| 871 | "\\)$") |
| 872 | . text-mode) |
| 873 | (,(concat "^" tmpdir "/\\(" |
| 874 | "svk-commit[^/.]*\\.tmp" "\\|" |
| 875 | "gitci\\.[^/.]*" "\\|" |
| 876 | "cvs[^/.]\\{6\\}" "\\|" |
| 877 | "quilt_header\.[^/.]\\{6\\}" |
| 878 | "\\)$") |
| 879 | . text-mode) |
| 880 | ("\\.calc?$" . apcalc-mode) |
| 881 | ("/\\(s\\|sh\\)/" . arm-assembler-mode) |
| 882 | ("\\.\\(cmd\\|exec\\|rexx\\)$" . rexx-mode) |
| 883 | ("\\.st$" . smalltalk-mode) |
| 884 | ("\\.msgs$" . messages-mode) |
| 885 | ("/all-cmds\\.in$" . cpp-messages-mode) |
| 886 | ("\\.\\(tex\\|dtx\\)$" . latex-mode) |
| 887 | ("\\.gc$" . haskell.-mode) |
| 888 | (,(concat "^" (getenv "HOME") "/News/") . mdwmail-mode) |
| 889 | (,(concat "^" tmpdir "/\\(SLRN\\|snd\\|pico\\|mutt\\)") |
| 890 | . mdwmail-mode)) |
| 891 | auto-mode-alist)) |
| 892 | |
| 893 | (setq interpreter-mode-alist |
| 894 | (append `(("runlisp" . lisp-mode) |
| 895 | ("@BASH@" . sh-mode) |
| 896 | ("@PYTHON@" . python-mode) |
| 897 | ("sage" . python-mode) |
| 898 | ("@PERL@" . cperl-mode) |
| 899 | ("perl" . cperl-mode) |
| 900 | ("@TCLSH@" . tcl-mode) |
| 901 | ("@WISH@" . tcl-mode) |
| 902 | ("tclsh" . tcl-mode) |
| 903 | ("wish" . tcl-mode)) |
| 904 | interpreter-mode-alist)) |
| 905 | |
| 906 | (setq completion-ignored-extensions |
| 907 | (append `(".hc" ".hi") completion-ignored-extensions)) |
| 908 | (dolist (dir (remove-if-not (lambda (ext) |
| 909 | (= (aref ext (- (length ext) 1)) ?/)) |
| 910 | completion-ignored-extensions)) |
| 911 | (if (/= (aref dir 0) ?/) |
| 912 | (setq completion-ignored-extensions |
| 913 | (cons (concat "/" dir) |
| 914 | (remove dir completion-ignored-extensions))))) |
| 915 | |
| 916 | ;; Some common local definitions. |
| 917 | |
| 918 | (make-variable-buffer-local 'mdw-auto-indent) |
| 919 | |
| 920 | (global-font-lock-mode t) |
| 921 | |
| 922 | ;;;-------------------------------------------------------------------------- |
| 923 | ;;; Rootly editingness. |
| 924 | |
| 925 | (eval-after-load "tramp" |
| 926 | '(let ((fix-args (if (mdw-version-< tramp-version "2.1") |
| 927 | #'append #'list))) |
| 928 | (setq tramp-methods |
| 929 | (mdw-uniquify-alist |
| 930 | `(("become" |
| 931 | (tramp-connection-function tramp-open-connection-su) |
| 932 | (tramp-remote-sh "/bin/sh") |
| 933 | (tramp-login-program "become") |
| 934 | (tramp-copy-program nil) |
| 935 | (tramp-copy-args nil) |
| 936 | (tramp-copy-keep-date-arg nil) |
| 937 | (tramp-login-args ,(funcall fix-args `("TERM=dumb" "%u")))) |
| 938 | ("really" |
| 939 | (tramp-connection-function tramp-open-connection-su) |
| 940 | (tramp-login-program "really") |
| 941 | (tramp-login-args ,(funcall fix-args |
| 942 | `("-u" "%u") |
| 943 | `("--") |
| 944 | `("env" "TERM=dumb" "/bin/sh"))) |
| 945 | (tramp-copy-program nil) |
| 946 | (tramp-copy-args nil) |
| 947 | (tramp-copy-keep-date-arg nil) |
| 948 | (tramp-remote-sh "/bin/sh")) |
| 949 | ,@tramp-methods))) |
| 950 | (setq tramp-default-method "ssh") |
| 951 | (let ((rootlyness (cond ((executable-find "really") "really") |
| 952 | ((executable-find "become") "become") |
| 953 | ((executable-find "sudo") "sudo") |
| 954 | (t "su"))) |
| 955 | (this-host (concat "\\`\\(localhost\\|" |
| 956 | (system-name) "\\)?\\'")) |
| 957 | (this-user (concat "\\`\\(" (user-login-name) "\\|" |
| 958 | (user-real-login-name) "\\)?\\'"))) |
| 959 | (setq tramp-default-method-alist |
| 960 | `((,this-host nil ,rootlyness) |
| 961 | (nil ,this-user "ssh") |
| 962 | (nil "." ,rootlyness))) |
| 963 | (setq tramp-default-proxies-alist |
| 964 | `((,this-host nil nil) |
| 965 | (nil "." "/ssh:%h:")))))) |
| 966 | |
| 967 | ;;;-------------------------------------------------------------------------- |
| 968 | ;;; General fontification. |
| 969 | |
| 970 | ;; Configure lazy fontification. |
| 971 | |
| 972 | (and (fboundp 'lazy-lock-mode) |
| 973 | (setq font-lock-support-mode 'lazy-lock-mode)) |
| 974 | ; (setq lazy-lock-defer-contextually t) |
| 975 | (setq lazy-lock-defer-time nil |
| 976 | font-lock-maximum-decoration 3 |
| 977 | lazy-lock-minimum-size 0 |
| 978 | lazy-lock-stealth-time 5 |
| 979 | lazy-lock-stealth-lines 100 |
| 980 | lazy-lock-stealth-verbose t) |
| 981 | |
| 982 | ;; Late, for `mdw-black-background'. |
| 983 | (setq-default py-python-command-args |
| 984 | `("-i" "-colors" ,(if mdw-black-background "Linux" "LightBG"))) |
| 985 | |
| 986 | ;;;-------------------------------------------------------------------------- |
| 987 | ;;; Blogging. |
| 988 | |
| 989 | (setq weblogger-config-alist |
| 990 | '(("vox" |
| 991 | ("user" . "mdw") |
| 992 | ("server-url" . "http://vox.distorted.org.uk/admin/mt-xmlrpc.cgi") |
| 993 | ("weblog" . "1")))) |
| 994 | |
| 995 | ;;;-------------------------------------------------------------------------- |
| 996 | ;;; Shell mode. |
| 997 | |
| 998 | ;; Make the shell mode aware of my prompt. |
| 999 | |
| 1000 | (setq shell-prompt-pattern "^[^]#$%>»}\n]*\\([]#$%»}]\\|>>?\\) *") |
| 1001 | (setq comint-password-prompt-regexp |
| 1002 | (concat "\\(\\([Ee]nter \\|[Oo]ld \\|[Nn]ew \\|[a-zA-Z0-9_]*'s \\|^\\)" |
| 1003 | "[Pp]assword\\|[Pp]ass ?phrase\\( [-a-zA-Z0-9._]+\\)?\\):") |
| 1004 | comint-file-name-chars "~/A-Za-z0-9+@:_.$#%,={}-" |
| 1005 | shell-file-name-chars comint-file-name-chars) |
| 1006 | |
| 1007 | ;; Notice passwords, and make C-a work right. |
| 1008 | |
| 1009 | (add-hook 'shell-mode-hook #'mdw-sh-mode-setup) |
| 1010 | (add-hook 'shell-mode-hook #'ansi-color-for-comint-mode-on) |
| 1011 | (setq shell-font-lock-keywords nil) |
| 1012 | |
| 1013 | (add-hook 'term-mode-hook #'mdw-term-mode-setup) |
| 1014 | |
| 1015 | ;;;-------------------------------------------------------------------------- |
| 1016 | ;;; Finishing touches. |
| 1017 | |
| 1018 | (trap (select-window mdw-init-window)) |
| 1019 | (provide 'emacs-init) |
| 1020 | |
| 1021 | ;;;----- That's all, folks -------------------------------------------------- |