el/dot-emacs.el: Don't prompt to save other buffers on WIP save.
[profile] / el / dot-emacs.el
index 02bf93d..5314fd9 100644 (file)
@@ -293,56 +293,6 @@ it's currently off."
         (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)
@@ -565,6 +515,114 @@ Pretend they don't exist.  They might be on other display devices."
   (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"
@@ -1042,8 +1100,7 @@ case."
   (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))))
@@ -1198,7 +1255,7 @@ doesn't match any of the regular expressions in
 (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))
@@ -1551,7 +1608,7 @@ doesn't match any of the regular expressions in
 ;;;--------------------------------------------------------------------------
 ;;; Where is point?
 
-(mdw-define-face mdw-point-overlay
+(mdw-define-face mdw-point-overlay-face
   (((type graphic)))
   (((min-colors 64)) :background "darkblue")
   (((class color)) :background "blue")
@@ -1575,7 +1632,7 @@ doesn't match any of the regular expressions in
          (setq s (concat s ss))))
       (when (or left right)
        (overlay-put ov 'before-string s)))
-    (overlay-put ov 'face 'mdw-point-overlay)
+    (overlay-put ov 'face 'mdw-point-overlay-face)
     (delete-overlay ov)
     ov))
 
@@ -3456,6 +3513,9 @@ that character only to be normal punctuation.")
 (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.
 
@@ -3719,6 +3779,15 @@ that character only to be normal punctuation.")
   (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
@@ -3801,6 +3870,18 @@ This allows you to pass a list of arguments through `ansi-term'."
          (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: ")
@@ -3848,6 +3929,10 @@ This allows you to pass a list of arguments through `ansi-term'."
                           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)