这篇文章记录平时使用emacs的一些技巧和插件,基本的操作可以参考emacs自带 的教程TUTORIAL。emacs 自带的教程有英文版和繁体中文版,在emacs 中按下 Ctrl-h t 或者F1 t即可打开自带的此文档

基础命令
C-
M-
如果没有 META 、 EDIT 或 ALT 键时,则可以用「按一下 ESC 键然后放开,再键入
基础操作
基础操作中,我都用了默认的快捷键,只增加了一个C-h,定义功能与backspace 键相同。需要记住的是以下几个:
快捷键 | 说明 |
---|---|
C-M-v | 另一个窗口向下滚动 |
C-M-SHIFT-v | 另一个窗口向上滚动 |
C-c C-x C-v | 直接预览图片 |
C-x C-x | 交换光标和标记的位置 |
M-h | 标记当前段落 |
M-z | 删除光标到指定字符之间的内容 |
emacs的一些基础配置如下,
(package-initialize)
(set-foreground-color "grey")
(set-background-color "black")
(set-cursor-color "gold1")
(set-mouse-color "gold1")
;;启动设置
(setq default-frame-alist
'((vertical-scroll-bars)
(top . 0)
(left . 0)
(width . 120)
(height . 43)
(background-color . "black")
(foreground-color . "grey")
(cursor-color . "gold1")
(mouse-color . "gold1")
(tool-bar-lines . 0)
(menu-bar-lines . 0)
(right-fringe)
(left-fringe)))
;;启动自动最大化(数据自己调整,注意格式,如(top . 0),圆点前后都要留有空格)
;;(setq initial-frame-alist '((top . 0) (left . 0) (width . 142) (height . 46)))
;; 设置另外一些颜色:语法高亮显示的背景和主题,区域选择的背景和主题,二次选择的背景和选择
(set-face-foreground 'highlight "white")
(set-face-background 'highlight "blue")
(set-face-foreground 'region "cyan")
(set-face-background 'region "blue")
(set-face-foreground 'secondary-selection "skyblue")
(set-face-background 'secondary-selection "darkblue")
;;------------窗口界面设置结束-----------------
;;------------显示时间设置------------------------------
(display-time-mode 1);;启用时间显示设置,在minibuffer上面的那个杠上
(setq display-time-24hr-format t);;时间使用24小时制
(setq display-time-day-and-date t);;时间显示包括日期和具体时间
(setq display-time-use-mail-icon t);;时间栏旁边启用邮件设置
(setq display-time-interval 10);;时间的变化频率
;;------------显示时间设置结束--------------
;;------------定制操作习惯--------------------
;;设置打开文件的缺省路径
(setq default-directory "/Users/xxx")
;;关闭烦人的出错时的提示声
(setq visible-bell t)
;;关闭emacs启动时的画面
(setq inhibit-startup-message t)
;; 改变 Emacs 固执的要你回答 yes 的行为。按 y 或空格键表示 yes,n 表示 no。
(fset 'yes-or-no-p 'y-or-n-p)
;; 语法高亮。除 shell-mode 和 text-mode 之外的模式中使用语法高亮。
(setq font-lock-maximum-decoration t)
(setq font-lock-global-modes '(not shell-mode text-mode))
(setq font-lock-verbose t)
(setq font-lock-maximum-size '((t . 1048576) (vm-mode . 5250000)))
;;显示行列号
(setq column-number-mode t)
(setq line-number-mode t)
;;不要在鼠标点击的那个地方插入剪贴板内容。
(global-linum-mode t)
(setq mouse-yank-at-point t)
;;设置粘贴缓冲条目数量.用一个很大的kill ring(最多的记录个数). 这样防止我不小心删掉重要的东西
(setq kill-ring-max 200)
; Autofill in all modes;;
(setq-default auto-fill-function 'do-auto-fill)
;;把 fill-column 设为 60. 这样的文字更好读
(setq default-fill-column 120)
;;不用 TAB 字符来indent, 这会引起很多奇怪的错误。
(setq-default indent-tabs-mode nil)
(setq default-tab-width 8);;tab键为8个字符宽度
(setq tab-stop-list ())
;;(setq enable-recursive-minibuffers t)
;;可以递归的使用 minibuffer
;;防止页面滚动时跳动, scroll-margin 3 可以在靠近屏幕边沿3行时就开始滚动,可以很好的看到上下文。
(setq scroll-margin 3 scroll-conservatively 10000)
;;设置缺省主模式是text,,并进入auto-fill次模式.而不是基本模式fundamental-mode
(setq default-major-mode 'text-mode)
(add-hook 'text-mode-hook 'turn-on-auto-fill)
;;打开括号匹配显示模式
(show-paren-mode t)
;;括号匹配时可以高亮显示另外一边的括号,但光标不会烦人的跳到另一个括号处。
(setq show-paren-style 'parenthesis)
;;光标靠近鼠标指针时,让鼠标指针自动让开,别挡住视线。
(mouse-avoidance-mode 'animate)
;;在标题栏显示buffer的名字,而不是 emacs@wangyin.com 这样没用的提示。
(setq frame-title-format "emacs@%b")
;;让 Emacs 可以直接打开和显示图片。
(setq auto-image-file-mode t)
;;进行语法加亮。
(setq global-font-lock-mode t)
;; 把C-j绑定到到达指定行上
(global-set-key (kbd "C-h") 'backward-delete-char-untabify)
(global-set-key (kbd "M-h") 'backward-kill-word)
(global-set-key (kbd "<f1>") 'help-command)
(global-set-key (kbd "<f7>") 'magit-status)
;;当你在shell、telnet、w3m等模式下时,必然碰到过要输入密码的情况,此时加密显出你的密码
(add-hook 'comint-output-filter-functions
'comint-watch-for-password-prompt)
;; 设定不产生备份文件
(setq make-backup-files nil)
;; 不生成临时文件
(setq-default make-backup-files nil)
(put 'scroll-left 'disabled nil) ;允许屏幕左移
(put 'scroll-right 'disabled nil) ;允许屏幕右移
(put 'set-goal-column 'disabled nil)
(put 'narrow-to-region 'disabled nil)
(put 'upcase-region 'disabled nil)
(put 'downcase-region 'disabled nil)
(put 'LaTeX-hide-environment 'disabled nil)
;;把这些缺省禁用的功能打开。
;;允许emacs和外部其他程序的粘贴
(setq x-select-enable-clipboard t)
(setq user-full-name "name")
(setq user-mail-address "name@qq.com")
;;设置有用的个人信息,这在很多地方有用。
(setq track-eol t)
;; 当光标在行尾上下移动的时候,始终保持在行尾。
;;--------------------src -------------
;;(require 'org-tempo)
;; if want use <s TAB to begin a src block in org-mode 9.3,you must
;; add org-tempo. you can also use C-c C-, to do the same thing.
;;--------------------------------------
安装插件
目前常用的插件有以下几个
- openwith :可以配置用外部程序打开emacs的文件
- magit :git的前端界面
- mu4e:邮件客户端
- ox-hugo :org文件生成hugo需要的md文件
其他大部分插件都是built-in,默认可以使用。
块操作
块操作命令有以下几个
命令 | 说明 |
---|---|
C-x r k | 剪切一个矩形块 |
C-x r y | 粘贴一个矩形块 |
C-x r o | 插入一个矩形块 |
C-x r c | 清除一个矩形块(使其变成空白) |
C-x r t | 在选定区域的所有列前插入样的字符 |
列操作
按列排序 删除重复列
单元格 | 单元格 | 单元格 |
进阶操作
排序
C-u 7 M-x sort-field
删除重复
M -x delete-duplicate-lines
删除指定
tramp
配置
(require ’tramp)
sudo
/sudo::/path/to/file
ssh
/ssh:username@server.net:/path/to/file.txt
/sftp:username@server.net:/path/to/file.txt
server name 可以在host中定义
direct模式
openwith
打开各种docx、pptx、xlsx等文件的配置,我配置中好像“|”不起作用,第二行 的视频播放配置可能无效,由于没有验证,也没再管他。有兴趣的可以研究一下。
(require 'openwith)
(openwith-mode t)
(setq openwith-associations
'(("\.docx$" "open" (file) )("\.xlsx$" "open" (file) ) ("\.pptx$" "open" (file))
("\.mov\|\.RM$\|\.RMVB$\|\.avi$\|\.AVI$\|\.flv$\|\.mp4\|\.mkv$\|\.rmvb$" "open" (file) )
("\.pdf$" "open" (file))
("\.CHM$\|\.chm$" "open" (file) )
)
)
org模式
文本操作
移动
C-c C-n | 下个标题 |
---|---|
C-c C-p | 上个标题 |
C-c C-f | 下个同级的标题 |
C-c C-b | 上个同级的标题 |
C-c C-u | 回到上层标题 |
编辑
文档中常用的配置
#+OPTIONS ^:nil 关闭下划线转义 输入a_{b}才转义
#+OPTIONS: toc:t ^:nil author:nil num:2
#+OPTINS: n:t html 中不换行
列表
在大纲树的一项中,自定义格式的列表可以提供更多的组织结构,也使我们可以 得到一个复先框列表(见 5.6 节[复先框])。Org 模式可以处理这种列表, 并且 HTML 导出器(见12章)也支持这种格式。
Org 能够识别有序列表、无序列表和描述列表。
无序列表项以‘-’、‘+’或者‘*‘开头。 有序列表项以‘1.’、‘1)’或者开头。 描述列表用‘::’将项和描述分开。 同一列表中的项的第一行必须缩进相同程度。当下一行的缩进与列表项的的开头 的符号或者数字相同或者更小时,这一项就结束了。当所有的项都关上时,或者 后面有两个空行时,列表就结束了。例如:
链接
Org 能够识别 URL 格式的文本并将它们处理成可点击的链接。通常链接格式是这样的:
[[link][description]]
或者
[[link]]
要想编辑链接,可以光标置于链接上并键入 C-c C-l。
内部链接
如果一个链接地址并不是 URL 的形式,就会作为当前文件内部链接来处理。最重要的一个例子是
[[#my-custom-id]]
它会链接到 CUSTOM_ID 属性是 “my-custom-id” 的项。
类似
[[My Target]]
和
[[My Target][Find my target]]
的链接,点击后本文件中查找对应的目标。
外部链接
Org 支持的链接格式包括文件、网页、新闻组、BBDB 数据库项、IRC 会话和记 录。外部链接是 URL 格式的定位器。以识别符开头,后面跟着一个冒号,冒号 后面不能有空格。下面是一些例子:
http://www.astro.uva.nl/~dominik :: on the web
file:/home/dominik/images/jupiter.jpg :: file, absolute path
/home/dominik/images/jupiter.jpg :: same as above
file:papers/last.pdf :: file, relative path
file:projects.org :: another Org file
docview:papers/last.pdf::NNN :: open file in doc-view mode at page NNN
id:B7423F4D-2E8A-471B-8810-C40F074717E9 :: Link to heading by ID
news:comp.emacs :: Usenet link
mailto:adent@galaxy.net :: Mail link
vm:folder :: VM folder link
vm:folder#id :: VM message link
wl:folder#id :: WANDERLUST message link
mhe:folder#id :: MH-E message link
rmail:folder#id :: RMAIL message link
gnus:group#id :: Gnus article link
bbdb:R.*Stallman :: BBDB link (with regexp)
irc:/irc.com/#emacs/bob :: IRC link
info:org:External%20links :: Info node link (with encoded space)
管理日志和日程
相关的配置
;;-------------begin gtd------------------------------
(global-set-key "\C-c1" 'org-store-link)
(global-set-key "\C-cc" 'org-capture)
;;(global-set-key "\C-cr" 'remember)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)
(setq org-todo-keywords
'((sequence "REPORT(r)")
(sequence "TODO(t!)" "|" "DONE(d!)" "CANCELED(c@/!)"))
)
(setq org-capture-templates
'(("t" "Todo" entry (file+headline "~/.todos/gtd.org" "Tasks")
"* TODO %?\n %i\n %a")
("j" "Journal" entry (file+datetree "~/.todos/journal.org")
"* %?\nEntered on %U\n %i\n %a")))
(setq org-agenda-files (list "~/.todos/gtd.org"
"~/.todos/journal.org"
"~/Documents/todo/"
))
(setq org-default-notes-file "~/.todos/journal.org")
;;----------------end gtd-------------------------------
表格
基本操作
快捷键 | 说明 |
---|---|
TAB | 切换到下个单元格,如是最后一个单元格,则新建一行并跳到该行第一个单元格 |
M-S-right | 在当前列前插入一列 |
M-S-left | 删除当前列 |
M-S-down | 在当前行前插入一行 |
M-S-up | 删除当前行 |
C-m | 移动到下一行,或新建一行 |
M-up/M-down | 将当前行往上/下移动 |
M-left/M-right | 将当前列往左/右移动 |
C-c ` | 编辑当前单元格 |
C-c C-x C-w | 剪切某个区域的表格内容 |
C-c C-x C-y | 拷贝复制的内容到表格 |
S-return | 当单元格无内容时,将其上方第一个非空内容拷贝过来;否则拷贝当前内容到下一行并随之移动 |
C-c C-c | 强制表格重新排列 |
C-c ^ | 表格排序 |
C-c 竖线 | 选中一部分数据,直接建立表格 |
C-c - | 在一行后执行,在下一行添加表格分割线 |
表格计算、公式编辑
表格绘图
导出pdf
导出pdf,需要latex的支持,需要安装相关的组建并配置。由于相对比较复杂, 可以用一个折中的简单办法,先吧org文件转化为html文件,再从web浏览器上面 保存为pdf文档,目前看基本上可以用。 以下是曾经用过的latex相关配置:
;; (setq tex-compile-commands '(("xelatex %r")))
;; (setq tex-command "xelatex")
;; (setq-default TeX-engine 'xelatex)
;; (add-hook 'LaTeX-mode-hook (lambda()
;; (add-to-list 'TeX-command-list '("XeLaTeX" "xelatex %(mode) %t" TeX-run-TeX nil (latex-mode) ))
;; (setq TeX-command-default "XeLaTeX")
;; (setq TeX-save-query nil )
;; (setq TeX-show-compilation t)
;; (setq TeX-PDF-mode t)
;; ))
;; 使用Listings宏包格式化源代码(只是把代码框用listing环境框起来,还需要额外的设置)
(setq org-export-latex-listings t)
;; Options for \lset command(reference to listing Manual)
(setq org-export-latex-listings-options
'(
("basicstyle" "\\color{foreground}\\small\\mono") ; 源代码字体样式
("keywordstyle" "\\color{function}\\bfseries\\small\\mono") ; 关键词字体样式
("identifierstyle" "\\color{doc}\\small\\mono")
("commentstyle" "\\color{comment}\\small\\itshape") ; 批注样式
("stringstyle" "\\color{string}\\small") ; 字符串样式
("showstringspaces" "false") ; 字符串空格显示
("numbers" "left") ; 行号显示
("numberstyle" "\\color{preprocess}") ; 行号样式
("stepnumber" "1") ; 行号递增
("backgroundcolor" "\\color{background}") ; 代码框背景色
("tabsize" "4") ; TAB等效空格数
("captionpos" "t") ; 标题位置 top or buttom(t|b)
("breaklines" "true") ; 自动断行
("breakatwhitespace" "true") ; 只在空格分行
("showspaces" "false") ; 显示空格
("columns" "flexible") ; 列样式
("frame" "single") ; 代码框:阴影盒
("frameround" "tttt") ; 代码框: 圆角
("framesep" "0pt")
("framerule" "8pt")
("rulecolor" "\\color{background}")
("fillcolor" "\\color{white}")
("rulesepcolor" "\\color{comdil}")
("framexleftmargin" "10mm")
))
;; \usepackage{fontspec}
;; \setmainfont{Microsoft YaHei}
(defun my-auto-tex-parameters (backend)
"Automatically select the tex packages to include."
;; default packages for ordinary latex or pdflatex export
(setq org-latex-default-packages-alist
'(("AUTO" "inputenc" t)
("" "graphicx" t)
("" "longtable" nil)
("" "float" nil)
("" "fontspec" t)
("" "xunicode" t)
("" "url" t)
("" "rotating" t)
("american" "babel" t)
("babel" "csquotes" t)
("" "soul" t)
("xetex" "hyperref" t)
("T1" "fontenc" t)
("" "fixltx2e" nil)
("" "wrapfig" nil)
("" "soul" t)
("" "textcomp" t)
("" "marvosym" t)
("" "wasysym" t)
("" "latexsym" t)
("" "amssymb" t)
("" "hyperref" nil))))
;; Packages to include when xelatex is used
;; (setq org-export-latex-classes
;; (cons '("ctexart"
;; "\\documentclass[11pt,ctexart]{memoir}"
;; ("\\section{%s}" . "\\section*{%s}")
;; ("\\subsection{%s}" . "\\subsection*{%s}")
;; ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
;; ("\\paragraph{%s}" . "\\paragraph*{%s}")
;; ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
;; org-export-latex-classes))
(add-hook 'org-export-before-parsing-hook 'my-auto-tex-parameters)
;;set xetex mode in tex/latex
;; (add-hook 'LaTeX-mode-hook (lambda()
;; (add-to-list 'TeX-command-list '("XeLaTeX" "%`xelatex%(mode)%' %t" TeX-run-TeX nil t))
;; (setq TeX-command-default "XeLaTeX")
;; (setq TeX-save-query nil)
;; (setq TeX-show-compilation t)
;; ))
;; (setq org-latex-to-pdf-process
;; '("xelatex -interaction nonstopmode %f"
;; "xelatex -interaction nonstopmode %f")) ;; for multiple passes
(setq org-latex-pdf-process '("xelatex -shell-escape -interaction nonstopmode %f"
"xelatex -shell-escape -interaction nonstopmode %f"))
指定图片尺寸
用像素指定图片尺寸
#+ATTR_ORG: :width 100 ~
#+ATTR_HTML: :width 100p ~
[[./shanshui.jpg]]
用比例指定图片尺寸
:title表示图片名称, 对齐方式用‘:align right’
#+CAPTION: pic align right
#+ATTR_HTML: :alt neural network :title Neural network representation :align right
#+ATTR_HTML: :width 30% :height 30%
[[./shanshui.jpg]]
图片居中
可以用center来表示图片居中
#+begin_center
#+ATTR_ORG: :width 100 ~
#+ATTR_HTML: :width 100p ~
[[./shanshui.jpg]]
#+end_center
magit
magit status 中 ? 键可提示magit命令绑定在哪些按键上.
blog
ox-hugo相关的配置
(with-eval-after-load 'ox
(require 'ox-hugo))
;;---------------begin hugo------------------------
;; org-hugo capture
(with-eval-after-load 'org-capture
(defun org-hugo-new-subtree-post-capture-template ()
"Returns `org-capture' template string for new Hugo post.
See `org-capture-templates' for more information."
(let* (;; http://www.holgerschurig.de/en/emacs-blog-from-org-to-hugo/
(date (format-time-string (org-time-stamp-format :long :inactive) (org-current-time)))
(title (read-from-minibuffer "Post Title: ")) ;Prompt to enter the post title
(fname (org-hugo-slug title)))
(mapconcat #'identity
`(
,(concat "** TODO " title " :@随笔:")
":PROPERTIES:"
,(concat ":EXPORT_FILE_NAME: " fname)
,(concat ":EXPORT_DATE: " date) ;Enter current date and time
":END:"
"%?\n") ;Place the cursor here finally
"\n")))
(add-to-list 'org-capture-templates
'("h" ;`org-capture' binding + h
"Hugo post"
entry
;; It is assumed that below file is present in `org-directory'
;; and that it has a "Blog Ideas" heading. It can even be a
;; symlink pointing to the actual location of all-posts.org!
(file+headline "~/blog/gitblog//orgcontent/0000head.org" "INBOX")
(function org-hugo-new-subtree-post-capture-template))))
;;---------------end hugo--------------------------
配置好之后,用以下命令,就可以把org文件导出为md文件并放在对应的目录下
C-c C-e H H