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

我在豆瓣使用Emacs

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for 小明 小明
September 01, 2014

 我在豆瓣使用Emacs

我在豆瓣使用Emacs

Avatar for 小明

小明

September 01, 2014
Tweet

Other Decks in Programming

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 “) !