ZhangHui Li

CPU designer, Lisper, Smalltalker & Emacs maniac.

1_00_emacs_note

Table of Contents

在终端中启动

有时在终端中启动emacs时会只有几行,显示不正常,这时需要加上-Q选项。 emacs -nw -Q

启动

无窗口启动 emacs -nw 有时在.emacs中设置,如 (tool-bar-mode nil) 在新版本中会不起作用,将nil置换成0

start window size

X window

vi ~/.Xdefault Emacs.geometry:148x40+200+150

.emacs

(setq default-frame-alist '((height . 50)(width . 100) (menu-bar-lines . 20)(tool-bar-lines . 0)));;emacs start frame size

通常命令格式

C-x 字符扩展。C-x 之后输入另一个字符或者组合键。
M-x 命令名扩展。M-x 之后输入一个命令名。
C-g 撤销已输入命令。
C-z 把Emacs“挂起”,也就是说,它会回到shell但不退出Emacs。在常用的 shell中,通常可以用“fg”或者“%emacs”命令再次回到Emacs中。
M-x recover file 恢复自动保存文件。#hello.c# 是自动保存文件。
M-! 执行shell命令

帮助

C-h m 可以查看当前主模式的文档。
C-h c 输入一个组合键,键命令的简要说明。
C-h k 输入一个组合键,键命令的详细说明。
C-h f 解释一个函数。需要输入函数名。
C-h v 用来显示 Emacs变量的文档。
C-h a 相关命令搜索(Command Apropos)。
C-u l manul
C-u h info help

移动

C-v 向前移动一屏
M-v 向后移动一屏
C-l 重绘屏幕,并将光标所在行置于屏幕的中央
M-f 以单词为单位,与C-f相同
M-b 以单词为单位,与C-b相
C-e 移动到行尾,M-e 以句子为单位
C-a 移动到行首,M-a 以句子为单位
M-< 移到所有文字首
M-> 移到所有文字末
M-g g 跳到指定行
                  上一行 C-p
                      :
                      :                            .
向左移 C-b .... 目前光标位置 .... 向右移 C-f
                     :         
                     :
                  下一行 C-n
C-u 0 C-l 将本行带到屏幕的最上方

重复

C-u C-u 8 C-v 重复翻页8次
  C-u 8 * 插入********
C-x z 重复前一指令

插入

插入特殊字符

插入tab键C-q tab

插入更特殊字符

C-x 8 C-h

列编辑

C-x r C-@ point-to-regiter
C-x r SPC point-to-regiter
C-x r + increment-register
C-x r b bookmark-jump
C-x r c clear-rectangle
C-x r d delete-rectangle
C-x r f frame-configiration
  to-register
C-x r g insert-register
C-x r i insert-register
C-x r j jump-to-register
C-x r k kill-rectangle
C-x r l bookmark-bmenu-list
C-x r m bookmark-set
C-x r n number-to-register
C-x r o //open-rectangle
C-x r r copy-rectangle-to
  register
C-x r s copy-to-register
C-x r t string-rectangle
C-x r w window-configuration
  to-register
C-x r x copy-to-register
C-x r y yank-rectangle

two-columns

首先,我们的使用环境是,有一个文件,文件中可能只有一列,或者有两列。一 列的情况下,我们想编辑加入另外一列,如果用列编辑,那么我们无法对每一行 进行细致的编辑。如果一行一行自己写,要自己控制格式,麻烦,达不到我们#将 排版格式交给编辑器#的思想。如果有两列,我们会需要交替的编辑其中的一列, 最好的办法是有两个buffer将当前文件分开。下面描述在two-colunms下各种使用 情况。

  • 当前只有一列,加入另外一列,f2+2,会出现一个新的关联buffer,该buffer 与当前文件一一对应,一起滚动。编辑完成后,f2+1合并两个buffer,文件变 成两列。
  • 当前有两列,将两列分开编辑,f2+s,会从光标位置将当前文件分为两列,编 辑后,合并buffer即可。
  • 此外,不管是f2+2,还是f2+s,都会打开一个buffer,名字叫2C/文件名,此时 如果,f2+b就可以打开该buffer,如果该buffer被kill掉,那么,emacs会提 示关联另外一个buffer,如果我们打开另外一个文件buffer,关联后,如果合 并buffer,那么就可以实现将一个文件作为另一个文件的一列操作。
f2+2 打开新关联列buffer
f2+s 将当前文件分为两个关联列buffer
f2+b 打开关联列buffer
f2+1 合并两个关联列buffer

删除/移除

<Backspace> 删除光标前的一个字符
C-d 删除光标后的一个字符,相当Delete
   
M-<Backspace> 移除光标前的一个词
M-d 移除光标后的一个词
   
C-k 移除从光标到“行尾”间的字符
M-k 移除从光标到“句尾”间的字符

“移除(kill)”和“删除(delete)”的不同在于被移除的东西可以找回来, 而被删除的就不行了。一般而言,那些可能消除很多文字的命令会把消除掉的文 字记录下来(它们被设定成了“可召回”),而那些只消除一个字符或者只消除 空白的命令就不会记录被消除的内容(自然你也就无法召回了)。

复制/剪切/粘贴/选择

这两项操作是一系列组合命令。

C-spc/@ 开始标记
另一个地方C-w 标记区域被剪切
另一个地方M-w 标记区域被负责
C-y 被剪切/复制区域粘贴回来(yank),仅前一次
M-y 粘贴被剪切/复制前几次
C-x h 全选

此外,移除之中的消除很多文字命令,可以被粘贴回来。

撤销

C-x u
C-_,C-/

都可以,推荐C-/,好用。

文件/缓存操作

没打开一个文件会在EMACS中建立一个缓存。打开EMACS,默认两个 BUFFER,*scratch*/*Messages*,前者是一个lisp-interation-mode的elisp执行环 境,后者记录回显信息。

C-x C-f 打开文件
C-x C-s 保存缓存到文件
C-x C-b 列出缓存
C-x b 切换到另个BUFFER
C-x k 关闭缓冲
C-x s 保存多个缓冲区
C-x C-c 离开 Emacs
C-x C-w 文件另存为

搜索/替换

C-s 是向前搜索C-r 是向后搜索。M-x replace-string全文范围内把一个字符串 替换成另一个。

query replace

M -% start query replace
C-r/C-M-C go to edit mode,go on query replace and exit edit mode
"." replace current match and exit query replace mode
"," replace current match and display without jump to next
"!" replace all the least match
"^" move to pre match
E edit the pattern to replace

替换时区分大小写,由变量case-fold-search控制

大小写转换

区域大小写转换

C-x C-L C-x C-U

单词大小写转换

M-L M-U

多窗口

C-x 1 只留下当前窗格。
C-x 2 划分为上下两个窗格。
C-x 3 划分为左右两个窗格。
C-x 4 C-f 指定的文件出现在下方的窗格中,同时光标也跳到了那里。
C-x o 切换鼠标到另个窗格。

非焦点窗格翻页

C-M-v 滚动另个的窗格。C-M-S-v 向上滚动是

注释

;; 双分号注释

各种mode

minor mode

自动折行/M-x auto-fill-mode。是一个minor-mode

  • 设定行宽

    输入 C-x f 并传递参数 20: C-u 2 0 C-x f。设定为每行宽20字符。最后再用 C-x f 将边界设回 70。

  • 手动折行

    如果你在段落的中间做了一些修改,那么自动折行模式不会替你把整个段落重新 折行,你需要用 M-q 手动折行。注意,光标必须位于你需要折行的那一段里。表 格不适用。

Over-wirte mode(ovwrt) 改写模式,insert键使能。

显示所有行号

linum.el 很好用,它显示的行号与正文间有一个分隔线,而且可以设置所有的 buffer载入时自动加载,只需在.emacs中加入以下一行就可以了。 (global-linum-mode t) (require 'linum) (add-to-list 'load-path "usr/share/emacs/site-lisp")

auto complete mode 自动补全

Key Command Description
TAB, C-i ac-expand Completion by TAB
RET, C-m ac-complete Completion by RET
down, M-n ac-next Select next candidate
up, M-p ac-previous Select previous candidate
C-?, f1 ac-help Show buffer help

major mode

picture mode

在org mode下C-c '时会跳到org-src mode 同时会有一个major mode 就是 picture mode

org-mode

  • sparse tree
    C-c /
    
  • 表格
    C-c RET 插入横线
  • todo items

    key map

    C-c C-t,S-right/left totate TODO state
    C-c a t show the global TODO list
    S-M-RET insert a new TODO entry
  • 在org mode中显示图片

    插入link,并进入iimage-mode即可

follow mode

使两个buffer一起scroll

elisp

美化

设置Emacs的字体

(set-default-font “Courier New-14″) 有时-14不能指定字体大小,则需要通 过(set-default-font "AR PL UKai TW MBE:pixelsize=21")来指定字体大小。 当前字体类型可以通过(M-x describe-font)来查询并设置,先emacs菜单中设置 好,然后通过describe-font来显示当前是什么字体,然后用set-frame-font设 置到.emacs中

也可以通过

(set-frame-font "FONT")来设置

Miscellaneous add-ons for Emacs

emacs goodies el

linum mode

floding mode

calendar&dairy

(setq diary-file "")设置diary 文件路径

key map

M-x calendar open calendar
q exit calendar
> one month forward
< one month backward
C-v three month forward
M-v three month backward
M-= calculate selected region days
d display all entries for the selected date
s display the entire diary file
m mark all diary entries
u unmark the calendar window
id insert selected day diary entiry
iw insert selected week diary entiry

emacs shell

M-! one command
M-| emacs shell
M-x term realy shell
M-x eshell emacs shell

在emacs中运行shell命令 M-! cmd RET:打开一个名为“*Shell Command Output*“的窗口,并把该命令的执行结果显示在其中。按下”C-x 1“组合键可 以关闭这个窗口。由于Shell命令的输出是在一个编辑缓冲区里,因此我们可以对 它进行编辑、保存等操作。 M-| cmd RET:运行Shell命令,并使用编辑窗口中选 定的区域作为该Shell命令的输入,然后可以选择是否用该Shell命令的输出来替 换编辑窗口中选中的区域。 C-u M-! cmd RET:执行一条Shell命令,并将其输出 放到编辑区中光标所在的位置处,而不将其输出到”Shell Command Output“窗 口。 M-x shell:运行一个子Shell,该子Shell对应于emacs中的一个名 为”*Shell*"的缓冲区,此后,我们就可以交互式的运行Shell命令了。 M-x term:运行一个子Shell,该子Shell对应于emacs中的一个名为“*Terminal*” 的缓冲区。使用该命令获得的子Shell是一个完整的Shell的模拟,与我们直接在 Shell中操作没有什么差别。 M-x eshell:运行emacs shell。该Shell为emacs自 己实现的一个shell,而前面运行的shell都为系统中的shell程序(例 如:/bin/csh等)。我们可以通过设置变量shell-file-name来设置emacs所使用 的默认shell

emacs for windows

移值.emacs

(load-file "D:/emacs-24.1/.emacs")
(setenv "HOME" "D:/emacs-24.1")
(setenv "PATH" "D:/emacs-24.1")
(setq default-directory "~/")

特殊用法

重复上一次命令

重复一次 C-x z 重复两次 C-x zz 依些类推

重复上一次选定区域 或回到上一次的位置 mark

选定当前地方与前一地方,mark ring C-x C-x

将搜到的东西列出来

M-x occur <RET> xxx <RET>

对于选中区域的特殊操作

  • 将选中的内容保存到一个寄存器中
    • C-x r s
  • 将选中的文件保存到一个文件中,accumulating text
    • M-x append-to-buffer
    • M-x prepend-to-buffer
    • M-x copy-to-buffer
    • M-x insert-to-buffer
    • M-x append-to-buffer

存储当前位置,并用于jump

C-x r <SPC> R C-x r j R

org-publish

org的更新记录放在~/.org_template 下,有些文件不能publish,请删除这个文件夹。

S键

emacs中支持super键,super键代表的是:window键或command键(mac)

自定义按键

emacs的按键概念

  • 优先级

local/global,local代表major mode控制的作用域,一个major/minor mode对应一个 local 作用域。

  • 作用域

global作用所有的mode,local只作用一个major/minor mode.

原则

  • 如果local中有定义,那么local中定义优先,local中没有定义,使用global 中的定义。

global

优先级最高,一直有效。

global-set-key global-unset-key define-key global-map

local-set-key local-unset-key

foundamental mode

global对foundamental一定有效。 如果在某一major mode将key的功能打乱,而你又想知道这个key的最初功能,就 从sfoundamental中去找key的标准定义。

交换两个character/ word

C-t/M-t

emacs record macro

<F3> xxx <F4>