您的位置:首页 > 其它

emacs的基本操作

2010-12-22 17:45 190 查看

Emacs 的基本操作

Emacs 中的光标移动

C-f     光标前进一个字符
C-b     光标后退一个字符
C-p     上移一行
C-n     下移一行

M-f     前进一个单词
M-b     后退一个单词

C-a     行首
C-e     行尾

M-a     句首
M-e     句尾

M-{     上一个段落
M-}     下一个段落

C-v     屏幕上卷一个屏
M-v     屏幕下卷一个屏

C-M-v   另一个窗口下卷一个屏幕
C-M-V   另一个窗口上卷一个屏幕

M-<     文件头
M->     文件尾

C-u n 或 M-n   重复执行n次后继命令

Emacs中的删除

C-d     删除光标上的字符
DEL     删除光标前的字符

M-d     删除光标后的单词
M-DEL   删除光标前的单词

C-k     从光标位置删除到行尾
C-S-Backspace  删除当前行

C-y     恢复删除最近的一个
M-y     循环恢复删除上一个

文本块操作

C-@     标记文本块的开始

C-x C-x 互换插入点和文本标记的位置

M-h     标记整个段落
C-x C-p 标记整个页面
C-x h   标记整个缓冲区

查找与替换

简单查找替换

C-s     向前递增查找
C-r     反向递增查找

C-s C-w 向前递增查找,把光标所在的单词作为查找对象
C-r C-w 反向递增查找,把光标所在的单词作为查找对象

replace-string  查找替换光标后所有的内容
M-%     查询替换操作

对于M-%,需要注意的是其相关的一些操作:

SPACE或y    用新字符串替换原来的,并进入下一个位置
DEL或n      不替换,进入下一个位置
.          在当前位置做替换后退出查询-替换操作
,          替换,并显示替换情况(再按空格或y进入下一个位置)
!          对后面的内容全部进行替换,不再提问
^          返回上一个替换了的位置
RETURN或q   退出查询替换操作
C-r        进入递归编辑状态
C-w        删除此处内容并进入递归编辑状态(好进行其他修改)
M-C-c      退出递归编辑状态,继续完成查询-替换操作
C-]        退出递归编辑状态和查询替换操作

正则表达式查找与替换

C-M-s Return      向前查找正则表达式
C-M-r Return      反向查找正则表达式

C-M-s       向前递归查找正则表达式
C-M-r       反向递归查找正则表达式

query-replace-regexp  查询-替换正则表达式
replace-regexp    无条件替换正则表达式(慎用)

正则表达式中的字符:

^          匹配行首
$          匹配行尾
.          匹配任意单个字符
.*         匹配任意个字符
/<         匹配单词的开头
/>         匹配单词的结尾
[]         匹配[]中的任何一个字符,如[a-z]匹配任何一个小写字母

Emacs 的C/C++ 模式

指定为C++模式的方法

一般根据扩展名自动设定,不用指定,不过有时候你希望.h文件是C++模式的(缺省是C模式),在文件第一行(或其末尾)上加入

// -*- C++ -*-

语法高亮

不是C模式专有,顺便提一下,M-x global-font-lock-mode RET 或在.emacs中加入(global-font-lock-mode t)。在console下,Emacs21才支持语法高亮。(语法高亮,不同关键字用不同的颜色来突出)

编译和调试

M-x compile RET 编译
M-x gdb RET     调试

C-x `           (出错信息中)下一个错误,一个窗口显示错误信息,另一个
显示源码的出错位置
C-u C-x `       在compile buffer 列出同样的错误。
C-c C-c         转到出错位置

启动gdb调试器后,光标在源码文件缓冲区中时:

C-x SPC         在当前行设置断点
C-c C-c         中断
C-c C-z         中止
C-x C-a C-s     step
C-x C-a C-n     next
C-x C-a C-t     tbreak
C-x C-a C-r     continue
C-x C-a C-d     删除当前断点
C-x C-a C-l     到达最后一行


显示vector元素值

GDB 在调用成员函数的时候需要首先找到函数的代码才能执行。如果一个成员函数是内联的、并且没有在程序中被使用,那么 GDB 将找不到其代码,也就不能执行此成员函数。

方法1    在源程序的查看之前的位置使用一次  at() 成员函数。
方法2    执行 print vec_obj 可以列出 vector 的内部数据结构,使用这些结构也可以查看各个元素。
假设列出了如下内容:
$1 = {<std::_Vector_base<int,std::allocator<int> >> = {
_M_impl = {<std::allocator<int>> =   {<__gnu_cxx::new_allocator<int>> = {<No data fields>},
< No data fields>}, _M_start = 0x8095040,
_M_finish = 0x809505c, _M_end_of_storage = 0x8095060}}, <No data fields>}

可以这样查看第一个元素:print vec_obj._M_impl._M_start[0]

为方便使用,可以定义一个宏来使用:
define print_vector
print $arg0._M_impl._M_start[$arg1]
end

这样,print_vector vec_obj 2 就可查看第三个元素。

在C/C++代码中操作

M-a        移动到当前语句的开始
M-e        移动到当前语句的末尾

C-M-a      移动到当前函数的开始
C-M-e      移动到当前函数的结尾

M-q        若光标在注释文本中间,则进行段落重排,保留缩进和前导字符

C-M-h      把光标放在当前函数开头,把文本块标记放在函数结尾, 即把函数整个选作为一个文本块。

C-c C-q    对整个函数进行缩进
C-x h      选定整个buffer,  然后C-M-/可以对代码进行重新排版

C-c C-u    移动到当前预处理条件的开始位置
C-c C-p    移动到上一个预处理条件
C-c C-n    移动到下一个预处理条件

M-;        对当前行进行注释
C-x C-x    快速返回移动前的光标位置

C-c C-c    对一块代码进行注释;取消注释用命令 uncomment-region

子模式

auto-state    当你输入时自动缩进,自动换行
hungry-state  当你Backspace时,自动删除尽可能多的空白和空行

C-c C-t       同时转换(开/关)auto-state和hungry-state子模式
C-c C-a       转换 auto-state 子模式
C-c C-d       转换 hungry-state 子模式

C-c .         设置缩进风格(按TAB键可列出可用的风格,缺省的为gnu,其
缩进为2个字符;linux为8个;k&r为5个…)
TAB           重新缩进当前行

M-/           自动补齐(缓冲区中能找得到的串)
M-;           行尾加入注释

C-c C-e       扩展宏

C-c C-c       注释掉整个区域
C-c C-/       将区域中的每一行结尾都加入一个'/'字符

Emacs中的register

在多个文件中逛的时候,我们常常需要快速切换到先前访问的某个位置。因此,我们需要把文件及其光标位置暂时存放在某个地方。

在Emacs中,我们可以使用register暂时性保存这些信息。

将当前光标所在位置保存入一个register中:

C-x r SPACE + register名(一个字符,比如a吧)

然后我们就可以到处瞎逛,若要回到保存的register a位置,我们可以输入:

C-x r j a

挺好用的吧:)

如果你记性和我一样不好,恐怕会常常想看看自己保存了哪些register,我们可以输入:

M-x view-register    查看某一个register
M-x list-registers   查看所有的register

其实我常用的就是以上功能,为了使笔记稍微完整一点,下面开始Copy 《GNU Emacs Manual》的相关章节:

在下面,我们使用r来命名所有的register:

Save Positions in Registers

C-x r SPC r
Save position of point in register r (point-to-register).
C-x r j r
Jump to the position saved in register r (jump-to-register).

Saving Text in Registers

C-x r s r
Copy region into register r (copy-to-register).
C-x r i r
Insert text from register r (insert-register).
M-x append-to-register RET r
Append region to text in register r.
M-x prepend-to-register RET r
Prepend region to text in register r.

Saving Rectangles in Registers

C-x r r r
Copy the region-rectangle into register r (copy-rectangle-to-register).
With numeric argument, delete it as well.
C-x r i r
Insert the rectangle stored in register r (if it contains a rectangle) (insert-register).

Saving Window Configurations in Registers

C-x r w r
Save the state of the selected frame's windows in register r (window-configuration-to-register).
C-x r f r
Save the state of all frames, including all their windows,
in register r (frame-configuration-to-register).

Keeping Numbers in Registers

C-u number C-x r n r
Store number into register r (number-to-register).
C-u number C-x r + r
Increment the number in register r by number (increment-register).
C-x r g r
Insert the number from register r into the buffer.

使.emacs立即生效

M-x eval-current-buffer

Etags

建立Etags文件:

在代码目录中运行etags -R

如果要向现有tags表中添加,则运行etags -a

访问Tag文件:

M-x visit-tags-table

常用热键

M-. 访问tag C-u M-.访问下一个tag M-* 返回

Emacs 中的 GNU-Serv

常常使用console的人往往也改不了这么个习惯,就是进了X就开个终端,然后在里头埋头干活,看到什么文件想修改就vi一把。我也是这个习惯。vi比emacs启动快多了。

GNU-Serv改变了这个情形。

首先要安装gnu-serv这个包,在我的机器上apt-get install gnu-serv就可以了。

接下来修改.emacs文件

(require 'gnuserv)
(gnuserv-start)

接下来修改.bashrc文件

alias e='gnuclient'

这样,在终端下就可以通过 e foo来编辑foo文件了,它会自动关联到已经打开的emacs中。

更强大的功能在于,你还可以在远程执行gnuclinet,在本机编辑文件后自动存放到远程机器上。

Emacs中的bookmark

将当前页面加入bookmark

M-x bookmark-set

修改.bashrc,将list-bookmarks绑定到F9上

(global-set-key [(f9)] 'list-bookmarks)

这样,就可以通过F9键访问书签了。

常用键绑定

F2  寻找wiki
F3  进入dired模式
F4  进入eshell模式
F12 t   进入todo模式
F12 c   访问Calendar模式
F12 p   在当前页添加Planner
F12 g   查阅当天的plan
F12 r   添加笔记
F9  列出bookmarks

在Emacs 中添加Appointment

这个主要是添加约会和提醒用的,首先修改.emacs文件打开约会提醒功能。

(setq appt-issue-message t)

然后可以通过appt-add添加新的约会提醒,到时间Emacs就会弹出窗口提醒。如果这期间要取消约会,那么可以通过appt-delete删除。

Calendar和Diary

Calendar是配合Diary进行行程安排的,两者配合可以用于规划比较长远的事情。

我已经把Calendar模式绑定到了F8上,以下列举几个常用的命令:

.  跳回当天
o  跳到某一个月
g  这一系列命令表示goto,可以跳到指定的某一天。
g d   跳到某年某月某日
g c   跳到某年某星期的星期几
g C   跳到阴历的某一天
p  这一系列命令表示print,例如p C显示显示当前的阴历日期
i  这一系列命令表示插入行程安排
i d   加入当前这一天的行程安排,类似还有m w y
i w   跳到某个星期的星期一,按下i w可以加入每个星期都必须做的事情
i a   跳到某天,按下i a可以加入周年纪念日

好习惯应该是经常打开calendar,跳到某天,按下d就可以显示这一天的行程安排。

Emacs 中的 To-Do Mode

To-do可以用来做日程安排,todo,done,top分别表示要完成的事情,已完成的事情,和优先事情。

首先要修改.emacs文件

(setq todo-file-do "~/.emacs.d/todo-do")

(setq todo-file-done "~/.emacs.d/todo-done")

(setq todo-file-top "~/.emacs.d/todo-top")

下面是一些快捷操作

i    加入一个条目

e    编辑条目

k    删除条目

+/-  在不同category之间切换

j    跳转到不同的category

f    对已完成的事情进行归档,并可以进行评论。

如果按i想把条目归入新档时出现错误,可以用todo-add-category加入

想要添加什么事情,随手就可以通过F5进入todo-mode,按寻找一个category,按I添加一个新的entry。完成之后再切换到todo去,按下d或者f删除entry。每个星期可以通过bookmark访问一下done文件,顿时觉得生活过得好充实。

todo部分转载自coda@newsmth。

用planner安排日程

这里有篇不错的入门文档

安装planner

在我的机器上只需要 apt-get install planner-el即可,非Debian的系统也不麻烦。

接下来要配置.emacs文件。

;;;planner
(require 'planner)
(global-set-key (kbd "<f12> p") 'planner-create-task-from-buffer)
(setq planner-publishing-directory "~/document/wiki/diary/plan")
;;;;Start planner together with Calendar
(planner-calendar-insinuate)
(setq planner-calendar-show-planner-files t)

常用快捷键

查询任务
M-x plan      查询所有未完成的工作
M-x planner-goto-today        查询当天未完成的工作

添加任务         C-c C-t或者M-x planner-create-task-from-buffer

标记任务完成     C-c C-x或者M-x planner-update-task

修改任务描述     M-x planner-edit-task-description

重新安排一个任务   C-c C-c

重新安排多个任务   区域选定后M-x planner-copy-or-move-task

Change a plan of task     M-x planner-replan-task

Delete a task             M-x planner-delete-task

Reordering task    M-p 升序  M-n 降序

修改优先级         C-M-p 提升;C-M-n 降低

以下是从info中复制过来的

Ideas for using planner more effectively:

Add `(plan)' to the end of your `~/.emacs' so that you are reminded about your tasks every day.

Bind useful functions to shortcut keys and get used to creating tasks and notes from anywhere.

Think about how you plan your day and look for ways to improve it. Ask the mailing list for tips.

Browse the rest of this manual, the source code, and other resources on the Net for tidbits you can use.

Have fun!

Useful functions outside planner buffers:

`planner-create-task-from-buffer'

`remember'

`planner-goto-today'

`planner-goto'

`plan'

Useful functions inside planner buffers:

`C-c C-t' (`planner-create-task-from-buffer')

`C-c C-x' (`planner-task-done')

`M-x planner-edit-task-description'

`C-c C-c' (`planner-copy-or-move-task'), `M-x planner-copy-or-move-region'

`M-x planner-replan-task'

`M-x planner-delete-task'

(`planner-raise-task') and (`planner-lower-task')

(`planner-raise-task-priority') and (`planner-lower-task-priority'),

`planner-replan-note'

`planner-update-note'

--
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: