依赖包
主要使用了dired-rainbow显示颜色,dired-efap编辑,dired-filter过滤,以及dired-async异步操作。
(require 'dired-rainbow)
(require 'dired-efap)
(require 'dired-filter)
(require 'dired-async)
一般设置
清理dired的buffer时不用确认
(setq dired-clean-confirm-killing-deleted-buffers nil)
find-ls的选项
(setq find-ls-option '("-print0 | xargs -0 ls -ald" . ""))
把目录显示在前面
(setq dired-listing-switches "--block-size=M -lvh --full-time --group-directories-first -n")
猜测用户自定义的缩写
(setq dired-guess-shell-alist-user nil)
递归删除目录
(setq dired-recursive-deletes 'always)
颜色设置
;; text file name extensions
(defvar text-file-name-extensions
(purecopy '("txt" "md" "org")))
;; doc file name extensions
(defvar doc-file-name-extensions
(purecopy '("pdf" "doc" "docx" "xls" "xlsx" "ppt" "xml" "htm" "html")))
;; code file name extensions
(defvar code-file-name-extensions
(purecopy '("h" "c" "cxx" "cpp" "el" "pl" "py" "pm")))
;; image file name extensions
(setq image-file-name-extensions
(append (purecopy '("jpe")) image-file-name-extensions))
;; audio file name extensions
(defvar audio-file-name-extensions
(purecopy '("mp3" "ogg" "wav" "wma" "flac" "aac" "ape" "aif")))
;; video file name extensions
(defvar video-file-name-extensions
(purecopy '("m4v" "mp4" "mov" "mkv" "avi" "rmvb" "rm" "wmv" "3gp" "vob"
"mpg" "mpeg" "divx" "ogm" "ogv" "asf" "flv" "webm")))
;; 加入Hook
(add-hook 'dired-mode-hook
(lambda ()
;; auto load dired-rainbow
(load "dired-rainbow")
(dired-rainbow-define text "white smoke"
text-file-name-extensions)
(dired-rainbow-define doc "light gray"
doc-file-name-extensions)
(dired-rainbow-define code "wheat"
code-file-name-extensions)
(dired-rainbow-define image "dark salmon"
image-file-name-extensions)
(dired-rainbow-define audio "tomato"
audio-file-name-extensions)
(dired-rainbow-define video "gold"
video-file-name-extensions)))
命令执行
定义一个advice,如果执行的命令加了&
,则在后台执行,忽略输出。
(defadvice dired-run-shell-command (around kid-dired-run-shell-command (command))
"Run a shell command COMMAND .
If the COMMAND ends with `&' then run it in background and *discard* the
output, otherwise simply let the original `dired-run-shell-command' run it."
(if (string-match "&[[:blank:]]*$" command)
(let ((proc (start-process "kid-shell" nil shell-file-name
shell-command-switch
(substring command 0 (match-beginning 0)))))
(set-process-sentinel proc 'shell-command-sentinel))
ad-do-it))
(ad-activate 'dired-run-shell-command)
音视频播放相关
使用mplayer查看媒体文件信息
(defun mplayer-identify ()
"Mplayer using '-identify command'."
(interactive)
(dired-run-shell-command
(concat "mplayer -identify -frames 5 -endpos 0 -vo null "
(shell-quote-wildcard-pattern (dired-file-name-at-point))))
(shrink-window 5)
(other-window 1))
使用mplayer翻转角度播放。
(defun mplayer-rotate-play (value)
"Mplayer using '-vf rotate=VALUE'."
(interactive "Nmplayer -vf rotate=")
(dired-run-shell-command
(concat (format "mplayer -vf rotate=%d " value)
(shell-quote-wildcard-pattern (dired-file-name-at-point)) " >/dev/null 2>&1 &")))
使用vlc播放
(defun vlc-play ()
"play video using 'VLC'."
(interactive "")
(dired-run-shell-command
(concat "vlc "
(shell-quote-wildcard-pattern (dired-file-name-at-point)) " >/dev/null 2>&1 &")))
加入快捷键
;; 使用i查看媒体信息
(define-key dired-mode-map (kbd "i")
'mplayer-identify)
;; 使用e播放
(define-key dired-mode-map (kbd "e")
'emms-play-dired)
;; 使用E转换角度播放
(define-key dired-mode-map (kbd "E")
'mplayer-rotate-play)
重新定义RET的行为。
如果是视频文件,就使用vlc播放。否则,就调用dired-find-file。
(define-key dired-mode-map (kbd "<RET>")
(lambda () (interactive)
(let ((find-match nil))
(dolist (ext video-file-name-extensions)
(when (string-suffix-p ext (dired-file-name-at-point) t)
(setq find-match t)))
(if find-match
(vlc-play)
(dired-find-file)))))
编辑文件名
;; 禁用鼠标
(setq dired-efap-use-mouse nil)
(setq dired-efap-initial-filename-selection nil)
;; 使用r编辑文件名
(define-key dired-mode-map (kbd "r")
'dired-efap)
清理目录,刷新显示
(defun dired-rmdir-subdirs ()
"rmdir sub directories."
(interactive)
(message "%s" (shell-command-to-string "find . -depth -mindepth 1 -type d -exec rmdir --ignore-fail-on-non-empty -v {} \\;")))
;; 使用c清理目录
(define-key dired-mode-map (kbd "c")
(lambda () (interactive)
(dired-rmdir-subdirs)
(revert-buffer)))
查看图片
使用I进入image-dired,查看图片
(define-key dired-mode-map (kbd "I")
(lambda () (interactive)
(image-dired (expand-file-name (dired-file-name-at-point)))))
定义一些image-dired-thumbnail-mode的快捷键
(add-hook 'image-dired-thumbnail-mode-hook
(lambda ()
(define-key image-dired-thumbnail-mode-map (kbd "f")
'image-dired-display-next-thumbnail-original)
(define-key image-dired-thumbnail-mode-map (kbd "b")
'image-dired-display-previous-thumbnail-original)
(define-key image-dired-thumbnail-mode-map (kbd "RET")
'image-dired-find-file)
(define-key image-dired-thumbnail-mode-map (kbd "n")
'image-dired-next-line)
(define-key image-dired-thumbnail-mode-map (kbd "p")
'image-dired-previous-line)))
(defun image-dired-find-file ()
"find image in display buffer."
(interactive)
(let ((file (image-dired-original-file-name)))
(if (not (image-dired-image-at-point-p))
(message "No thumbnail at point")
(if (not file)
(message "No original file name found")
(find-file file)
(delete-other-windows)))))
异步执行
当复制、移动文件时,在后台异步执行
(autoload 'dired-async-mode "dired-async.el" nil t)
(dired-async-mode 1)
(dired-async--modeline-mode)