Emacs指北(做一个搬运工好累)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tham_/article/details/75313481

从一个简单的emacs入门教程说起

一个不知道怎么描述的emacs教程

img

一个简单的介绍

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很难吗

很多人可能看过这张各编辑器学习曲线图img与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使用的键盘上,这些键是真实存在的img

关于快捷键,如果看得懂英语,还是看下面这个 官方参考吧。 不然就看我总结的,不过只有常用的。实际上快捷键有上千个,你能记住也许可以 去参加世界记忆大赛,如果你和我一样记不住,那还是记住常用的,其他的用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回车就进入了调试模式。

  • 界面如下:

123_thumb[2]

不同的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

设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。 
其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编,可以不予理会此用法。

  b <行号> 
  b <函数名称> 
  b *<函数名称> 
  b *<代码地址>

run 开始调试程序   r
continue 继续执行被调试程序,直至下一个断点或程序结束。   c
clear 删除特定行的断点   clear <行号>
delete 删除断点,编号从1开始   d <编号>
next line 执行一行源程序代码,此行代码中的函数调用也一并执行。   n
step line 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数   s
until 结束当前循环   until
print 可以检查各个变量的值,数组的值,以及函数等 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


猜你喜欢

转载自blog.csdn.net/tham_/article/details/75313481