emacs的查找与编辑操作
概念一.删除环
emacs会依次记录每次你复制或删除等操作的字符串,把它们保存在删除环里。
这些操作包括
- C-k 删除光标位置到行尾字符串的命令
- C-w 删除已标记字符串的命令
- Esc w 复制已标记字符串的命令
复制代码
可见,它还未包括用Esc d和Esc DEL及其变体删除的单词,句子和段落,但对此我们可以用C-x u这条撤消命令来恢复。
概念二.命令记录
emacs会记录你的执行的每条命令保存为历史清单。
- Esc p 历史清单中再上一次命令
- Esc n 历史清单中再下一次命令
复制代码
emacs有很强大的查找与替换功能,主要表现在其强大的正则表达式引擎(当然,其他编辑器如vi也有对正则表达式的支持,但结合emacs的快捷键捆绑特色以及递增操作特色,我认为emacs的正则引擎比较灵活),满足了各种层面的用户需求。
这里不得不提的是emacs的递增查找特色(emacs的默认查找与替换模式),它的搜索最直接快捷,emacs会随着你的键入实时进行查找工作,结合正则表达式查找,就成了递增正则式查找。
1.向前普通查找
[RETURN]为可选项,表示进行非递增操作,emacs会等待查找字符串键入完毕按下回车键后进行查找与替换操作(如果你觉得实时查找很烦人,可以这样做)。
连续按下C-s,emacs会向前继续查找下一个匹配处;直到你认为该位置就是你所要的时候,按下回车键退出并确认这次查找;如果想撤消这次操作,可以按下
这样emacs会回到你原来的位置,就像从未进行过查找。注意,查找可以嵌套,所以可能要多次C-g才能撤消并退出。
提示:
可以选取编辑缓冲区的字符串作为查找字符串。
- C-s C-w 把光标位置处到单词末尾的字符串用作查找字符串
复制代码
- C-s C-y 把光标位置处到行尾的字符串用作查找字符串
复制代码
- C-s Esc y 把删除环最后一个字符串片断用作查找字符串
复制代码
提示:如何能使用删除环任意一个字符串片断作为查找字符串呢?我这里提供一种折衷的办法。
- 1. C-s Esc y 正常操作
- 2. C-g 撤消操作
- 3. C-x Esc Esc 重复操作
- 如果那次查找操作是在很早的时候做的,那么就处于历史命令环的早期记录,按Esc p向上找,而Esc n向下找
- 4. 在编辑辅助缓冲区里,用C-y以及Esc p在相应地方粘贴你需要的字符串作为查找字符串
复制代码
如果你想重复上一次的查找操作,可以用
当然,最好还是如上面的提示那样用历史清单命令来执行任意某个历史查找。
补充:
如果你想向后查找,那就把C-s换成C-r,上面的操作类似有效。
2.单词查找
emacs的默认查找为自动模式,如果你输入的查找字符串中包含大写,emacs会觉得,既然你费力气键入大写字母,那你肯定想emacs大小写区别,否则默认情况下,不区分大小写。(emacs的确很伟大
一般情况下的查找属于模糊模式,也就是它受换行符,空格以及标点符号的影响,这样出来的查找结果会出现很多冗余。
比如说有一句话为"Are they? she loves him.",如果你想找they she,那么用这种方法就会忽略它们中间的?号以及空格,得出你想要的结果;
又比如说,你想找一个单词"mail",但不想找出包含mail的字符串如smtpmail等,可以用这种方法精确查找单词。
这对于查找对象为论文特别有效。
3.查询-替换
很多时候,查找是为了替换。
提示:
输入查找字符串按回车键后,emacs找出第一个匹配点(如果有的话),按下?emacs会创建一个Help缓冲区列出可用的操作。
- SPACE 或 y 替换并跳到下一个匹配点
- DEL 或 n 忽略并跳到下一个匹配点
- . 替换并退出
- , 替换并显示替换情况(按y跳到下一个匹配点)
- ! 非交互替换所有匹配点
- ^ 返回上一个匹配点
- RETURN或q 退出
复制代码
提示
emacs还有一个很人性化的功能──递归操作。当你想基于查找对每个所得位置进行不同文本修改而非替换时的时候,这样很自然地,你希望emacs暂时挂起这次查找操作,把控制权交给你。
比如说,你想查找make,在"make it"这个匹配点上,你发现it应改为it's,但你又不想退出查找替换,这时进入递归状态就很有用了。
- C-r 进入递归状态
- Esc C-c 退出递归状态
复制代码
注意,递归状态可以嵌套,这时候要多次C-w才能回到起始点上。
如果想直接退出而无论多少次嵌套,则用以下命令:
4.正则表达式查找与替换
emacs的正则表达式博大精深,我以后会专门用新帖来描述。这里只提供方法。
进入正则表达式(非递增)查找
默认为递增查找,按下RETURN进行非递增查找。
- Esc C-s 跳到下一个匹配点
- Esc C-r 跳到上一个匹配点
复制代码
正则表达式查找并替换这个操作没有专门的快捷键,可用下列命令
- Esc x query-replace-regexp
- Esc x replace-regexp 无条件地进行查找并替换所有匹配点(慎用!)
复制代码 |