Console+vim+gdb初体验

背景

由于现在学校的电脑不是特别好(当然也不至于特别烂),运行起Ubuntu有点卡,加上Lazarus watch数组的时候总是以字符数组显示(也就是a = #0#0#0#0之类的),因此决定果断放弃Lazarus,直接用gdb。当然,抛弃了Lazarus,就得用记事本了,我早就想试试vim了,所以vim+gdb已成定局。另外我发先,在窗口模式下切换窗口有点慢(- -||),因此console+vim+gdb的组合就出现啦~!

本文是我一个多星期以来使用console+vim+gdb的心得体会,要获得各个部分的完整指南可以参照各个软件的说明书以及Google之。

console

Ubuntu默认开了6个tty,用Ctrl+Alt+Fx(x=1..6)切换,其中Ctrl+Alt+F7切换到X Window。我的习惯是tty1开vim,tty2开gdb。你可以试试,console的切换是很快的。

Ubuntu 10.04以上(貌似9.10开始就有了)进入系统后,console的分辨率会自动调整到显示器的最佳分辨率,这点很方便,我们一般就不用操心了。之前还要在grub中加vga参数,而且弄得很乱。

另外,要显示中文的话可以安装zhcon,对于Ubuntu 10.04以上,源里面的zhcon还是很好用的。安装好了可以直接输入zhcon进去,一般不会乱码之类的(我记得以前还得加上–dev和–utf8选项,现在就不用那么麻烦了)。zhcon中还有中文输入法,按Ctrl+0~9切换。

vim

早就听说过vim的大名了,而且是“专家”级别的编辑器(^_^夸大了)。确实,以前打开vim根本都不知到怎么输入文字,更别说命令了。现在既然要和vim一起走过,那就得慢慢了解它了。我知道vim有许多高级的特性是gedit/notepad等比不上的,但是一步登天是不太现实的,因此我决定,先把vim当作是普通的记事本,再慢慢研究!事实证明,这招也确实有用。

咱还是菜鸟,所以安装就不选择从源码编译的方式了,直接sudo apt-get install vim,如果要gvim可以选择vim-gnome。

拿到vim,还是得一番小小的配置的,修改~/.vimrc(没有就创建),下面列出我的.vimrc,感觉这些都是比较常用的。
"去掉vi兼容性
set nocompatible
"显示行号
set number
"语法高亮
syntax on
"自动缩进
set autoindent
"缩进2字符
set tabstop=2
set shiftwidth=2
"匹配括号
set showmatch
"显示状态
set ruler

"F9编译pascal程序,打开检查,生成GDB调试信息
map  :w:!fpc -CiorRt -g %

修改.vimrc后要重启vim才能生效。

vim的一些常识:

表示xxx键,表示Ctrl+x

Normal模式

或者可以回到Normal模式(默认也是Normal模式)。在Normal模式下,不能插入,但是能够通过命令来修改文本,或者执行功能。常见如下:
  1. k、j、h、l:向上、下、左、右移动光标
  2. x:删除光标所在字符
  3. dd:删除光标所在行
  4. i:进入插入模式,在光标前面插入字符
  5. a:进入插入模式,在光标后面插入字符
  6. v:进入可视模式,按字符选择
  7. V:进入可视模式,按行选择
  8. :进入可视模式,按矩形选择
  9. u:撤销
  10. y、p、x:复制、粘贴、剪切
  11. “+y、”+p、“+x:从系统粘贴板复制、粘贴、剪切
输入:后面跟着命令就可以执行vim的一些命令,下面是我常用的:
  1. :o filename:打开filename
  2. :w:保存
  3. :w filename:保存为filename
  4. :q:退出当前窗口,若只有一个窗口就退出vim
  5. :wq:保存并退出
  6. :!command:执行shell命令command
  7. :colorscheme solution:更换颜色方案为solution
  8. :new:新建一个水平窗口
  9. :vnew:新建一个垂直窗口
  10. :close:关闭当前窗口
  11. :w!、:q!、:wq!:同:w、:q、:wq,但是强制执行。

Insert模式

在Normal模式下按a或者i就可以进入Insert模式。在Insert模式下,可以随意地增加字符、用/删除字符、用上下左右箭头移动光标(是的,Insert模式下hjkl是不可以用的- -!!)。要退回去Normal模式也很简单,或者都可以。

Visual模式

Visual模式允许我们选择一段文字(可以是几个字符、一整行、一整个矩形),这对于大段文字的移动很好用。

在Visual模式下,hjkl可以用,这点很好。

选中了后要删除,x就可以了。复制粘贴剪切同Normal。

vim’s windows

vim也提供了窗口管理,可以在一个vim中打开多个窗口。新建、关闭如Normal中所讲。还有一些调整窗口的命令(在Normal下):
  1. h/j/k/l:移动到左/下/上/右边的窗口
  2. +:增加窗口大小
  3. -:减少窗口大小
每个窗口可以独立地执行命令而不影响到其它窗口。

gdb

有装fp/lazarus/anjuta等IDE的系统都是有gdb的,实在寒酸得没有的继续sudo apt-get install gdb。

gdb启动的时候如果在后头跟上一个可执行文件的路径,那么gdb就会自动装载这个文件,比如:

$ gdb rqnoj29

这样gdb启动的时候就载入了rqnoj29这个程序了。

直接$ gdb 也是可以的,当然,要用file 来载入文件。下面列出gdb的常用命令:
  1. (l)list [n]:列出第n行附近的10行代码,如果不带参数则从上次的位置继续列出10行。
  2. (b)breakpoint n:设置断点停在第n行
  3. (r)running:运行程序
  4. (p)print expr:显示表达式expr的值(如同watch)
  5. (n)next:单步(不进入过程函数),等同于fp-ide中的
  6. (s)step:单步(进入过程函数),等同于fp-ide中的
  7. (bt)backtrace:显示栈信息,等同于fp-ide中的Call Stack
  8. (c)continue:继续运行程序(到下一个断点会停住)
  9. (d)delete [n]:删除第n个断点,如果不带参数则会提示是否删除所有断点
  10. file filename:载入filename
  11. display expr:在每一次程序被中断后,自动显示表达式expr的值
  12. delete display [n]:删除第n个自动显示,如果不带参数则会提示删除所有自动显示
  13. Ctrl+L:清屏
  14. Enter:重复上一命令

gdb还支持简写,如上面括号所标识。有意思的是gdb会智能地领会你的意思。比方说第一次你执行r < in.txt,第二次你只需要一个r,gdb就会自动执行r < in.txt,这对于做OJ特别方便。而第一次运行l 1,接下来输入l或者回车,gdb就会输出接下来的10行而不是再从头开始。

解决watch数组默认以字符数组的形式显示的方法就是手动指定显示的方式,再p或者display后面加上/d就指定了以10进制有符号整数来显示,如:display /d a

要调程序的话,先b xx设个断点,然后r,gdb会把程序停在断点处。接下来可以s或者n或者p或者display……如果需要继续运行可以c,gdb回停在下一次断点。每一次停下来的时候会显示一行你程序的代码,表示当前停在哪一行(还未执行)。如果你有display则下面会有相应的表达式。有时候感觉很乱应该果断地清屏~!

直接gdb调程序可能回比较累,刚开始的时候回很不适应,跳来跳去不知到是再哪一行,但习惯了就好了。gdb还有一些更高级的使用方法,因为还不是很了解就先不写出来了。

展望

接下来就要掌握vim和gdb的一些高级点的小技巧了,搞定在console下看题目(OJ比较好办,lynx拿下;就是doc这个……)

我相信console+vim+gdb还是很NX的组合的~!

Comments