DEA是Dot Emacs of Ahei的简写。由于我的emacs配置文件比较大,我把它放到google code上去了,详情请见:DEA。我会不定期发布release版本,不过你大可放心使用trunk版本,我更新的很及时,遇到bug正好告诉我,:)。其他文章中的配置均来之与此。
1 兼容性
DEA兼容:
- 部分兼容Emacs 21(以前兼容,我现在不使用Emacs 21了,所以可能有不兼容的情况)
- Emacs 22, 23.1, 23.2
- Emacs linux版本(我在Ubuntu下使用Emacs)
- Emacs windows版本
- Emacs GUI版本
- Emacs字符模式版本
2 安装
- linux
1 2 3 4
apt-get install gnuserv # (emacs 21及其以下版本需要安装) svn checkout http://dea.googlecode.com/svn/trunk/ dea-read-only # (或者下载Downloads页面的release,不过不是最新的) cd dea-read-only ./install
安装的时候, 会先根据.emacs文件生成一个.emacs.changed文件,因为.emacs文件中会用到一些与.emacs文件所在文件夹相关的变量,然后在HOME目录建立一个.emacs.changed的软链接(ln -sf CURDIR/.emacs.changed ~/.emacs), 如果HOME目录下已经存在.emacs文件, install.sh会把它备份到~/.emacs.CURRENTDATETIME. 所以, 如果你更新的时候是用svn up更新的话,还要执行一下 $ install.emacs.sh, 重新生成HOME下的.emacs.另外install.sh还会解压lisps目录下的压缩包.
- windows
windows用户请使用cygwin执行上述安装命令, 或者设置好了HOME目录后,把DEA放到HOME后下,并且重命名为emacs,把lisps目录下的tar包都解压,然后新建一个emacs.bat,输入以下内容:fullpath-of-runemacs.exe -q -l ~/emacs/.emacs
以后启动Emacs执行emacs.bat即可。
4 修改
当~/my.emacs文件存在时, DEA会加载它. 所以如果想增加自己的配置, 直接编辑~/my.emacs即可. 万一需要修改.emacs的话, 修改完.emacs后需要运行 $ ./install.emacs.sh, 或者退出emacs的时候,会自动运行$ ./install.emacs.sh
5 目录结构
- lisps 主要存放一些非Emacs内置的Elisp包
- my-lisps 我自己写的Elisp包和其他Elisp包的配置(下面只列出一些重要的配置)
- coding-settings 编码设置
- dev-settings 所有关于开发方面的配置, 程序员必备
- c-settings c/c++开发的配置, c程序员注意啦
- ruby-settings
- cedet-settings
- ecb-settings
- all-auto-complete-settings 所有关于补全方面的配置, 补全控注意啦
- svn-settings svn配置
6 DEA体积
7 注意
8 Emacs默认快捷键修改
由于一些Emacs默认的快捷键个人觉得不是很方便,做了一些修改,主要是:
- C-h
Emacs中默认的C-h是帮助快捷键的prefix,我把它绑定到了删除前面一个字符,这样删除字符就非常方便了。 - DEA中查看文档的快捷键如下:
- 查看变量和函数的文档
C-x C-/ - 查看某个快捷键对应的命令
C-x C-k - 查看某个命令对应的快捷键
C-x / w - 查看当前buffer中以某个快捷键序列开头的快捷键列表
<待查看的快捷键序列> C-x /,比如你想查看当前buffer中所有以C-c开头的快捷键列表,按C-c C-x /就可以了。 - 查看函数和变量的代码
C-x C-d
- 查看变量和函数的文档
- C-k
Emacs默认的是删除光标当行尾,我改成了删除整行 - C-w
Emacs默认的是剪切region,即使mark没有激活, 我改了后,mark没有激活的话,就向后删除一个单词,激活则剪切region - M-w
Emacs默认的是拷贝region,即使mark没有激活, 我改了后,mark没有激活的话,就复制本行,激活的话则拷贝region - C-x C-s绑定到了save-buffer-sb
9 非常方便的编辑功能
- M-w smart-copy region状态下,拷贝region,否则拷贝当前行, 还可以拷贝矩阵region
- C-k 删除一行
M-K 删除当前光标到行尾 - C-w 在region状态下, 剪切当前region, 否则向后删除一个单词, 非常之方便
- C-x M-w 复制一行并粘贴到下一行
M-W 复制region并粘贴到下面
C-x M-W 复制一个sexp并粘贴到下面
相信很多程序员都有拷贝现成代码并复制下来,然后经过小的修改(当然这种方法不是一个好的方法), 这时候这个命令就显的非常有用了 - C-x w 复制一个sexp
C-x W 删除一个sexp
M-D 删除当前光标所处的单词
C-x S 选择一个sexp
我配置后的emacs截图在这里(有些截图是别的作者和网友的,请读者自行分辨, )。
下面是我的.emacs文件, .emacs文件用到的其他文件在这里.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 | ;; -*- Emacs-Lisp -*- ;; Time-stamp: <2010-10-18 10:04:12 Monday by taoshanwen> (defconst my-emacs-path "~/emacs/" "我的emacs相关配置文件的路径") (defconst my-emacs-my-lisps-path (concat my-emacs-path "my-lisps/") "我自己写的emacs lisp包的路径") (defconst my-emacs-lisps-path (concat my-emacs-path "lisps/") "我下载的emacs lisp包的路径") (defconst my-emacs-templates-path (concat my-emacs-path "templates/") "Path for templates") ;; 把`my-emacs-lisps-path'的所有子目录都加到`load-path'里面 (load (concat my-emacs-my-lisps-path "my-subdirs")) (my-add-subdirs-to-load-path my-emacs-lisps-path) (my-add-subdirs-to-load-path my-emacs-my-lisps-path) ;; 一些基本的小函数 (require 'ahei-misc) ;; 利用`eval-after-load'加快启动速度的库 ;; 用eval-after-load避免不必要的elisp包的加载 ;; http://emacser.com/eval-after-load.htm (require 'eval-after-load) (require 'util) ;; 一些Emacs的小设置 (require 'misc-settings) ;; 编码设置 (require 'coding-settings) ;; CUA的矩阵区域操作特别方便 (require 'cua-settings) ;; 矩形区域操作 (require 'rect-mark-settings) ;; 鼠标配置 (require 'mouse-settings) ;; 关于mark的一些设置,使你非常方便的选择region (require 'mark-settings) ;; `mode-line'显示格式 (require 'mode-line-settings) ;; ffap,打开当前point的文件 (require 'ffap-settings) ;; 各种语言开发方面的设置 (require 'dev-settings) ;; 不要menu-bar和tool-bar ;; (unless window-system ;; (menu-bar-mode -1)) (menu-bar-mode -1) ;; GUI下显示toolbar的话select-buffer会出问题 (if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) ;; 打开压缩文件时自动解压缩 ;; 必须放在session前面 (auto-compression-mode 1) ;; 所有关于buffer方面的配置 (require 'all-buffer-settings) ;; frame-cmds.el必须放在multi-term前面,否则ediff退出时会出现错误 ;; 而icicles soft-requires frame-cmds.el, 所以icicles也必须放在multi-term前面 ;; emacs22下也必须放在kde-emacs前面, 否则会说shell-command是void-function ;; http://emacser.com/icicles-doremi-palette.htm (require 'icicles-settings) (require 'doremi-settings) (require 'palette-settings) ;; edit-settings中对M-w重新定义,但是kde-emacs中也对其定义了 ;; 所以必须要放在kde-emacs后面 (require 'edit-settings) ;; 用M-x执行某个命令的时候,在输入的同时给出可选的命令名提示 (require 'icomplete-settings) ;; minibuffer中输入部分命令就可以使用补全 (unless is-after-emacs-23 (partial-completion-mode 1)) ;; 图片mode (require 'image-mode-settings) ;; 用一个很大的kill ring. 这样防止我不小心删掉重要的东西 (setq kill-ring-max 200) ;; 方便的在kill-ring里寻找需要的东西 (require 'browse-kill-ring-settings) ;; 显示行号 (require 'linum-settings) ;; color theme Emacs主题 (require 'color-theme-settings) (require 'ahei-face) (require 'color-theme-ahei) (require 'face-settings) ;; 高亮当前行 (require 'hl-line-settings) ;; 字体配置 (require 'font-settings) ;; diff (require 'diff-settings) ;; Emacs的diff: ediff (require 'ediff-settings) ;; 最近打开的文件 (require 'recentf-settings) ;; 在buffer中方便的查找字符串: color-moccur (require 'moccur-settings) ;; Emacs超强的增量搜索Isearch配置 (require 'isearch-settings) ;; 非常酷的一个扩展。可以“所见即所得”的编辑一个文本模式的表格 (if is-before-emacs-21 (require 'table "table-for-21")) ;; 把文件或buffer彩色输出成html (require 'htmlize) ;; time-stamp, 在文件头记录修改时间, 并动态更新 (require 'time-stamp-settings) ;; Emacs可以做为一个server, 然后用emacsclient连接这个server, ;; 无需再打开两个Emacs (require 'emacs-server-settings) (require 'apropos-settings) (require 'completion-list-mode-settings) ;; 显示ascii表 (require 'ascii) ;; 所有关于查看帮助方面的配置 (require 'all-help-settings) ;; 定义一些emacs 21没有的函数 (if is-before-emacs-21 (require 'for-emacs-21)) ;; 简写模式 (setq-default abbrev-mode t) (setq save-abbrevs nil) ;; 可以为重名的buffer在前面加上其父目录的名字来让buffer的名字区分开来,而不是单纯的加一个没有太多意义的序号 (require 'uniquify) (setq uniquify-buffer-name-style 'forward) ;; 以目录形式显示linkd文档 (require 'linkd-settings) ;; Emacs的超强文件管理器 (require 'dired-settings) ;; 方便的切换major mode (defvar switch-major-mode-last-mode nil) (defun major-mode-heuristic (symbol) (and (fboundp symbol) (string-match ".*-mode$" (symbol-name symbol)))) (defun switch-major-mode (mode) "切换major mode" (interactive (let ((fn switch-major-mode-last-mode) val) (setq val (completing-read (if fn (format "切换major-mode为(缺省为%s): " fn) "切换major mode为: ") obarray 'major-mode-heuristic t nil nil (symbol-name fn))) (list (intern val)))) (let ((last-mode major-mode)) (funcall mode) (setq switch-major-mode-last-mode last-mode))) (global-set-key (kbd "C-x q") 'switch-major-mode) (defun get-mode-name () "显示`major-mode'及`mode-name'" (interactive) (message "major-mode为%s, mode-name为%s" major-mode mode-name)) (global-set-key (kbd "C-x m") 'get-mode-name) ;; 查看Emacs内进程 (autoload 'list-processes+ "list-processes+" "增强的`list-processes'命令" t) (require 'view-mode-settings) (defun revert-buffer-no-confirm () "执行`revert-buffer'时不需要确认" (interactive) (when (buffer-file-name) (let ((emaci emaci-mode)) (revert-buffer buffer-file-name t) (emaci-mode (if emaci 1 -1))))) (eal-define-keys-commonly global-map `(("C-x u" revert-buffer-no-confirm) ("C-x M-K" revert-buffer-with-gbk) ("C-x U" revert-buffer-with-coding-system-no-confirm-sb))) (defun count-brf-lines (&optional is-fun) "显示当前buffer或region或函数的行数和字符数" (interactive "P") (let (min max) (if is-fun (save-excursion (beginning-of-defun) (setq min (point)) (end-of-defun) (setq max (point)) (message "当前函数%s内共有%d行, %d个字符" (which-function) (count-lines min max) (- max min))) (if mark-active (progn (setq min (min (point) (mark))) (setq max (max (point) (mark)))) (setq min (point-min)) (setq max (point-max))) (if (or (= 1 (point-min)) mark-active) (if mark-active (message "当前region内共有%d行, %d个字符" (count-lines min max) (- max min)) (message "当前buffer内共有%d行, %d个字符" (count-lines min max) (- max min))) (let ((nmin min) (nmax max)) (save-excursion (save-restriction (widen) (setq min (point-min)) (setq max (point-max)))) (message "narrow下buffer内共有%d行, %d个字符, 非narrow下buffer内共有%d行, %d个字符" (count-lines nmin nmax) (- nmax nmin) (count-lines min max) (- max min))))))) (eal-define-keys-commonly global-map `(("C-x l" count-brf-lines) ("C-x L" (lambda () (interactive) (count-brf-lines t))))) ;; 增加更丰富的高亮 (require 'generic-x) (defun switch-to-scratch () "切换到*scratch*" (interactive) (let ((buffer (get-buffer-create "*scratch*"))) (switch-to-buffer buffer) (unless (equal major-mode 'lisp-interaction-mode) (lisp-interaction-mode)))) (global-set-key (kbd "C-x s") 'switch-to-scratch) (defun visit-.emacs () "访问.emacs文件" (interactive) (find-file (concat my-emacs-path ".emacs"))) (global-set-key (kbd "C-x E") 'visit-.emacs) ;; grep (require 'grep-settings) ;; ack-grep, grep纯perl的代替品 (require 'full-ack-settings) (eal-define-keys-commonly global-map `(("M-r" query-replace-sb) ("M-%" query-replace-sb) ("ESC M-%" query-replace-regexp-sb) ("ESC M-r" query-replace-regexp-sb) ("C-x M-r" query-replace-regexp-sb) ("M-z" zap-to-char-sb) ("C-j" goto-line) ("C-x C-s" save-buffer-sb))) (am-add-hooks `(find-file-hook) (lambda () (local-set-key (kbd "C-M-j") 'goto-line))) ;; 返回到最近去过的地方 (require 'recent-jump-settings) ;; 统计命令使用频率 (require 'command-frequence) ;; Emacs中的文本浏览器w3m ;; http://emacser.com/w3m.htm (require 'w3m-settings) ;; 以另一用户编辑文件, 或者编辑远程主机文件 (require 'tramp-settings) ;; erc: Emacs中的IRC ;; ERC使用简介 emacser.com/erc.htm (require 'erc-settings) ;; spell check (setq-default ispell-program-name "aspell") (define-key global-map (kbd "C-q") 'quoted-insert-sb) ;; Emacs中的包管理器 (require 'package) (package-initialize) (require 'auto-install) (setq auto-install-directory (concat my-emacs-lisps-path "auto-install")) (unless mswin (defun install-.emacs () (interactive) (shell-command (concat my-emacs-path "install.emacs.sh"))) (add-hook 'kill-emacs-hook 'install-.emacs)) ;; 把pdf,ps,dvi文件转换为png格式, 在Emacs里面浏览 (if is-after-emacs-23 (require 'doc-view) (setq doc-view-conversion-refresh-interval 3)) ;; 在Emacs里面使用shell (require 'term-settings) (require 'multi-term-settings) ;; (require 'anything-settings) (require 'ioccur) ;; 查询天气预报 (require 'weather-settings) ;; 可以把光标由方块变成一个小长条 (require 'bar-cursor) (defun goto-my-emacs-lisps-dir () "Goto `my-emacs-lisps-path'." (interactive) (dired my-emacs-lisps-path)) (defun goto-my-emacs-my-lisps-dir () "Goto `my-emacs-my-lisps-path'." (interactive) (dired my-emacs-my-lisps-path)) (defun goto-my-emacs-dir () "Goto `my-emacs-path'." (interactive) (dired my-emacs-path)) (defun goto-my-home-dir () "Goto my home directory." (interactive) (dired "~")) (define-key-list global-map `(("C-x G l" goto-my-emacs-lisps-dir) ("C-x G m" goto-my-emacs-my-lisps-dir) ("C-x G e" goto-my-emacs-dir) ("C-x M-H" goto-my-home-dir))) (define-key global-map (kbd "C-x M-c") 'describe-char) ;; 启动Emacs的时候最大化Emacs (require 'maxframe-settings) (defun dos2unix () "dos2unix on current buffer." (interactive) (set-buffer-file-coding-system 'unix)) (defun unix2dos () "unix2dos on current buffer." (interactive) (set-buffer-file-coding-system 'dos)) (define-key global-map (kbd "C-x M-D") 'dos2unix) (define-key-list global-map `(("C-x M-k" Info-goto-emacs-key-command-node) ("C-x ESC ESC" repeat-complex-command-sb))) ;; Emacs才是世界上最强大的IDE - 智能的改变光标形状 ;; http://emacser.com/cursor-change.htm (require 'cursor-change) (cursor-change-mode 1) (defun copy-file-name (&optional full) "Copy file name of current-buffer. If FULL is t, copy full file name." (interactive "P") (let ((file (buffer-name))) (if full (setq file (expand-file-name file))) (kill-new file) (message "File `%s' copied." file))) (eal-define-keys `(emacs-lisp-mode-map lisp-interaction-mode-map java-mode-map sh-mode-map c-mode-base-map text-mode-map ruby-mode-map html-mode-map java-mode-map conf-javaprop-mode-map conf-space-mode-map python-mode-map) `(("C-c M-C" copy-file-name))) ;; notification tool (require 'todochiku-settings) ;; twitter client (require 'eagle-settings) (require 'twit-settings) ;; 模拟vi的点(.)命令 (require 'dot-mode) ;; 用渐变颜色显示你最近的修改 ;; http://emacser.com/highlight-tail.htm ;; 与semantic冲突,启动了它后,打开大文件的时候,会发现buffer大范围的刷屏 ;; (require 'highlight-tail-settings) ;; Emacs才是世界上最强大的IDE - 用Emaci阅读文件 ;; http://emacser.com/emaci.htm (require 'emaci-settings) ;;;###autoload (defun update-current-file-autoloads (file &optional save-after) "`update-file-autoloads' for current file." (interactive "fUpdate autoloads for file: \np") (let* ((load-file (expand-file-name "loaddefs.el")) (generated-autoload-file load-file)) (unless (file-exists-p load-file) (shell-command (concat "touch " load-file))) (update-file-autoloads file save-after))) ;; 大纲mode (require 'outline-settings) ;; org是一个非常强大的GTD工具 (require 'org-settings) ;; 强大的发布工具 (require 'muse-settings) ;; 用weblogger写WordPress博客 ;; http://emacser.com/weblogger.htm (require 'weblogger-settings) ;; 非常强大的文本画图的工具 (require 'artist-settings) ;; google-maps-el – Emacs中的谷歌地图 ;; http://emacser.com/emacs-google-map.htm (require 'google-maps-settings) ;; session,可以保存很多东西,例如输入历史(像搜索、打开文件等的输入)、 ;; register的内容、buffer的local variables以及kill-ring和最近修改的文件列表等。非常有用。 (require 'session-settings) ;; 王纯业的desktop, 比desktop快多了 (require 'wcy-desktop-settings) ;; HACK: 要放在最后,免得会出现比较奇怪的现象 ;; 保存和恢复工作环境 ;; desktop,用来保存Emacs的桌面环境 — buffers、以及buffer的文件名、major modes和位置等等 ;; (require 'desktop-settings) (sb-update) |