dired-single.el
让 dired 只使用一个 buffer 。
dired+.el
扩展 dired.el 、 dired-x.el 和 dired-aux.el 的功能。
dired-x.el 这是
Emacs
自带的扩展,安装方法可以查看
Emacs
的 info 文
dired-isearch.el
在 dired 里面只针对文件名做 i-search 。
dired-details.el
隐藏多余的信息,显示简洁的文件列表。
dired-details+.el
dired-details.el 的扩展。
dired-view.el
输入文件名的首字母快速跳转。
dired-sort-menu.el
方便地使用各种方式进行排序,并提供一个菜单用于执
dired-sort-menu+.el
dired-sort-menu.el 的扩展。
dired 在每打开一个新的目录之后总会打开一个新的 buffer ,这样,在浏览了
很多目录之后,
Emacs
里面就会充满了目录的 buffer ,很不舒服,不过有很多
方法可以解决这个问题。
不用任何扩展
在
Emacs
22 里面,可以使用
a
来访问目录,这样可以避免打开多余的buffer
,不过使用回车或者鼠标点击打开目录的话,还是会产生多出来的 buffer 。
对内置的函数进行 advice
可以通过对
Emacs
内置的函数进行 advice 也可以达到这个目的,其实就是对
进入其他目录的动作进行截获,判断如果进入了一个目录,则把原来目录的那个
buffer 删掉:
-->(
defadvice
dired-find-file
(around dired-find-file-single-buffer activ
ate)
"Replace current buffer if file is a directory."
(interactive)
(
let
((orig (current-buffer))
(filename (dired-get-file-for-visit)))
ad-do-it
(
when
(and (file-directory-p filename)
(not (eq (current-buffer) orig)))
(kill-buffer orig))))
(
defadvice
dired-up-directory
(around dired-up-directory-single-buffer
activate)
"Replace current buffer if file is a directory."
(interactive)
(
let
((orig (current-buffer)))
ad-do-it
(kill-buffer orig)))
dired+.el 提供
toggle-dired-find-file-reuse-dir
,用于打开和关闭默认按
键是否重用当前 buffer ,如果你不想影响默认新闻,它还提供了了两个函数,
diredp-find-file-reuse-dir-buffer
和
diredp-mouse-find-file-reuse-dir-buffer
,你可以把他们绑定到其他的按键
上面。不过,使用
^
跳到上一级目录的时候仍然是没有重用当前的 buffer 的,当
然,你可以使用在
..
上按回车跳到上一级的办法。
使用 dired-single.el
dired-single.el
专门为这个问题而设计,他可以保证所有的 dired buffer 都
使用同一个名字,换句话说,总是只会有一个 dired buffer 存在,并且我们可
以方便地跳到那个 buffer ,如果 buffer 不存在的话,
dired-single.el
会自
动帮我们创建。
作为基本使用,在 dired 里面重新绑定 回车、鼠标点击和
^
键:
(add-hook 'dired-mode-hook
(
lambda
()
(define-key dired-mode-map (kbd
"RET"
) 'joc-dired-single-b
uffer)
(define-key dired-mode-map (kbd
"<mouse-1>"
) 'joc-dired-si
ngle-buffer-mouse)
(define-key dired-mode-map (kbd
"^"
)
(
lambda
()
(interactive)
(joc-dired-single-buffer
".."
)))))
另外,如果想使用单一的 dired buffer 模式,首先要固定住 dired buffer 的
名字,这样才能方便地在任何时候跳转到原来存在的 dired buffer 那里。定制
joc-dired-magic-buffer-name
可以设定这个值,他的默认值为
*dired*
。然后
要把
joc-dired-use-magic-buffer
设定为
t
以启用 magic-buffer 机制。最后
我们绑定
C-x d
到
joc-dired-magic-buffer
上,这样,就可以使用
C-x d
来
跳转回存在的 dired buffer ,如果事先没有这个 buffer 存在,他会询问你要
访问的目录并自动创建这个 buffer 。
(add-hook 'dired-load-hook
(
lambda
()
(define-key dired-mode-map (kbd
"RET"
) 'joc-dired-single-b
uffer)
(define-key dired-mode-map (kbd
"<mouse-1>"
) 'joc-dired-si
ngle-buffer-mouse)
(define-key dired-mode-map (kbd
"^"
)
(
lambda
()
(interactive)
(joc-dired-single-buffer
".."
)))
(setq joc-dired-use-magic-buffer t)
(setq joc-dired-magic-buffer-name
"*dired*"
)))
(global-set-key (kbd
"C-x d"
)
'joc-dired-magic-buffer)
但是由于 dired-single 的实现方法的原因,现在不能在
..
上回车跳到上一级
目录了,不过这不是什么大问题,可以使用
^
键直接跳到上一级目录。但是如
果觉得不爽,可以把这个 patch 打到
dired-single.el
上去以修复这个问题:
-->
its name will not change every time a new directory is entered)."
(interactive)
;; use arg passed in or find name of current line
!
(let ((name (or default-dirname (dired-get-filename))))
(save-excursion
(save-match-data
;; See if the selection is a directory or not.
its name will not change every time a new directory is entered)."
(interactive)
;; use arg passed in or find name of current line
!
(let ((name (or default-dirname (dired-get-file-for-visit))))
(save-excursion
(save-match-data
;; See if the selection is a directory or not.
另外,
dired-single.el
是根据 dired 列出的文件类型那个
d
来判断是否是
目录的,这样对于处理软链接的目录就不行了,我们可以使用
Emacs
提供的
file-directory-p
来判断,这个函数会跟踪软链接,只要把这个 patch 打到
dired-single.el
上就可以解决这个问题:
-->
(let ((eol (point)))
(beginning-of-line)
;; assume directory if arg passed in
!
(if (or default-dirname (re-search-forward "^ d" eol t))
;; save current buffer's name
(let ((current-buffer-name (buffer-name)))
;; go ahead and read in the directory
(let ((eol (point)))
(beginning-of-line)
;; assume directory if arg passed in
!
(if (or default-dirname (file-directory-p name))
;; save current buffer's name
(let ((current-buffer-name (buffer-name)))
;; go ahead and read in the directory
既然
dired-single.el
可以让 dired 使用单一的 buffer ,并随时方便跳转到
那个 buffer ,我们也可以稍微扩展一下让它能做到跳转到当前 buffer 说对应
的文件的目录。
(interactive
"D"
)
(
let
((win-list (window-list)))
(
when
(null (cdr win-list))
(split-window-vertically))
(other-window 1)
(joc-dired-magic-buffer directory))))
dired-view.el
提供一个方便的功能,在打开 dired-view-minor-mode 之后,
可以输入文件名的首字母快速定位到文件。通常这个 minor-mode 并不是一直打
开,事实上,他是重新定义了所有的字母以及数字键说绑定的函数,所以如果文
件名是中文的话也没有办法,而且按键会和 dired 本身的很多按键冲突,于是
他提供了方便的打开和关闭的函数:
-->(
require
'
dired-isearch
)
(define-key dired-mode-map (kbd
"C-s"
) 'dired-isearch-forward)
(define-key dired-mode-map (kbd
"C-r"
) 'dired-isearch-backward)
(define-key dired-mode-map (kbd
"M-C-s"
) 'dired-isearch-forward-regexp
)
(define-key dired-mode-map (kbd
"M-C-r"
) 'dired-isearch-backward-regex
p)
可是这个东西并不能和
dired+.el
共同工作,默认情况下,dired 在文件显示
的地方可以用鼠标进行点击,而
dired-isearch.el
也正是依靠这个进行判断
的,可是
dired+.el
让整行都处于可用鼠标点击进行操作(事实上,
dired+.el
提供了很强大的鼠标操作功能,例如,可以像常见的文件管理器那样区域选择、
用
Shift
加鼠标来选择以及用
Ctrl
加鼠标来选择等),
dired-isearch.el
的
方法就不管用了,不过其实只要一点小小的改动,把
dired-isearch.el
里面的
所有的
help-echo
改为
dired-filename
就可以正常使用了。
dired-omit-files
是一个正则表达式,凡是匹配这个正则表达式的文件就会
被忽略掉,默认情况下会忽略自动保存的文件(以
#
开头),当前目录和父目
录(也就是
.
和
..
)。
dired-omit-extensions
是一个字符串列表,凡是文件名结尾是这个列表中
的某一个的时就会被忽略。
我通常把
dired-omit-files
设置为
"^#\\|^\\..*"
,这样可以忽略掉以
.
开
头的文件,在
Linux
下面这通常表示隐藏文件,
ls
默认情况下也不会显示他
们,而且主目录下面通常有一大堆这样的文件,显示出来看起来非常恐怖。
-->(add-hook 'dired-mode-hook
(
lambda
()
(setq dired-omit-files
"^#
\\
|
^\\..*"
)
(dired-omit-mode 1)))