文本编辑 Emacs


原文链接: 文本编辑 Emacs

reddit
论坛
Emacsist
21 天学会 Emacs 大纲
emacs-china/Spacemacs-rocks
lujun9972/emacs-document
emacs-china/hello-emacs: emacs新手入门资料汇集地
emacs-tw/emacs-101: Emacs 101 - 一本讓你學 Emacs 不再學得靠北靠母的美好的新手求生指南
Emacs Rocks!
Emacs相关中文问题以及解决方案

Emacs笔记
Emacs入门系列:3分钟学会Emacs基本操作
从零开始——Emacs 安装配置使用教程 2015

emacs autoload 集装箱 · LinuxTOY

那就从妖艳酷炫的快捷键开始吧!
Emacs 键映射(keymap) - joans123的专栏 - 博客频道 - CSDN.NET
emacs键盘映射 - 追风人 - 博客园

从 Vim 迁移到 spacemacs - 技术翻译 - 开源中国社区

From Vim to Emacs+Evil chaotic migration guide
elisp语法
emacslisp光速入门 - 大雄 blog
elisp笔记
elisp半本manual的量
Emacs Lisp 语法速成
Emacs Lisp
淺談 Lisp 裡面的 Lambda | 東北角的小徑
ANSI Common Lisp 中文翻譯版 — ANSI Common Lisp 中文版
Emacs Lisp 简明教程 - 水木社区Emacs版
Elisp 文档笔记
Lisp语言:函数的可选参数,剩余参数以及关键字参数

spacemacs

Spacemacs 使用总结
Spacemas的Dotfile配置 - 小幻的博客 - 博客频道 - CSDN.NET
org-mode
Org Customization
Emacs configuration file

The Org Manual
The Org Manual 笔记
hello-emacs/org-manual.org
Org-mode 简明手册
Emacs Org Mode 小结(长文慎入……
Emacs月月积累(终结篇):熟练使用org-mode管理日常事务
GTD
Org Mode - Organize Your Life In Plain Text!
用Org-mode实现GTD
Org-mode,最强的任务管理利器,没有之一
GTD精要 - 心内求法 - 博客园
使用emacs的org-mode进行时间管理(五)——归档 - 暗日 - 51CTO技术博客

org-capture
Org-Mode Beginners Customization Guide

关于org-capture-templates配置代码的解释
窗口
Emacs中的窗口操作 · ZMonster's Blog
C-x 0: 删除当前窗口
C-x 1: 删除当前窗口外的其他窗口
表格
强大的Org mode(2):任务管理
强大的 Org mode(3): 表格的基本操作及公式、绘图 · ZMonster's Blog

小技巧
org-mode 里面自动归档任务 - wd and cc
使用 Emacs Org-mode 构建笔记系统
How to Install Packages Using ELPA
Using Font Awesome in the Emacs mode line
在SpacEmacs 中设置 helm-gtags 快捷键
emacs-document/教你用Org-mode管理dotfiles.org
Spacemacs通过选择性开启pangu-spacing加快打开大文件的速度
################################################################################

emacs --debug-init

编译安装emacs最新版

git clone git://git.savannah.gnu.org/emacs.git
$ cd emacs
./autogen.sh

sudo apt-get -y install autoconf # autoconf (need at least version 2.65)
sudo apt-get -y install texinfo # You do not seem to have makeinfo >= 4.13
sudo apt-get -y install libgtk2.0-dev # --with-x-toolkit=no | --without-x
sudo apt-get -y install libtiff5-dev # --with-tiff=no --with-jpeg=no
sudo apt-get -y install libgnutls-dev # --with-gnutls=no
sudo apt-get -y install libxpm-dev # --with-xpm=no
sudo apt-get -y install libgif-dev # --with-gif=no
sudo apt-get -y install libncurses5-dev
sudo apt-get -y install libdbus-1-dev # dbus
sudo apt-get -y install mailutils
./configure
./configure --without-x --without-pop --with-mailutils
make && make install

gif 用 byzanz 录制,按键显示用 screen-key,系统 Linux
最近了解到新的一种办法,就是安装 command-log-mode ,会在 Emacs 中显示触发过的快捷键

Install

git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
git clone https://github.com/zilongshanren/spacemacs-private.git ~/.spacemacs.d

字体

Source Code Pro

emacs --daemon
emacscliet -c
emacsclient -t
http_proxy=http://127.0.0.1:8087 emacs -nw

sudo apt-get install global
an Emacs "jump to definition" package dumb-jump

输入半边括号可以用

C-q )

#Emacs GUI 在 read-only-mode (如 spacemacs-buffer-mode) 内如何用鼠标左击代替键盘 Enter
(define-key spacemacs-buffer-mode-map [mouse-2] 'widget-button-press)

执行 elisp 语句
将光标移到表达式内部,然后执行 M-C-x(即 Alt + Ctrl + x 键);
将光标放到表达式最后一个封闭的括号的后面,然后执行 C-x C-e。

?x 可以获得字符 x 的 ASCII 码
例如 ?a 的求值结果是 ASCII 码 97

二进制数,前缀是 #b,例如 #b10010110;
八进制数:#o[0-7]+,例如 #o377;
十六进制数,前缀是 #x,例如 #xabcd

全局快捷键:
(global-set-key (kbd "A") 'your-command)
(global-unset-key (kbd "grm"))

全局映射键:
(define-key key-translation-map (kbd "A") (kbd "B"))

基于 Major-Mode 的局部快捷键,以及
(local-set-key (kbd "A") 'your-command)
(local-unset- ("laptop" . ?l) ("pc" . ?p)))

定义需用到的快捷键
a-z 直接插入已定义的 TAGS
切换到手动输入 TAGS
清空所有 TAGS
! 关闭或开启互不相容的 TAGS 标记
q/C-g 退出设置key (kbd "grm"))

基于 Minor-Mode 的局部快捷键,对应的命令分别是
(define-key your-minor-mode-map (kbd "A") 'your-command)
(define-key evil-normal-state-map "q" 'evil-force-normal-state )
(define-key evil-normal-state-map "q" nil )

(define-key global-map (kbd "C-c t") 'org-capture)

(setq file "~/org-notes/")
(setq file1 (file/note.org)
迭代list的元素 dolist

常用命令

;; 关闭其它窗口
(delete-other-windows)
;; record
(define-key evil-normal-state-map "q" 'evil-record-macro)
M-x org-babel-tangle #+BEGIN_SRC conf :tangle ~/.aliases 自动生成dotfiles
##############

##Undo
Ctrl-/
C-S--

Redo

C-x u
M-S--

C-x 0: 删除当前窗口

C-x 1: 删除当前窗口外的其他窗口

C-f 为前移一个字符, f 代表 forward。
C-b 为后移一个字符, b 代表 backward。

C-p 为上移至前一行, p 代表 previous。
C-n 为上移至下一行, n 代表 next。

C-a 为移至行首, a 代表 ahead。
C-e 为移至行尾, e 代表 end。

c-s Swiper
重复按 c-s 可以不停地查找一下个,按 c-r 可以查找上一个
Emacs keys Action Scope Direction/Place

基本快捷键(Basic)

C-x d 打开目录
C-x C-f 打开文件
C-x C-s 保存文件
C-x C-w 另存为文件
C-x C-v 关闭当前缓冲区文件并打开新文件
C-x i 在当前光标处插入文件
C-x C-b 显示缓冲区列表
C-z 挂起emacs
C-x C-c 关闭emacs

光标移动基本快捷键(Basic Movement)

C-f 后一个字符
C-b 前一个字符

M-f 后一个单词
M-b 前一个单词
C-v 向下翻一页
M-v 向上翻一页
M-< 到文件开头
M-> 到文件末尾

编辑(Editint)

C-d 删除(delete)后一个字符
M-d 删除后一个单词
Del 删除前一个字符
M-Del 删除前一个单词
C-k 移除(kill)一行

C-@ 设置开始标记 (例如标记区域)
C-w 移除(kill)标记区域的内容
M-w 复制标记区域的内容
C-y 召回(yank)复制/移除的区域/行
M-y 召回更早的内容 (在kill缓冲区内循环)
C-x C-x 交换光标和标记

M-u 使从光标位置到单词结尾处的字母变成大写
M-l 与M-u相反
M-c 使从光标位置开始的单词的首字母变为大写

transpose 移项 变换 转置

C-t 交换两个字符的位置
M-t 交换两个单词的位置
C-x C-t 交换两行的位置

C-h C-i 跳转到指定的 info-display-manual
在线帮助(Online-Help)
C-h i 打开info阅读器
C-h r 打开 manual
C-h t 打开emacs教程

C-h c 显示快捷键绑定的命令
C-h l 显示最后100个键入的内容
C-h w 显示命令被绑定到哪些快捷键上
C-h f 显示函数的功能
C-h v 显示变量的含义和值
C-h k 显示快捷键绑定的命令和它的作用
C-h b 显示当前缓冲区所有可用的快捷键

C-h C-f 显示emacs FAQ
C-h p 显示本机Elisp包的信息

搜索/替换(Seach/Replace)
C-s 向后搜索
C-r 向前搜索
C-g 回到搜索开始前的位置(如果你仍然在搜索模式中)
M-% 询问并替换(query replace)

Space或y 替换当前匹配
Del或n 不要替换当前匹配
. 仅仅替换当前匹配并退出(替换)
, 替换并暂停(按Space或y继续)
! 替换以下所有匹配
^ 回到上一个匹配位置
RETURN或q 退出替换

使用正则表达式(Regular expression)搜索/替换
可在正则表达式中使用的符号:
^ 行首
$ 行尾
. 单个字符
.* 任意多个(包括没有)字符
< 单词开头
> 单词结尾
[] 括号中的任意一个字符(例如[a-z]表示所有的小写字母)

M C-s RETURN 使用正则表达式向后搜索
M C-r RETURN 使用正则表达式向前搜索
C-s 增量搜索
C-s 重复增量搜索
C-r 向前增量搜索
C-r 重复向前增量搜索
M-x query-replace-regexp 使用正则表达式搜索并替换

窗口命令(Window Commands)
C-x 2 水平分割窗格
C-x 3 垂直分割窗格
C-x o 切换至其他窗格
C-x 0 关闭窗格
C-x 1 关闭除了光标所在窗格外所有窗格
C-x ^ 扩大窗格
M-x shrink-window 缩小窗格
M C-v 滚动其他窗格内容
C-x 4 f 在其他窗格中打开文件
C-x 4 0 关闭当前缓冲区和窗格
C-x 5 2 新建窗口(frame)
C-x 5 f 在新窗口中打开文件
C-x 5 o 切换至其他窗口
C-x 5 0 关闭当前窗口

书签命令(Bookmark commands)
C-x r m 在光标当前位置创建书签
C-x r b 转到书签
M-x bookmark-rename 重命名书签
M-x bookmark-delete 删除书签
M-x bookmark-save 保存书签
C-x r l 列出书签清单

d 标记等待删除
Del 取消删除标记
x 删除被标记的书签
r 重命名
s 保存列表内所有书签
f 转到当前书签指向的位置
m 标记在多窗口中打开
v 显示被标记的书签(或者光标当前位置的书签)
t 切换是否显示路径列表
w 显示当前文件路径
q 退出书签列表

M-x bookmark-write 将所有书签导出至指定文件
M-x bookmark-load 从指定文件导入书签

Shell
M-x shell 打开shell模式
C-c C-c 类似unix里的C-c(停止正在运行的程序)
C-d 删除光标后一个字符
C-c C-d 发送EOF
C-c C-z 挂起程序(unix下的C-z)
M-p 显示前一条命令
M-n 显示后一条命令

DIRectory EDitor (dired)
C-x d 打开dired
C(大写C) 复制
d 标记等待删除
D 立即删除
e或f 打开文件或目录
g 刷新当前目录
G 改变文件所属组(chgrp)
k 从屏幕上的列表里删除一行(不是真的删除)
m 用*标记
n 光标移动到下一行
o 在另一个窗格打开文件并移动光标
C-o 在另一个窗格打开文件但不移动光标
P 打印文件
q 退出dired
Q 在标记的文件中替换
R 重命名文件
u 移除标记
v 显示文件内容
x 删除有D标记的文件
Z 压缩/解压缩文件
M-Del 移除标记(默认为所有类型的标记)
~ 标记备份文件(文件名有~的文件)等待删除

标记自动保存文件(文件名形如#name#)等待删除

*/ 用*标记所有文件夹(用C-u */n移除标记)
= 将当前文件和标记文件(使用C-@标记而不是dired的m标记)比较
M-= 将当前文件和它的备份比较
! 对当前文件应用shell命令
M-} 移动光标至下一个用*或D标记的文件
M-{ 移动光标至上一个用或D标记的文件
% d 使用正则表达式标记文件等待删除
% m 使用正则表达式标记文件为

  • 新建文件夹
    > 移动光标至后一个文件夹
    < 移动光标至前一个文件夹
    s 切换排序模式(按文件名/日期)

或许把这个命令归入这一类也很合适:
M-x speedbar 打开一个独立的目录显示窗口

Telnet
M-x telnet 打开telnet模式
C-d 删除后一个字符或发送EOF
C-c C-c 停止正在运行的程序(和unix下的C-c类似)
C-c C-d 发送EOF
C-c C-o 清除最后一个命令的输出
C-c C-z 挂起正在运行的命令
C-c C-u 移除前一行
M-p 显示前一条命令

Text
只能在text模式里使用
M-s 使当前行居中
M-S 使当前段落居中
M-x center-region 使被选中的区域居中

宏命令(Macro-commands)
C-x ( 开始定义宏
C-x ) 结束定义宏
C-x e 运行最近定义的宏
M-n C-x e 运行最近定义的宏n次
M-x name-last-kbd-macro 给最近定义的宏命名(用来保存)
M-x insert-kbd-macro 将已命名的宏保存到文件
M-x load-file 载入宏

编程(Programming)
M C-\ 自动缩进光标和标记间的区域
M-m 移动光标到行首第一个(非空格)字符
M-^ 将当前行接到上一行末尾处
M-; 添加缩进并格式化的注释
C, C++和Java模式
M-a 移动光标到声明的开始处
M-e 移动光标到声明的结尾处
M C-a 移动光标到函数的开始处
M C-e 移动光标到函数的结尾处
C-c RETURN 将光标移动到函数的开始处并标记到结尾处
C-c C-q 根据缩进风格缩进整个函数
C-c C-a 切换自动换行功能
C-c C-d 一次性删除光标后的一串空格(greedy delete)

为了实现下面的一些技术, 你需要在保存源代码的目录里运行"etags
*.c *.h *.cpp"(或者源代码的其他的扩展名)
M-.(点) 搜索标签
M-x tags-search ENTER 在所有标签里搜索(使用正则表达式)
M-,(逗号) 在tags-search里跳至下一个匹配处
M-x tags-query-replace 在设置过标签的所有文件里替换文本

GDB(调试器)
M-x gdb 在另一个的窗格中打开gdb

版本控制(Version Control)
C-x v d 显示当前目录下所有注册过的文件(show all registered files in this dir)
C-x v = 比较不同版本间的差异(show diff between versions)
C-x v u 移除上次提交之后的更改(remove all changes since last checkin)
C-x v ~ 在不同窗格中显示某个版本(show certain version in different window)
C-x v l 打印日志(print log)
C-x v i 标记文件等待添加版本控制(mark file for version control add)
C-x v h 给文件添加版本控制文件头(insert version control header into file)
C-x v r 获取命名过的快照(check out named snapshot)
C-x v s 创建命名的快照(create named snapshot)
C-x v a 创建gnu风格的更改日志(create changelog file in gnu-style)

`