(ad-set-arg 0 dir)
ad-do-it)))
+(defun mdw-dired-run (args &optional syncp)
+ (interactive (let ((file (dired-get-filename t)))
+ (list (read-string (format "Arguments for %s: " file))
+ current-prefix-arg)))
+ (funcall (if syncp 'shell-command 'async-shell-command)
+ (concat (shell-quote-argument (dired-get-filename nil))
+ " " args)))
+
+(eval-after-load "dired"
+ '(define-key dired-mode-map "X" 'mdw-dired-run))
+
;;;--------------------------------------------------------------------------
;;; URL viewing.
(mdw-define-face comint-highlight-input
(t nil))
+(mdw-define-face ido-subdir
+ (t :foreground "cyan" :weight bold))
+
(mdw-define-face dired-directory
(t :foreground "cyan" :weight bold))
(mdw-define-face dired-symlink
(mdw-define-face ediff-odd-diff-Ancestor
(((class color) (type x)) :background "#320"))
+(mdw-define-face magit-hash
+ (((class color) (type x)) :foreground "grey40")
+ (((class color) (type tty)) :foreground "blue"))
+(mdw-define-face magit-diff-hunk-heading
+ (((class color) (type x)) :foreground "grey70" :background "grey25")
+ (((class color) (type tty)) :foreground "yellow"))
+(mdw-define-face magit-diff-hunk-heading-highlight
+ (((class color) (type x)) :foreground "grey70" :background "grey35")
+ (((class color) (type tty)) :foreground "yellow" :background "blue"))
+(mdw-define-face magit-diff-added
+ (((class color) (type x)) :foreground "#ddffdd" :background "#335533")
+ (((class color) (type tty)) :foreground "green"))
+(mdw-define-face magit-diff-added-highlight
+ (((class color) (type x)) :foreground "#cceecc" :background "#336633")
+ (((class color) (type tty)) :foreground "green" :background "blue"))
+(mdw-define-face magit-diff-removed
+ (((class color) (type x)) :foreground "#ffdddd" :background "#553333")
+ (((class color) (type tty)) :foreground "red"))
+(mdw-define-face magit-diff-removed-highlight
+ (((class color) (type x)) :foreground "#eecccc" :background "#663333")
+ (((class color) (type tty)) :foreground "red" :background "blue"))
+
(mdw-define-face dylan-header-background
(((class color) (type x)) :background "NavyBlue")
(t :background "blue"))
git-grep-command 'git-grep-history)))
(grep command-args))
+;;;--------------------------------------------------------------------------
+;;; Magit configuration.
+
(setq magit-diff-refine-hunk 'all
magit-view-git-manual-method 'man
magit-log-margin '(nil age magit-log-margin-width t 18)
(magit-wip-after-apply-mode 1)
(magit-wip-before-change-mode 1)
(add-to-list 'magit-no-confirm 'safe-with-wip)
+ (push '(:eval (if (or magit-wip-after-save-local-mode
+ magit-wip-after-apply-mode
+ magit-wip-before-change-mode)
+ (format " wip:%s%s%s"
+ (if magit-wip-after-apply-mode "A" "")
+ (if magit-wip-before-change-mode "C" "")
+ (if magit-wip-after-save-local-mode "S" ""))))
+ minor-mode-alist)
(dolist (popup '(magit-diff-popup
magit-diff-refresh-popup
magit-diff-mode-refresh-popup
(if (> n 0) 'bold 'shadow))))))
;;;--------------------------------------------------------------------------
+;;; MPC configuration.
+
+(setq mpc-browser-tags '(Artist|Composer|Performer Album|Playlist))
+
+(defun mdw-mpc-now-playing ()
+ (interactive)
+ (require 'mpc)
+ (save-excursion
+ (set-buffer (mpc-proc-cmd (mpc-proc-cmd-list '("status" "currentsong"))))
+ (mpc--status-callback))
+ (let ((state (cdr (assq 'state mpc-status))))
+ (cond ((member state '("stop"))
+ (message "mpd stopped."))
+ ((member state '("play" "pause"))
+ (let* ((artist (cdr (assq 'Artist mpc-status)))
+ (album (cdr (assq 'Album mpc-status)))
+ (title (cdr (assq 'Title mpc-status)))
+ (file (cdr (assq 'file mpc-status)))
+ (duration-string (cdr (assq 'Time mpc-status)))
+ (time-string (cdr (assq 'time mpc-status)))
+ (time (and time-string
+ (string-to-number
+ (if (string-match ":" time-string)
+ (substring time-string
+ 0 (match-beginning 0))
+ (time-string)))))
+ (duration (and duration-string
+ (string-to-number duration-string)))
+ (pos (and time duration
+ (format " [%d:%02d/%d:%02d]"
+ (/ time 60) (mod time 60)
+ (/ duration 60) (mod duration 60))))
+ (fmt (cond ((and artist title)
+ (format "`%s' by %s%s" title artist
+ (if album (format ", from `%s'" album)
+ "")))
+ (file
+ (format "`%s' (no tags)" file))
+ (t
+ "(no idea what's playing!)"))))
+ (if (string= state "play")
+ (message "mpd playing %s%s" fmt (or pos ""))
+ (message "mpd paused in %s%s" fmt (or pos "")))))
+ (t
+ (message "mpd in unknown state `%s'" state)))))
+
+(defmacro mdw-define-mpc-wrapper (func bvl interactive &rest body)
+ `(defun ,func ,bvl
+ (interactive ,@interactive)
+ (require 'mpc)
+ ,@body
+ (mdw-mpc-now-playing)))
+
+(mdw-define-mpc-wrapper mdw-mpc-play-or-pause () nil
+ (if (member (cdr (assq 'state (mpc-cmd-status))) '("play"))
+ (mpc-pause)
+ (mpc-play)))
+
+(mdw-define-mpc-wrapper mdw-mpc-next () nil (mpc-next))
+(mdw-define-mpc-wrapper mdw-mpc-prev () nil (mpc-prev))
+(mdw-define-mpc-wrapper mdw-mpc-stop () nil (mpc-stop))
+
+(defun mdw-mpc-hack-lines (arg interactivep func)
+ (if (and interactivep (use-region-p))
+ (let ((from (region-beginning)) (to (region-end)))
+ (goto-char from)
+ (beginning-of-line)
+ (funcall func)
+ (forward-line)
+ (while (< (point) to)
+ (funcall func)
+ (forward-line)))
+ (let ((n (prefix-numeric-value arg)))
+ (cond ((minusp n)
+ (unless (bolp)
+ (beginning-of-line)
+ (funcall func)
+ (incf n))
+ (while (minusp n)
+ (forward-line -1)
+ (funcall func)
+ (incf n)))
+ (t
+ (beginning-of-line)
+ (while (plusp n)
+ (funcall func)
+ (forward-line)
+ (decf n)))))))
+
+(defun mdw-mpc-select-one ()
+ (when (and (get-char-property (point) 'mpc-file)
+ (not (get-char-property (point) 'mpc-select)))
+ (mpc-select-toggle)))
+
+(defun mdw-mpc-unselect-one ()
+ (when (get-char-property (point) 'mpc-select)
+ (mpc-select-toggle)))
+
+(defun mdw-mpc-select (&optional arg interactivep)
+ (interactive (list current-prefix-arg t))
+ (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+
+(defun mdw-mpc-unselect (&optional arg interactivep)
+ (interactive (list current-prefix-arg t))
+ (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-unselect-one))
+
+(defun mdw-mpc-unselect-backwards (arg)
+ (interactive "p")
+ (mdw-mpc-hack-lines (- arg) t 'mdw-mpc-unselect-one))
+
+(defun mdw-mpc-unselect-all ()
+ (interactive)
+ (setq mpc-select nil)
+ (mpc-selection-refresh))
+
+(defun mdw-mpc-next-line (arg)
+ (interactive "p")
+ (beginning-of-line)
+ (forward-line arg))
+
+(defun mdw-mpc-previous-line (arg)
+ (interactive "p")
+ (beginning-of-line)
+ (forward-line (- arg)))
+
+(eval-after-load "mpc"
+ '(progn
+ (define-key mpc-mode-map "m" 'mdw-mpc-select)
+ (define-key mpc-mode-map "u" 'mdw-mpc-unselect)
+ (define-key mpc-mode-map "\177" 'mdw-mpc-unselect-backwards)
+ (define-key mpc-mode-map "\e\177" 'mdw-mpc-unselect-all)
+ (define-key mpc-mode-map "n" 'mdw-mpc-next-line)
+ (define-key mpc-mode-map "p" 'mdw-mpc-previous-line)
+ (setq mpc-songs-mode-map (make-sparse-keymap))
+ (set-keymap-parent mpc-songs-mode-map mpc-mode-map)
+ (define-key mpc-songs-mode-map "l" 'mpc-playlist)
+ (define-key mpc-songs-mode-map "+" 'mpc-playlist-add)
+ (define-key mpc-songs-mode-map "-" 'mpc-playlist-delete)))
+
+;;;--------------------------------------------------------------------------
;;; Inferior Emacs Lisp.
(setq comint-prompt-read-only t)