dot/emacs: Add key bindings for clipboard operations.
[profile] / el / dot-emacs.el
index 5475b35..1af6e8e 100644 (file)
@@ -706,10 +706,13 @@ With a prefix argument, clear the designated window."
   (interactive "P")
   (let ((window (selected-window)))
     (cond (cancel
-          (setq mdw-designated-window nil)
-          (unless (mdw-emacs-version-p 24)
-            (setq display-buffer-function nil))
-          (message "Window designation cleared."))
+          (cond (mdw-designated-window
+                 (setq mdw-designated-window nil)
+                 (unless (mdw-emacs-version-p 24)
+                   (setq display-buffer-function nil))
+                 (message "Window designation cleared."))
+                (t
+                 (message "No designated window active."))))
          ((window-dedicated-p window)
           (error "Window is dedicated to its buffer."))
          (t
@@ -766,9 +769,47 @@ Pretend they don't exist.  They might be on other display devices."
   (ad-set-arg 2 nil))
 
 (setq even-window-sizes nil
-      even-window-heights nil)
-
-(setq display-buffer-reuse-frames nil)
+      even-window-heights nil
+      display-buffer-reuse-frames nil)
+
+(defvar mdw-fallback-window-alist nil
+  "Alist mapping frames to fallback windows.")
+
+(defun mdw-cleanup-fallback-window-alist ()
+  "Remove entries for dead frames and windows from the fallback alist."
+  (let ((prev nil)
+       (cursor mdw-fallback-window-alist))
+    (while cursor
+      (let* ((assoc (car cursor))
+            (tail (cdr cursor)))
+       (cond ((and (frame-live-p (car assoc))
+                   (window-live-p (cdr assoc)))
+              (setq prev cursor))
+             ((null prev)
+              (setq mdw-fallback-window-alist tail))
+             (t
+              (setcdr prev tail)))
+       (setq cursor tail)))))
+
+(defun mdw-set-fallback-window (cancel)
+  "Prefer the selected window for pop-up buffers in this frame.
+With a prefix argument, clear the fallback window."
+  (interactive "P")
+  (let* ((frame (selected-frame)) (window (selected-window))
+        (assoc (assq (selected-frame) mdw-fallback-window-alist)))
+    (cond (cancel
+          (cond (assoc
+                 (setcdr assoc nil)
+                 (message "Fallback window cleared."))
+                (t
+                 (message "No fallback window active in this frame."))))
+         ((window-dedicated-p window)
+          (error "Window is dedicated to its buffer."))
+         (t
+          (if assoc (setcdr assoc window)
+            (push (cons frame window) mdw-fallback-window-alist))
+          (message "Fallback window set.")))
+    (mdw-cleanup-fallback-window-alist)))
 
 (defun mdw-last-window-in-frame-p (window)
   "Return whether WINDOW is the last in its frame."
@@ -788,10 +829,18 @@ Begone, foul DWIMmerlaik!
 This is all totally subject to arbitrary change in the future, but the
 emphasis is on predictability rather than crazy DWIMmery."
   (let* ((selected (selected-window)) chosen
+        (fallback (assq (selected-frame) mdw-fallback-window-alist))
         (full-height-p (window-full-height-p selected))
         (full-width-p (window-full-width-p selected)))
     (cond
 
+     ((and fallback (window-live-p (cdr fallback)))
+      ;; There's a fallback window set for this frame.  Use it.
+
+      (setq chosen (cdr fallback)
+           selected nil)
+      (display-buffer-record-window 'window chosen buffer))
+
      ((and full-height-p full-width-p)
       ;; We're basically the only window in the frame.  If we want to get
       ;; anywhere, we'll have to split the window.
@@ -1360,7 +1409,8 @@ If NEW-SESSION-P, start a new session."
   '(define-key w3m-mode-map [?\e ?\r] 'w3m-view-this-url-new-session))
 
 (defcustom mdw-good-url-browsers
-  '(browse-url-mozilla
+  '(browse-url-firefox
+    browse-url-mozilla
     browse-url-generic
     (w3m . mdw-w3m-browse-url)
     browse-url-w3)
@@ -2201,8 +2251,16 @@ doesn't match any of the regular expressions in
   (((min-colors 64)) :background "NavyBlue")
   (((class color)) :background "blue"))
 
+(mdw-define-face erc-my-nick-face
+  (t :foreground "yellow" :weight bold))
+(mdw-define-face erc-current-nick-face
+  (t :foreground "yellow" :weight bold))
 (mdw-define-face erc-input-face
-  (t :foreground "red"))
+  (t :foreground "yellow"))
+(mdw-define-face erc-action-face
+  ())
+(mdw-define-face erc-button
+  (t :foreground "cyan" :underline t :weight semi-bold))
 
 (mdw-define-face woman-bold
   (t :weight bold))
@@ -3398,6 +3456,7 @@ name, as a symbol."
   (modify-syntax-entry ?$ "\\" font-lock-syntax-table)
   (modify-syntax-entry ?: "." font-lock-syntax-table)
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
+  (setq auto-fill-function #'do-auto-fill)
 
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
@@ -5507,6 +5566,11 @@ rather than baking the list into the function."
   "Don't make windows dedicated.  Seriously."
   (set-window-dedicated-p (or window (selected-window)) nil))
 
+(defadvice gud-find-expr
+    (around mdw-inhibit-read-only (&rest args) compile activate)
+  "Inhibit errors caused by my setting of `comint-prompt-read-only'."
+  (let ((inhibit-read-only t)) ad-do-it))
+
 ;;;--------------------------------------------------------------------------
 ;;; SQL stuff.