Upgrade to Pro — share decks privately, control downloads, hide ads and more …

我在豆瓣使用Emacs

小明
September 01, 2014

 我在豆瓣使用Emacs

我在豆瓣使用Emacs

小明

September 01, 2014
Tweet

Transcript

  1. Outline ! . 初学emacs建议 . vimer -> emacser . 让emacs不再神秘

    . ⾖豆瓣⽤用到的emacs设置 . emacs插件 . 我的emacs.d . emacs开发⼊入⻔门
  2. 3 初学emacs建议 1. Emacs tutorial(C-h t) 2. ⼊入⻔门 http://www.slideshare.net/yinhm/emacs-7324447 3.

    学习emacs需要忘记⿏鼠标,⽆无视菜单 4. 快捷键控制⼀一切 5. prelude 6. 使⽤用>=24.3版本(brew install emacs)
  3. 5 Keystroke Command Name ! C-x C-f 打开⽂文件 C-x C-s

    保存 C-x C-c 保存并退出 C-v 向上翻⻚页 M-v 向下翻⻚页 C-a 到⾏行⾸首 C-e 到⾏行尾 M-x 执⾏行命令 C-g 取消输⼊入 C-h b 查看快捷键 M-g g 跳到某⾏行 学会这些快捷键就可以⽤用emacs
  4. 8 mode-line $emacs -q ../dongxi/dongxi/models/story/__init__.py -UUU:**--F1 __init__.py Top L30 Git-master

    (Python)——— 4. ** 被修改过了 — 未被修改过 %* 只读,但是被修改过 %% 只读,未被修改过 3. mode-line-mule-info: 语⾔言环境, buffer编码 U=utf-16 7. buffer名字或者⽂文件名字 11. major-mode 只能⼀一个主模式 10. minor-mode 可以多个次要模式(vc-mode) 8. 在buffer的位置. Top/Bot/nn%/All 9. 当前⾏行号 http://www.delorie.com/gnu/docs/elisp-manual-21/elisp_360.html 1. %e -- print error message about full memory. 2. mode-line-front-space 6. 默认的frame(框架)名字是F1
  5. 10 Package.el —- 内建于emacs24包管理 (require 'package) (package-initialize) (mapc (lambda (package)

    (unless (package-installed-p package) (package-install package))) ‘(smex s f dash flycheck))
  6. 12 ! ! Cask $cask $cat Cask (source gnu) (source

    melpa) (source marmalade) ! (depends-on "smex") (depends-on "s") (depends-on "f") (depends-on “dash") (depends-on "flycheck")
  7. 13 Keystroke Command Name ! C-x r m Bo 设置⼀一个名为

    Bo 的书签 C-x r l 列出所有已保存的书签 C-x r b Bo 跳转到书签Bo M-x bookmark-delete 删除书签 M-x bookmark-save 将所有的书签保存到/.emac.bmk 中 ! (setq bc-bookmark-file “~/emacs.d/bookmark”) 设置书签的保存位置 (setq bc-bookmark-limit 300) 设置书签的最⼤大数量 bookmark — 保存缓冲区中位置 saveplace.el : automatically save place in files.
  8. 14 eshell — 可以使⽤用elisp的shell 1.很多内置命令其实替代了*nix命令 $ which ls eshell/ls is

    a compiled Lisp function in `em-ls.el' 2. 内置变量 $$, $? … $ echo $+ /Users/dongweiming/shire-in-vagrant 3. Tricks ls > #<buffer ttt>
  9. 15 emacs的宏 — ⼀一组被记录下来的按键记录 1.开始录制宏: C-x ( 2.你要执⾏行的操作 3.结束录制宏: C-x

    ) 4.⽤用C-x e来使⽤用宏(也就是call-last-kbd-macro) 5. M-x name-last-kbd-macro # 可选 6.打你的.emacs⽂文件并把光标跳转到特定的位置 7.M-x insert-kbd-macro ! 调⽤用⽅方法: M-x <宏名>
  10. 16 elisp的宏 — defmacro FUNCTION VS MACRO ! 函数只是对表达式求值;⽽而宏先展开表达式,然后再对展开后的表达式求值 (defun

    test-fun (a b) (list '+ a b)) (defmacro test-macro (a b) (list '+ a b)) (test-fun 1 2) => (+ 1 2) (test-macro 1 2) => 3
  11. 17 font-lock — 让buffer语法⾼高亮 (global-font-lock-mode 0) ; 全局关闭 M-x font-lock-mode

    ; 开启/关闭 ; 开启单个模式 (add-hook 'lisp-mode-hook ‘turn-on-font-lock) (add-hook 'lisp-mode-hook (lambda () (font-lock-add-keywords nil '(("\\<\\(TODO\\):" 1 font-lock-warning-face t)))))
  12. 18 ⾖豆瓣⽤用到的emacs设置 (setq-default show-trailing-whitespace t) ; 显⽰示⾏行尾空格 ;; ⾃自动删掉⾏行尾空格 (add-hook

    'before-save-hook ‘delete-trailing-whitespace) (setq-default indent-tabs-mode nil) ; 使⽤用空格替代TAB ;; Makefile 需要TAB (add-hook 'makefile-mode-hook ‘indent-tabs-mode) (setq column-number-mode t) ; 显⽰示列号 (show-paren-mode t) ; 显⽰示括号匹配 ;; 光标在 TAB 字符上会显⽰示为⼀一个⼤大⽅方块 (setq x-stretch-cursor t) (setq undo-outer-limit 5000000) ; 撤销限制 ! (setq css-indent-offset 4)
  13. 19 假如你在⾖豆瓣⽤用python (setq python-shell-interpreter "ipython" python-shell-interpreter-args "" python-shell-prompt-regexp "In \\[[0-9]+\\]:

    " python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: " python-shell-completion-setup-code "from IPython.core.completerlib import module_completion" python-shell-completion-module-string-code "';'.join(module_completion('''%s'''))\n" python-shell-completion-string-code "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
  14. 21 elisp编程库 1.s.el : 处理字符串相关 2.f.el : ⽂文件相关 3.dash.el :

    列表相关 4.ht.el : 哈希表相关 5.bind-key : 更快的绑定快捷键 6.use-package : 更快的使⽤用包和配置
  15. 22 yasnippet — ⼀一个模板系统 # -*- mode: snippet; require-final-newline: nil

    -*- # name: namespace # key: namespace # binding: direct-keybinding # -- <%namespace name="$1" file="$2"/> yas-new-snippet yas-reload-all
  16. 23 其它 1.isend-mode : 把buffer内容发送到解释器 2.anzu : 显⽰示总匹配的数⺫⽬目和当前匹配 3.jedi :

    python代码补全 4.nyan-mode : ⼀一只可爱的猫 5.rainbow-mode : 显⽰示样式为背景⾊色 6.powerline : 状态⾏行插件 7.zencoding : 快速写html代码 8.hs-mode : 代码折叠
  17. 25 常⻅见配置中⽤用到 1. nil/t ⾮非nil都为真 2. quote '(+ 1 2)

    (quote (+ 1 2)) 3. set/setq (set 'name '(Dong Weiming)) (setq name '(Dong Weiming)) 4. require 当没有加载包时加载之 5. add-hook/remove-hook 6. global-set-key (global-set-key (kbd"<C-f9>”) ‘compile)
  18. 26 理由 1.保存⽂文件⾃自动执⾏行autopep8 2.保存⽂文件⾃自动执⾏行flycheck, 使⽤用pep8/flake8检查python规范 3.使⽤用我认为舒服的快捷键 4.⽀支持plim 5.⾃自定义多个函数实现我想要的功能: . 打开没有权限⽂文件⾃自动提⽰示sudo

    . 在emacs⾥里可以打开google/github/code . 可以快速切换到前⼀一个buffer . 不刷屏向下/上翻⾏行 . 快速搜索python函数/类位置 . Gui下切换全屏 . 根据等号对⻬齐⽂文本
  19. 28 (defun other-window-backward (&optional n) "Select Nth previous window." (interactive

    “p") ; C-u加数字就会传进来 (other-window (- (or n 1)) (message "%d" n)) ! interactive Interactive-Codes
  20. 29 (defun visit-target-instead () "Replace this buffer with a buffer

    visiting the link target." (interactive) (if buffer-file-name (let ((target (file-symlink-p buffer-file-name))) (if target (find-alternate-file target) (error "Not visiting a symlink"))) (error "Not visiting a file"))) visit-target-instead
  21. 30 clobber-symlink (defun clobber-symlink () "Replace symlink with a copy

    of the file." (interactive) (if buffer-file-name (let ((target (file-symlink-p buffer-file-name))) (if target (if (yes-or-no-p (format "Replace %s with %s? buffer-file-name target)) (progn (delete-file buffer-file-name) (write-file buffer-file-name))) (error "Not visiting a symlink"))) (error "Not visiting a file")))
  22. 31 defadvice — AOP (defadvice find-file (around th-find-file activate) "Open

    FILENAME using tramp's sudo method if it's read-only." (if (and (not (file-writable-p (ad-get-arg 0))) (y-or-n-p (concat "File " (ad-get-arg 0) " is read-only. Open it as root? "))) (th-find-file-sudo (ad-get-arg 0)) ad-do-it)) ! http://www.gnu.org/software/emacs/manual/html_node/elisp/Advising Functions.html
  23. 32 define-minor-mode (defun insert-some-text () (interactive) (insert “Just for test"))

    ! (define-minor-mode auto-pep8-mode :init-value t :keymap (let ((map (make-sparse-keymap))) (define-key map (kbd "C-c t") 'insert-some-text) map)) "Autopep8 “) !