一个不知道怎么描述的emacs教程
一个简单的介绍
emacs[/ˈiːmæks/]是地球上的编辑器中最像操作系统,操作系统中最像编辑器的编辑器,按照elisp intro的说法,emacs 是一个可拓展计算环境(extensible computing environment),这一点,如果 学过elisp,可以深刻的体会到。
靠着elisp这种强大的拓展语言,emacs几乎无所不能,也许你也早有耳闻,写邮件,玩游戏,上网, 聊天,文件管理,计算器,写日记,看日历,强大的org-mode,甚至还能煮咖啡!(这需要一台支持 超文本咖啡传输控制协议的咖啡机才行,这本来是一个愚人节笑话,但是据说真有人做出来了, 不过网上的资料还是很少,我也没去求证)。emacs甚至可以变成一个不太好用的平铺式窗口管理器 (我使用过,所以才说不太好用)。这也是为什么emacs也被称为神的编辑器的原因。
emacs由Richard Stallman发明,据说他在MIT的人工智能实验室工作期间,去了别的大学(斯坦福), 看到一个所见即所得的编辑器(他们自己使用的类似vi这种分模式编辑),非常喜欢,回来就和他的好基 友一起写了一个出来,并使用了elisp进行拓展。很快就在实验室流行开来,许多人贡献了代码(或者称为宏) 。宏即macros,所以emacs 是 editor macros的缩写。
关于我和这个教程
写这个教程的时候我使用emacs 2年,也学习了elisp。自认为不是什么高手。所以不能带你成为 高手。想指望看一篇教程就精通emacs,这是不可能的,修行还是在个人。最全面的学习方法还 是看官方的文档(C-h i
),但是内容相当之多,而且大多数没有中文版本,很费时费力。我也没有看完。 遇到问题查查看,大多数的解决问题的办法都在emacs wiki里——一个社区维护的wiki。
学emacs很难吗
很多人可能看过这张各编辑器学习曲线图与emacs齐名的vim的学习曲线一直保持着同一高水平,我自己也学过vim,我觉得这个图还挺合理, 但是emacs是一个神奇的螺旋线,旨在表达emacs学起来的谜之困难。实际上,并不是这样,就第一次使用来说 ,emacs和vim的曲线要倒过来,打开了vim结果半天打不出字,还不时有哔哔声,好像要爆炸?而emacs就不 一样,打什么字就显示什么。不过当你要退出emacs的时候,却需要 C-x C-c
,即ctrl+x,ctrl+c
,这看起来 简直爆炸,为什么退出要两个组合键,是因为所见即所得,所以操作上就必须避免与输入重复,于是用ctrl结合的一系列 组合键就诞生了。而vim也好不到哪里去,冒号,q,感叹号,回车。这不是比emacs还复杂么。其实emacs并不是很难学, 看完官方入门教程,很快就可以上手,学习曲线也基本持平,后期还会下降。
准备工作
首先你得装上emacs,不然还学什么啊。如果你用的是windows,大概你永远都不会需要使用emacs,而且emacs 在windows下有很多问题。如果你用的是mac或者GNU/Linux,那么你一定知道怎么安装,所以我就不多说了。 然后最好把ctrl和caps lock交换位置,不同的系统有不同的方法,我用的是外接键盘的编程功能,GNU/linux可以 用Xmodmap修改,因为ctrl键会被大量的使用,如果一直用左下角那个ctrl键,小拇指很快就会受不了。也可以用手 掌压ctrl。使用emacs,我推荐使用C/S模式(即client/server),因为配置多了以后emacs启动很慢很慢,在机械硬盘 上启动我的emacs要10s,ssd也要1.6s。一种方法是开机的时候自动启动,但是这样会拖慢开机的速度。好的做法是 第一次打开的时候自动启动server,这样既不会拖慢开机速度也不会影响emacs的启动。在你的shell的配置文件中加 入如下内容即可。
export ALTERNATE_EDITOR=""
一个方便的alias也是很好的,日常使用emacs的频率非常之高,我选择这样做
alias e="emacsclient -nw"
-nw选项的作用是不启动x版本而启动终端版本,尽管图形版本对主题的显示完美支持(如果你像我一样使用终端版本, 只有少数主题对终端显示做了适配,大多数主题显示一团糟),但是对输入法的设置却是很玄学的,打不了中文很无奈 ,而且不方便在终端下使用。
另外最好看一遍emacs自带的入门教程,不会花很长的时间,C-h t
即可查看,这里没有捷径可走,这些使用频率非常高 的操作还是不要指望不记忆靠M-x
打出来了。
一些基本知识与操作
buffer/window/frame
frame是最根本的东西,windows构建在frame之上,而buffer是把文件读入内存后显示的内容,所以其实 你是对内存里的内容进行编辑,直到保存的时候才写入文件。这么说可能不太直观。用比喻的说法,frame 就相当于桌面,而window就相当于打开的窗口,buffer则是窗口的内容。
major mode/minor mode
每一个buffer打开之后,emacs都会选择一个major mode还决定编辑的模式,同时会有很多的mimor mode进行辅助,如果不 自己写一个mode,几乎不需要了解这方面的知识,因为这些emacs都帮你设置好了。
kill-ring
所谓kill-ring就是从buffer里kill掉的内容放置的地方,就相当于回收站。从技术的角度来讲kill ring 是一种数据结构的应用,那就是stack了,也就是LIFO(last in, first out),不过和栈不同的是,kill ring的内容并不会从kill ring里删除,你可以循环选择下一个内容。kill ring是所有buffer共享,所以可 以从一个buffer复制到另一个buffer。
快捷键
- C – Ctrl
- M – Meta(alt或者esc)
- S – super(几乎用不到)
- s – shift(几乎用不到)
不是emacs造出这样的名称,实际上在lisp machine使用的键盘上,这些键是真实存在的
关于快捷键,如果看得懂英语,还是看下面这个 官方参考吧。 不然就看我总结的,不过只有常用的。实际上快捷键有上千个,你能记住也许可以 去参加世界记忆大赛,如果你和我一样记不住,那还是记住常用的,其他的用M-x
来 做,装上helm或者smex后,M-x
会变得很方便,可以很快速的找到命令。
基本快捷键 | 作用 |
---|---|
C-f | 光标向前移动 |
C-b | 光标向后移动 |
C-n | 光标向下移动 |
C-p | 光标向上移动 |
C-a | 移动到行首 |
C-e | 移动到行尾 |
M-f | 向前移动一个单词 |
M-b | 向后移动一个单词 |
M-a | 移动到句首 |
M-e | 移动到句尾 |
M-{ | 向上移动一个段落 |
M-} | 向下移动一个段落 |
M-< | 移动到buffer的第一个字符处 |
M-> | 移动到buffer的最后一个字符处 |
C-d | 删除当前字符,放入kill ring |
M-d | 删除一个单词,放入kill ring |
C-w | 删除选中的内容,放到kill ring |
M-w | 将选中内容放入kill ring |
C-y | yank kill ring顶端的内容 |
M-y | 循环yank kill ring的内容 |
C-k | 删除当前行,放入kill ring |
C-/ | undo |
C-v | 向下翻页 |
M-v | 向上翻页 |
C-l | 调整当前行在屏幕的位置(顶部/居中/尾部) |
C-x C-f | 打开文件 |
C-x b | 切换buffer |
C-x C-s | 保存文件 |
C-g | 取消命令 |
M-x | 输入一个命令并执行 |
M-; | 注释选中内容/未选中任何内容则在行末添加注释 |
C-u | 为支持universal参数的函数提供参数 |
C-s | 正向搜索 |
C-r | 反向搜索 |
M-% | 交互式搜索替换 |
M-u | 将下一个单词变为大写 |
M-l | 将下一个单词变为小写 |
C-x ( | 开始录制宏 |
C-x ) | 停止录制宏 |
C-x e | 执行上一个宏 |
C-x 3 | 在右边创建一个window |
C-x 2 | 在下面创建一个window |
C-x 1 | 关闭除当前window以外的所有window |
C-x 0 | 关闭当前windows |
C-x { | 缩小当前window |
C-x } | 扩大当前window |
C-x o | 切换到下一个window |
C-x z | 重复上一条命令,连续按z可以继续重复 |
需要说明的几点:
- C-g是很重要的按键,有时候不知道按了什么键,想取消,就按C-g,有时会需要按多次,因为C-g也可能是组合键的一部分
- 记这些快捷键的时候可以
C-h k
然后按快捷键,查看它绑定的函数,根据英文意思来记,最基本的n/p/b/f 其实就是next/previous/backward/forward - yank的意思是猛拉,就效果来说理解成粘贴也不成问题,因为年代过于久远,术语也不一样了
- 为什么没有redo呢?如果你想redo,随便输入一个字符,再undo就好了,自己尝试一遍就知道是怎么回事了
- 搜索的时候继续按
C-s/C-r
就可以移动到下/上一个匹配处。更高级的搜索可以M-x search-forward-regexp
用正则表达式来匹配 - 缩小和扩大window的幅度是很小的,如果不想每次都狂按麻烦的组合键,只需重复命令,按住z就好了。不过这种窗口管理的功能完全可以用窗口管理器代替,而且使用C/S模式后共用一个server,也能做到不同窗口之间的通信
- universal 参数一般用来重复N次命令:
C-u N command
,但是命令必须支持universal参数才行
elisp简介
写在前面
elisp(emacs lisp)是一种lisp方言,与common lisp有交易(借鉴)。lisp全称list processor,即表处理器。 表是一种数据结构,这里的表按国内的术语叫作广义表。lisp本来只是John McCarthy发明的一种表示 法,然后他的学生看了论文后,脑洞大开,在IBM 704上写了第一个lisp解释器,许多奇怪的的关键字(例如car 和cdr)和函数名就是从这个IBM机器里来的。
那么elisp有什么用?作为用户大概学elisp只是为了学会配置自己的emacs,但是实际上即使学会了,大 多数的配置还是复制粘贴,区别在于如果出了问题,你会有一定的debug能力。然后elisp的作用当然就是 写插件了。
快速学会语法 or 看懂配置文件
elisp或者说lisp一个显著的特点就是有很多的括号,这一点不知道吓退了多少人,其实lisp的语法很简单。 lisp顾名思义,要处理的是表,而表的表示就是用括号来表示。()
这样的是空表。表里的元素可以是原子, 也可以是一个表。总之就是我们常说的广义表了,说广义只是为了和链表区别开来。在英文里广义表是list (其实叫表就好了啊),而链表是linked list。elisp是动态语言,不需要声明就能使用变量。
(quote a)
('a)
上面的两行是一个意思,单引号’是quote的语法糖, 实际的代码很少用quote这种写法,毕竟程序员都喜欢偷懒,这个操作将返回变量a指向的对象。在配置文件里,经常看到
(setq variable value)
他等价于
(set 'variable value)
作用都是赋值,把value赋给variable,setq的q就代表quote,于是变量名就不需要再引用了。'a
和a
是不一样的,前者是a本身,而后者是a的值。上面两句其实是下面这个普遍通用用法的特例。
(function-name argument1 argument2 ...)
表里的第一个元素会被解释为函数,参数只要跟在后面就好了,不需要使用括号把参数括起来,
还有几个最基本的操作
- car 取表头元素
- cdr 取除表头元素的剩余元素但仍是一个表,读法为coulder
- if 条件判断
- cond 多条件判断即condition
例如:
(car '(a b c)) ;;将返回a本身
(cdr '(a b c)) ;;将返回(b c)
(if predict ;;predict即测试条件,是一个值,也就是表达式
true-action ;;条件为真执行
false-action) ;;否则执行
(cond (predict1 action1) ;;相当于case
(predict2 action2)
...)
(在lisp里t
代表true, nil
代表false)
以及算术运算+ - * / % ,与其他语言几乎一模一样,但不一样的是要用逆波兰表示法来写,也就是前缀表示法
(/ 20 (* 4 ( + 1 2 (- 6 5))))
切换到scratch buffer,可以在这上面写任何东西,这个buffer的内容在退出时清空,不做保存。然后把光标移动 到右括号处,按下C-x C-e,可以在下面的MINI buffer中看到求值结果,在我的环境里值是1。不光scratch可以求值 ,你可以在任何buffer里写elisp,都可以在里面求值。
还有一个配置里经常出现的块
(defun function-name(arguments-list)
"documents"
(interactive)
(...))
用来定义函数,加上(interative)
对表达式求值后,可以在M-x里面找到你的函数,相当于命令,实际上emacs的所有 命令都是这样的函数
不管多长的elisp代码,都会返回一个值,术语evaluate表示求值,但我们需要的常常是求值时带来的side effect。 虽然称之为副作用,但其实大多数时候求值只是作为更大的函数调用的一环,而这些副作用才是我们想要的。emacs的 配置文件,不管是单一的.emacs文件,还是模块化的init.el的配置,都是在emacs启动的时候对文件的内容进行求值, 通过求值的副作用来完成设置。在C/S模式里,修改了配置文件后不会自动生效,因为配置只在server启动的时候进行 求值,一个方法是kill掉server重新启动,如果不想这样麻烦,可以在配置文件界面M-x eval-buffer
对buffer进行求 值。
有了以上这些基本上就可以读懂配置文件了,但是还是会遇到一些不知道有什么作用的函数。 这时候只要把光标移动到函数名后面,按下C-h f
就可以查看这个函数的文档,同样的道理C-h v
可以查看变量的文档。
想要更深入的了解elisp,我推荐读elisp intro,它集成在emacs的info里,可以通过C-h i
然后选择elisp intro来阅读, 由于是在emacs里阅读,所以所有的代码都可以立刻自行求值,不需要自己手打一遍代码,是不是感觉很爽,至少当时我是 这么觉得。看elisp intro并不需要很长的时间,我用划词翻译只花了3天时间,每天大概8小时。相当于一本300页的英文 书。当然也有中文版,而且是出版的书籍,只是内容跟不上了,在info里可以看到最新版。也可以看看李杀写的 实用教程或者水木社区的elisp简明教程 。
基本设置与插件推荐
默认的emacs可以说啥都没有,内置的很多插件如果你不在配置里显式的开启,就会像没有安装一样。因此可以迅速地启动。 配置文件时~/.emacs或者~/.emacs.d/init.el(用这个加载其他模块)。如果你的配置并不多,直接用.emacs就可以了,做 备份也更方便,多了以后才考虑模块化配置。
基本设置
;;关闭菜单栏,菜单栏没什么用。
(menu-bar-mode -1)
;;关闭启动画面,直接进入scratch
(setq inhibit-startup-message t)
;;显示行号,文件大小
(line-number-mode t)
(column-number-mode t)
(global-linum-mode t)
(size-indication-mode t)
;;全局语法高亮
(global-hl-line-mode t)
;;括号匹配
(show-paren-mode t)
(setq show-paren-style 'parentheses)
;;自动再文件尾部加上换行符,可以避免一些问题
(setq require-final-newline t)
;;把 "yes or not" 换成 "y or n"
(fset 'yes-or-no-p 'y-or-n-p)
;;取消自动保存
(setq auto-save-default nil)
;;取消自己备份
(setq make-backup-files nil)
;;行号格式
(setq linum-format " %i ")
添加软件包源
首先要添加一个源,才能装插件,默认的源是gnu官方源,包数量有限,一个流行的源是melpa,在配置文件中 加入如下内容。
(require 'package)
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
不过在国内访问melpa有点慢,我继续用的原因是包不会很大,时间可以接受,而且能保证最新,如果嫌慢,可以用 镜像源,比如清华的。
添加之后就可以安装插件了,在M-x package-list-package
可以管理插件,按i
标记为安装,d
标记为删除,标记完就 可以按x
执行了,如果要升级插件,按U
(大写)。这样操作有时候不太方便,M-x package-install
可以直接安装一个 包,M-x package-delete
可以删除一个包。但是用这种方法安装有时候会找不到文件,原因是你的包缓存还是以前的, 而执行package-install
不会刷新缓存,这时候要M-x package-refresh-contents
。这些操作基本就够用了。
插件推荐
- auto-complete – 代码自动补全,可以代替的有company
- yasnippet – 代码模板
- ace-jump – 光标快速跳转,熟练以后,大概比鼠标还快
- neotree – 国人做的树形目录
- rainbow-delimiters – 根据括号嵌套深度显示不同颜色
- window-numbering – 在窗口中快速跳转
- helm – 这个插件有一波狂热的追随者,我也是其中之一,相当好用,具体还是看看官方示例
- smart-compile – 智能编译,对于单个文件,可以快速地调用命令进行编译,练习编程时很有用
- flycheck – 语法检查,不知道帮我挡掉了多少语法错误
- iedit – 对多个同样的区域进行编辑,有时候很有用
- eletric-pair-mode – 自动括号,可以有效避免括号不匹配
- undo-tree – 显示undo树.在undo和redo多了以后可以很方便的回到想回去的地方
- anzu – 显示更好的搜索信息
- aggresive-indent – 一直保持着缩进,写代码很有用
- highlight-indent-guides – 显示对齐的直线,写代码有用
关于如何使用这些插件,需要看看官方的文档,一般都是在github上,设置都是很类似的。
主题
由于我在终端下使用,要支持256色,需要在shell配置文件加入如下内容
export TERM=xterm-256color
我使用的主题是ample,但是字符串的颜色和变量颜色过于接近,我做了如下修改
(with-eval-after-load "ample-theme"
(custom-theme-set-faces
'ample
'(font-lock-string-face ((t (:foreground "#9999cc"))))))
把字符串颜色改成了淡蓝紫色,在bash脚本里效果明显。 主题的预览可以在这里找到,如果你使用图形版,所有的主题你都能 正常的使用,终端用户的主题中monokai, ample, tomorrow显示效果是最好的。
org-mode
学习emacs的时候,一定会听说org-mode有多么的强大,能安排事务,做计划,画表格,做笔记。为此痴狂的人,emacs 甚至成为了他们生活的一部分。实际上,org-mode在emacs上是一种mode,但独立于emacs是一种标记语言,类似markdown ,只是org是在emacs上渲染,直接在emacs上显示。但是org也被越来越多的平台支持,如github,各种静态网页生成器。 但是org-mode在终端下比在图形下难用很多,因为终端无法支持它的组合键,对于我这样在终端下使用的人来说,用起来 比在图形下麻烦一点,在我学markdown之前,我用他来写github 的 README,效果还不错。其实学不学都可以,学习也不 会花很长的时间,他就像markdown一样容易地学习。强大的地方是能直接在emacs上将org导出成html,md,甚至是pdf。
把emacs作为elisp解释器
从emacs22开始,emacs就支持把emacs作为一个解释器使用,这意味着你可以像写bash脚本一样地来写emacs脚本。在文件的 开头加入如下内容即可
#!emacs --script
hello world程序则再加一行
(message "hello world")
赋予执行权限,执行就能看到结果了。虽然emacs支持了这样的功能,而且elisp也是一种强大的语言,但是至今都很少有人用 emacs scrpit来解决问题。首先用emacs的人就很少,其中深入了解emacs的人更少,也很少有人提到emacs的这个功能,我也是 突发奇想,想造一个elisp解释器,然后一搜,才知道是一个轮子。
后记
写这个教程主要目的就是要提高博客的点击量,其次也算一种笔记,顺便有一些高尚一点的理由。现在 用vim的人比emacs多太多了,国内几乎就是vim的天下,原因无非是经典的linux教材只教了vim(比如鸟 哥的书),很多人先入为主,对emacs只是用一下就放弃了,所以我想多少为平衡编辑器的战斗做点贡献 ,很惭愧,就做了一点微小的工作,谢谢大家。
Linux下的GNU Emacs 24命令_信息竞赛常用
C代表Ctrl,M代表Alt
一、文件命令
C-x b 新建 build
C-x C-f 打开文件 find
C-s 保存文件 save
C-x C-w 另存为 为wei w
C-x C-b 打开所有窗口列表 表biao b
C-x k 删除窗口 kill
C-x C-z 最小化Emacs 最zui z
C-x C-c 关闭Emacs close
二、窗口命令
C-x 2 水平分割窗口
C-x 3 垂直分割窗口
C-x 0 关闭当前窗口
C-x o 切换至其它窗口
C-x 1 关闭光标所在处以外的所有窗口
三、编译运行程序
首先 M-x eshell 打开 eshell 窗口
输入:g++ 文件名.cpp -o 文件名 编译程序
如:g++ test.cpp -o test
输入:./文件名 运行程序
如:./test
工作目录默认在 /home 下
如果想中断运行 M-x eshell-kill-process
四、调试程序
若要调试程序,需在编译时
输入:g++ 文件名.cpp -g -o 文件名
如:g++ test.cpp -g -o test
此处的 -g 代表把程序加载入 gdb
M-x gdb 打开 gdb 窗口,直接回车
gdb内命令可仅用首写字母代表(clear除外)
break 设置断点
b <行号>
b <函数名称>
run 开始调试程序 r
clear 删除断点
clear <行号>
clear <函数名称>
next line 进入下一步,会跳过函数 n
step line 进入下一步,不会跳过函数 s
print 打印变量,常量,函数等的值
p <名称>
quit 退出调试 q
如需中断当前运行 M-x gdb-separate-io-interrupt
如需查看局部变量,可使用:
gdb-many-windows 切换单窗格/多窗格模式
如需查看全局变量,先用将变量选中,然后输入:
M-x gud-watch 查看变量
此命令也可查看局部变量,但是不如多窗格模式好用
Emacs 是一个十分强大的编译器,特别是它的 M-x 里可以输入各种命令,有兴趣可以去挖掘探索
参考资料:
http://www.cnblogs.com/qlwy/archive/2012/06/04/2535297.html
http://blog.chinaunix.net/uid-26354188-id-3195392.html
比赛时的 Emacs 配置
追求在最少的行数中实现必要的功能.
(set-background-color "#1B1D1E")
(set-foreground-color "white")
(tool-bar-mode 0)
(menu-bar-mode 0)
(scroll-bar-mode 0)
(winner-mode t)
(show-paren-mode t)
(global-set-key (kbd "RET") 'newline-and-indent)
(global-set-key (kbd "C-h") 'backward-delete-char)
(global-set-key (kbd "M-h") 'backward-kill-word)
(defun myc++()
(setq c-basic-offset 4)
(linum-mode t)
(c-toggle-hungry-state t)
(defun compile-and-run ()
(interactive)
(setq file-name (file-name-nondirectory buffer-file-name))
(compile
(format "g++ %s -o %s -g -O2 -Wall -Wextra -Wshadow && time ./%s "
file-name
(file-name-sans-extension file-name)
(file-name-sans-extension file-name))))
(local-set-key (kbd "C-c C-c") 'compile-and-run)
(local-set-key (kbd "C-c C-k") 'kill-compilation))
(add-hook 'c++-mode-hook 'myc++)
Emacs中学习gdb调试
1. 编译
-
首先,编辑好c++程序(以c++例),如test.cpp
-
然后,编译
M-x compile
,把那一行命令改成g++ test.cpp -g -o test
,参数“-g”是为了加入调试信息。要不然后面的调试不成功。
2.进入gdb
-
直接
M-x gdb
-
显示gdb –annotate=3 test回车就进入了调试模式。
-
界面如下:
不同的annotate 的值不代表不同的模式:
-
annotate = 0是最基本的模式和在命令行使用gdb完全一样。
-
annotate = 1是单步调试模式,出现上下两个窗口,上面是gdb运行的buffer,下面是你代码的buffer,会在代码 buffer中,同步指示当前运行的语句的位置。
-
annotate = 2是产生注解的模式。
-
annotate = 3是信息最完整的模式。此时的 Emacs 分5个 buffer,从上到下、从左到右依次是:gdb 调试窗口、变量实时变化显示窗口、源代码窗口、栈窗口、断点信息
无论上面的那种情况,都出现了一个现象:程序的输出不能显示,只有在程序退出的时候才显示出来。
gdb-many-windows 切换单窗格/多窗格模式
gdb-restore-windows 恢复窗格布局
3. 调试
常用的调试命令,可以简写
命令 | 意义 | 用法 |
list | 从第一行开始列出源码(默认10行) | l l 3 (开始行) |
break | 设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。 |
b <行号> |
run | 开始调试程序 | r |
continue | 继续执行被调试程序,直至下一个断点或程序结束。 | c |
clear | 删除特定行的断点 | clear <行号> |
delete | 删除断点,编号从1开始 | d <编号> |
next line | 执行一行源程序代码,此行代码中的函数调用也一并执行。 | n |
step line | 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数 | s |
until | 结束当前循环 | until |
可以检查各个变量的值,数组的值,以及函数等 | print p (p为变量名) print $1 ($1为历史记录变量,在以后可以直接引用 $1 的值) 显示数组: p <数组名> 显示数组元素:p <*数组指针> 显示数组int a[N]的特定值: ① p *a@10 ② p (int [10])*10 |
|
whatis | 可以显示某个变量的类型 | whatis p |
info | 用于显示各类信息 | 如:info b 显示断点信息 info r 寄存器信息 info local 显示当前函数中的局部变量信息 info prog 显示被调试程序的执行状态 |
quit | 退出gdb调试 | q |
本文参考,特此声明:
http://fanqiang.chinaunix.net/program/other/2006-07-14/4834.shtml
http://blog.csdn.net/liigo/article/details/582231
http://www.cnblogs.com/dodolook/archive/2011/05/31/2064363.html