X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/83d2acdd19ce767cb338bf7e9cceac034f800a30..a0e7592d945424a95ee299c1f932d77dad824cc1:/el/dot-emacs.el diff --git a/el/dot-emacs.el b/el/dot-emacs.el index cdd89f2..c189f4d 100644 --- a/el/dot-emacs.el +++ b/el/dot-emacs.el @@ -768,6 +768,17 @@ options." (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. @@ -1239,6 +1250,9 @@ doesn't match any of the regular expressions in (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 @@ -1421,6 +1435,28 @@ doesn't match any of the regular expressions in (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")) @@ -3668,6 +3704,9 @@ This allows you to pass a list of arguments through `ansi-term'." 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) @@ -3680,6 +3719,14 @@ This allows you to pass a list of arguments through `ansi-term'." (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 @@ -3720,6 +3767,143 @@ there is sadness." (if (> n 0) 'bold 'shadow)))))) ;;;-------------------------------------------------------------------------- +;;; MPC configuration. + +(defun mdw-mpc-play-or-pause () + (interactive) + (require 'mpc) + (if (member (cdr (assq 'state (mpc-cmd-status))) '("play")) + (mpc-pause) + (mpc-play))) + +(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))))) + +(autoload 'mpc-next "mpc") +(autoload 'mpc-prev "mpc") +(autoload 'mpc-stop "mpc") + +(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 () + (unless (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) + (mpc-selection-refresh)) + +(defun mdw-mpc-unselect (&optional arg interactivep) + (interactive (list current-prefix-arg t)) + (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-unselect-one) + (mpc-selection-refresh)) + +(defun mdw-mpc-unselect-backwards (arg) + (interactive "p") + (mdw-mpc-hack-lines (- arg) t 'mdw-mpc-unselect-one) + (mpc-selection-refresh)) + +(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)