(other-window 1))
(select-window win)))
+(defun mdw-set-frame-width (columns &optional width)
+ (interactive "nColumns:
+P")
+ (setq width (cond (width (prefix-numeric-value width))
+ ((and window-system (mdw-emacs-version-p 22))
+ mdw-column-width)
+ (t (1+ mdw-column-width))))
+ (let ((sb-width (mdw-horizontal-window-overhead)))
+ (set-frame-width (selected-frame)
+ (- (* columns (+ width sb-width))
+ sb-width))
+ (mdw-divvy-window width)))
+
;; Don't raise windows unless I say so.
(defvar mdw-inhibit-raise-frame nil
(or transient-mark-mode (setq transient-mark-mode 'only))
(set-mark (mark t)))))
-;; Improved compilation machinery.
-
-(setq compile-command
- (let ((ncpu (with-temp-buffer
- (insert-file-contents "/proc/cpuinfo")
- (buffer-string)
- (count-matches "^processor\\s-*:"))))
- (format "make -j%d -k" (* 2 ncpu))))
-
-(defun mdw-compilation-buffer-name (mode)
- (concat "*" (downcase mode) ": "
- (abbreviate-file-name default-directory) "*"))
-(setq compilation-buffer-name-function 'mdw-compilation-buffer-name)
-
-(eval-after-load "compile"
- '(progn
- (define-key compilation-shell-minor-mode-map "\C-c\M-g" 'recompile)))
-
-(defun mdw-compile (command &optional directory comint)
- "Initiate a compilation COMMAND, maybe in a different DIRECTORY.
-The DIRECTORY may be nil to not change. If COMINT is t, then
-start an interactive compilation.
-
-Interactively, prompt for the command if the variable
-`compilation-read-command' is non-nil, or if requested through
-the prefix argument. Prompt for the directory, and run
-interactively, if requested through the prefix.
-
-Use a prefix of 4, 6, 12, or 14, or type C-u between one and three times, to
-force prompting for a directory.
-
-Use a prefix of 2, 6, 10, or 14, or type C-u three times, to force
-prompting for the command.
-
-Use a prefix of 8, 10, 12, or 14, or type C-u twice or three times,
-to force interactive compilation."
- (interactive
- (let* ((prefix (prefix-numeric-value current-prefix-arg))
- (command (eval compile-command))
- (dir (and (plusp (logand prefix #x54))
- (read-directory-name "Compile in directory: "))))
- (list (if (or compilation-read-command
- (plusp (logand prefix #x42)))
- (compilation-read-command command)
- command)
- dir
- (plusp (logand prefix #x58)))))
- (let ((default-directory (or directory default-directory)))
- (compile command comint)))
-
;; Functions for sexp diary entries.
(defun mdw-not-org-mode (form)
(ad-set-arg 2 nil))
;;;--------------------------------------------------------------------------
+;;; Improved compilation machinery.
+
+;; Uprated version of M-x compile.
+
+(setq compile-command
+ (let ((ncpu (with-temp-buffer
+ (insert-file-contents "/proc/cpuinfo")
+ (buffer-string)
+ (count-matches "^processor\\s-*:"))))
+ (format "make -j%d -k" (* 2 ncpu))))
+
+(defun mdw-compilation-buffer-name (mode)
+ (concat "*" (downcase mode) ": "
+ (abbreviate-file-name default-directory) "*"))
+(setq compilation-buffer-name-function 'mdw-compilation-buffer-name)
+
+(eval-after-load "compile"
+ '(progn
+ (define-key compilation-shell-minor-mode-map "\C-c\M-g" 'recompile)))
+
+(defadvice compile (around hack-environment compile activate)
+ "Hack the environment inherited by inferiors in the compilation."
+ (let ((process-environment process-environment))
+ (setenv "LD_PRELOAD" nil)
+ ad-do-it))
+
+(defun mdw-compile (command &optional directory comint)
+ "Initiate a compilation COMMAND, maybe in a different DIRECTORY.
+The DIRECTORY may be nil to not change. If COMINT is t, then
+start an interactive compilation.
+
+Interactively, prompt for the command if the variable
+`compilation-read-command' is non-nil, or if requested through
+the prefix argument. Prompt for the directory, and run
+interactively, if requested through the prefix.
+
+Use a prefix of 4, 6, 12, or 14, or type C-u between one and three times, to
+force prompting for a directory.
+
+Use a prefix of 2, 6, 10, or 14, or type C-u three times, to force
+prompting for the command.
+
+Use a prefix of 8, 10, 12, or 14, or type C-u twice or three times,
+to force interactive compilation."
+ (interactive
+ (let* ((prefix (prefix-numeric-value current-prefix-arg))
+ (command (eval compile-command))
+ (dir (and (plusp (logand prefix #x54))
+ (read-directory-name "Compile in directory: "))))
+ (list (if (or compilation-read-command
+ (plusp (logand prefix #x42)))
+ (compilation-read-command command)
+ command)
+ dir
+ (plusp (logand prefix #x58)))))
+ (let ((default-directory (or directory default-directory)))
+ (compile command comint)))
+
+;; Flymake support.
+
+(defun mdw-find-build-dir (build-file)
+ (catch 'found
+ (let* ((src-dir (file-name-as-directory (expand-file-name ".")))
+ (dir src-dir))
+ (loop
+ (when (file-exists-p (concat dir build-file))
+ (throw 'found dir))
+ (let ((sub (expand-file-name (file-relative-name src-dir dir)
+ (concat dir "build/"))))
+ (catch 'give-up
+ (loop
+ (when (file-exists-p (concat sub build-file))
+ (throw 'found sub))
+ (when (string= sub dir) (throw 'give-up nil))
+ (setq sub (file-name-directory (directory-file-name sub))))))
+ (when (string= dir
+ (setq dir (file-name-directory
+ (directory-file-name dir))))
+ (throw 'found nil))))))
+
+(defun mdw-flymake-make-init ()
+ (let ((build-dir (mdw-find-build-dir "Makefile")))
+ (and build-dir
+ (let ((tmp-src (flymake-init-create-temp-buffer-copy
+ #'flymake-create-temp-inplace)))
+ (flymake-get-syntax-check-program-args
+ tmp-src build-dir t t
+ #'flymake-get-make-cmdline)))))
+
+(setq flymake-allowed-file-name-masks
+ '(("\\.\\(?:[cC]\\|cc\\|cpp\\|cxx\\|c\\+\\+\\)\\'"
+ mdw-flymake-make-init)
+ ("\\.\\(?:[hH]\\|hh\\|hpp\\|hxx\\|h\\+\\+\\)\\'"
+ mdw-flymake-master-make-init)
+ ("\\.p[lm]" flymake-perl-init)))
+
+(setq flymake-mode-map
+ (let ((map (if (boundp 'flymake-mode-map)
+ flymake-mode-map
+ (make-sparse-keymap))))
+ (define-key map [?\C-c ?\C-f ?\C-p] 'flymake-goto-prev-error)
+ (define-key map [?\C-c ?\C-f ?\C-n] 'flymake-goto-next-error)
+ (define-key map [?\C-c ?\C-f ?\C-c] 'flymake-compile)
+ (define-key map [?\C-c ?\C-f ?\C-k] 'flymake-stop-all-syntax-checks)
+ (define-key map [?\C-c ?\C-f ?\C-e] 'flymake-popup-current-error-menu)
+ map))
+
+;;;--------------------------------------------------------------------------
;;; Mail and news hacking.
(define-derived-mode mdwmail-mode mail-mode "[mdw] mail"
(and mdw-auto-indent
(cond ((eq major-mode 'lisp-mode)
(local-set-key "\C-m" 'mdw-indent-newline-and-indent))
- ((or (eq major-mode 'slime-repl-mode)
- (eq major-mode 'asm-mode))
+ ((derived-mode-p 'slime-repl-mode 'asm-mode 'comint-mode)
nil)
(t
(local-set-key "\C-m" 'newline-and-indent))))
(mdw-define-face region
(((min-colors 64)) :background "grey30")
(((class color)) :background "blue")
- ((t) :inverse-video t))
+ (t :inverse-video t))
(mdw-define-face match
(((class color)) :background "blue")
(t :inverse-video t))
(mdw-define-face eshell-ls-readonly (t nil))
(mdw-define-face eshell-ls-symlink (t :foreground "cyan"))
+(defun mdw-eshell-hack () (setenv "LD_PRELOAD" nil))
+(add-hook 'eshell-mode-hook 'mdw-eshell-hack)
+
;;;--------------------------------------------------------------------------
;;; Messages-file mode.
(and mdw-auto-indent
(indent-for-tab-command)))
+(defadvice comint-line-beginning-position
+ (around mdw-calculate-it-properly () activate compile)
+ "Calculate the actual line start for multi-line input."
+ (if (or comint-use-prompt-regexp
+ (eq (field-at-pos (point)) 'output))
+ ad-do-it
+ (setq ad-return-value
+ (constrain-to-field (line-beginning-position) (point)))))
+
(defun mdw-setup-m4 ()
;; Inexplicably, Emacs doesn't match braces in m4 mode. This is very
(ad-set-arg 2 (car program))
(ad-set-arg 4 (cdr program))))))
+(defadvice term-exec-1 (around hack-environment compile activate)
+ "Hack the environment inherited by inferiors in the terminal."
+ (let ((process-environment process-environment))
+ (setenv "LD_PRELOAD" nil)
+ ad-do-it))
+
+(defadvice shell (around hack-environment compile activate)
+ "Hack the environment inherited by inferiors in the shell."
+ (let ((process-environment process-environment))
+ (setenv "LD_PRELOAD" nil)
+ ad-do-it))
+
(defun ssh (host)
"Open a terminal containing an ssh session to the HOST."
(interactive "sHost: ")
magit-revision-mode-refresh-popup))
(magit-define-popup-switch popup ?R "Reverse diff" "-R"))))
+(defadvice magit-wip-commit-buffer-file
+ (around mdw-just-this-buffer activate compile)
+ (let ((magit-save-repository-buffers nil)) ad-do-it))
+
(setq magit-repolist-columns
'(("Name" 16 magit-repolist-column-ident nil)
("Version" 18 magit-repolist-column-version nil)
(propertize (number-to-string n) 'face
(if (> n 0) 'bold 'shadow))))))
+(defun mdw-try-smerge ()
+ (save-excursion
+ (goto-char (point-min))
+ (when (re-search-forward "^<<<<<<< " nil t)
+ (smerge-mode 1))))
+(add-hook 'find-file-hook 'mdw-try-smerge t)
+
;;;--------------------------------------------------------------------------
;;; MPC configuration.