各位好~!
在下是个 Ruby 新人,确切的说,作为程序员 (虽然还没有找到程序员工作), 也是个新人.
在 Ruby-china 注册有一阵子了 (确切的说,2 月 14 号,哈哈。言外之意...), 但是还没有
发过帖子,正好最近小弟正在学习 Rails. 有感于大量的文件之间切换,好不麻烦,所
以尝试使用 Emacs dired-mode
作为切换 (linux 的 mc).并且达到了一个不错的效果.
当然,使用 Emacs 最大的好处就是可以自由定制
, Oh! Freedom.
本人平素较懒,甚少发帖,现在既然找到了组织
, 以后一定要改正,多多发帖,多多请教。
闲言少叙,直接进入正题。先说下本人的开发环境
:
Slackware13.37 64 位,桌面系统为 XFCE4.8, 平时基本上都是混在 Emacs 下 (deamon).
在使用 Dired 作为 navigation 之前,主要是使用 Emacs 的 ido-mode 和 find-file-in-project 作为项目切换. ido 可以在 find-file 或者 switch-buffer 的时候,通过输入关键字自动筛选结果。 `ffip 利用了 linux 下 find 命令,可以设定在 ido 中只显示指定项目目录下的某些特定类型的文件。 (ffip 通过.git 自动定位项目目录,打开 git 所在目录分支任意一个文件,即切换到该项目,也可以设定某个目录为例外,这里我关闭了自动定位,直接设定为~/work/depot)
虽然已经很不错了。不过我记性不好,对 rails 还不熟,郁闷的是使用 ido 关键字过滤, 总忘记输什么。之前使用过 rinari 和 emacs-rails, 不过前者实在是是太老了...后者 虽然功能强大,但是总觉得很多功能有些多余 (通过 CLI 更有效), 而且代码过老,总有 这样那样的问题。还得修改 lisp 源码,好麻烦,而我 elisp 水平说实话讲,是相当的差 劲 (仅限于满足 Emacs 的使用,有时间一定要恶补!!)
其间,也想过使用 speedbar-mode, 可能个人习惯原因,不爽!后来使用过程中,琢磨 来琢磨去,觉得 Dired-mode 其实不错,下面是具体的搭建步骤,道理很简单,希望起到 抛砖引玉的作用。
需要特别提及的是:提高效率一定是全方位的。我始终信奉 UINX 的 K.I.S.S 原则,每一 项特定的功能,都有它最擅长的工作方式。
我们会用到以下内容:
dired 是 Emacs 内置功能,它同样具有常见的文件管理功能 (类似 nc), 但相比较其他工具,这个模式具有以下优势:
;; ============================== 有关 dired-mode 设置 ==============================
;; 首先需要加载几个插件.
(require 'dired-isearch) ; isearch模式仅仅搜索文件名, 通过s打开isearch.
(require 'dired-x) ; dired开启omit模式. 可以通过dired-omit-files, 指定pattern来隐藏文件.
(set-default 'dired-omit-mode 1) ; 全局开启omit模式.
;; 全局设定一个快捷键, 在任何时候, 一键切入当前buffer所在的目录. 我使用了Control-f
(global-set-key [(control f)] '(lambda () (interactive) (dired ".")))
(add-hook 'dired-mode-hook
'(lambda ()
(define-key dired-mode-map [(tab)] 'dired-do-isearch-regexp) ; 在mark的文件中正则搜索, 我设为tab键
(define-key dired-mode-map "\e\t" 'dired-do-isearch) ; mark的文件中搜索, 设为Alt-tab (C-M-i)
(define-key dired-mode-map [(?\d)] 'dired-up-directory) ; 到上一层目录, 设为backspace键, 默认^不变.
(define-key dired-mode-map [(backspace)] 'dired-up-directory)
(define-key dired-mode-map "z" 'dired-name-filter-only-show-matched-lines) ; 过滤文件名z, g重新显示
(define-key dired-mode-map [(s)] 'dired-isearch-forward) ; 按s从光标处向下搜索文件名
(define-key dired-mode-map [(r)] 'dired-isearch-backward); 按r从光标处向上搜索文件名
;; 下面的hotkey偷自XFCE4的Thunar文件管理器.
(define-key dired-mode-map [(\/)] (lambda () (interactive)
(dired "/"))) ; 按/返回根目录,
(define-key dired-mode-map [(\~)] (lambda () (interactive)
(dired "~/"))) ; 按~返回home.
;; 下面的快捷键打开rails项目目录对应目录, 仅供参考, 快捷键对应于c, v, b
(define-key dired-mode-map [(c)] (lambda () (interactive)
(dired (concat ffip-project-root "/app/controllers"))))
(define-key dired-mode-map [(v)] (lambda () (interactive)
(dired (concat ffip-project-root "/app/views"))))
(define-key dired-mode-map [(b)] (lambda () (interactive)
(dired (concat ffip-project-root "/app/models"))))
))
;; ============================== 有关 ido-mode 设置 ==============================
(require 'ido)
;; 在最近打开文件列表中打开文件.
(defun recentf-ido-find-file ()
"Find a recent file using ido."
(interactive)
(let ((file (ido-completing-read "Choose recent file: " recentf-list nil t)))
(when file
(find-file file))))
(global-set-key [(control x) (f)] 'recentf-ido-find-file) ; 快捷键C-x f
;; ============================== 有关 find-file-in-project 设置 ==============================
(require 'find-file-in-project) ; 加载库
(setq ffip-patterns '("*.html.erb" )) ; 查找文件的模板。假设我只打开.html.erb.
(setq ffip-project-root "~/work/depot") ; 之前多次引用到这个变量,只需要修改这个,全部生效,是不是有点DRY
?
(global-set-key [(control c) (control f)] 'find-file-in-project) ; 快捷键 C-c C-f.
function my_project_directory {
TMP=$(emacsclient -e "ffip-project-root")
PROJECT_DIRECTORY=$(echo $TMP |sed s#\"##g)
(command emacsclient -c "$PROJECT_DIRECTORY" &) &>/dev/null
}
alias ee='my_project_directory'
通过此种方式 (搭配强大的 ido 以及 ffip), 我可以在最多 2 秒钟内,访问 Rails 项目中任意一个文件或 buffer.