Emacs定制:文件管理dired

依赖包

主要使用了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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值