X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/ff6a7bee1d2f9953fa7e87247cc15d89b41d3de8..4aba12fa4cbe02596d77f9437af4f6505c19745d:/el/dot-emacs.el diff --git a/el/dot-emacs.el b/el/dot-emacs.el index 403a5e4..5f27085 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")) @@ -2551,6 +2587,49 @@ strip numbers instead." "yield"))) ;;;-------------------------------------------------------------------------- +;;; Lua programming style. + +(setq lua-indent-level 2) + +(defun mdw-fontify-lua () + + ;; Miscellaneous fiddling. + (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)") + + ;; Now define fontification things. + (make-local-variable 'font-lock-keywords) + (let ((lua-keywords + (mdw-regexps "and" "break" "do" "else" "elseif" "end" + "false" "for" "function" "goto" "if" "in" "local" + "nil" "not" "or" "repeat" "return" "then" "true" + "until" "while"))) + (setq font-lock-keywords + (list + + ;; Set up the keywords defined above. + (list (concat "\\_<\\(" lua-keywords "\\)\\_>") + '(0 font-lock-keyword-face)) + + ;; At least numbers are simpler than C. + (list (concat "\\_<\\(" "0[xX]" + "\\(" "[0-9a-fA-F]+" + "\\(\\.[0-9a-fA-F]*\\)?" + "\\|" "\\.[0-9a-fA-F]+" + "\\)" + "\\([pP][-+]?[0-9]+\\)?" + "\\|" "\\(" "[0-9]+" + "\\(\\.[0-9]*\\)?" + "\\|" "\\.[0-9]+" + "\\)" + "\\([eE][-+]?[0-9]+\\)?" + "\\)") + '(0 mdw-number-face)) + + ;; And anything else is punctuation. + (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" + '(0 mdw-punct-face)))))) + +;;;-------------------------------------------------------------------------- ;;; Icon programming style. ;; Icon indentation style. @@ -3625,8 +3704,12 @@ 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) magit-wip-after-save-local-mode-lighter "" magit-wip-after-apply-mode-lighter "" magit-wip-before-change-mode-lighter "") @@ -3635,7 +3718,20 @@ This allows you to pass a list of arguments through `ansi-term'." (magit-wip-after-save-mode 1) (magit-wip-after-apply-mode 1) (magit-wip-before-change-mode 1) - (add-to-list 'magit-no-confirm 'safe-with-wip))) + (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 + magit-revision-mode-refresh-popup)) + (magit-define-popup-switch popup ?R "Reverse diff" "-R")))) (setq magit-repolist-columns '(("Name" 16 magit-repolist-column-ident nil) @@ -3671,6 +3767,148 @@ there is sadness." (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 () + (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)