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的一些常识:
Normal模式
按- k、j、h、l:向上、下、左、右移动光标
- x:删除光标所在字符
- dd:删除光标所在行
- i:进入插入模式,在光标前面插入字符
- a:进入插入模式,在光标后面插入字符
- v:进入可视模式,按字符选择
- V:进入可视模式,按行选择
-
:进入可视模式,按矩形选择 - u:撤销
- y、p、x:复制、粘贴、剪切
- “+y、”+p、“+x:从系统粘贴板复制、粘贴、剪切
- :o filename:打开filename
- :w:保存
- :w filename:保存为filename
- :q:退出当前窗口,若只有一个窗口就退出vim
- :wq:保存并退出
- :!command:执行shell命令command
- :colorscheme solution:更换颜色方案为solution
- :new:新建一个水平窗口
- :vnew:新建一个垂直窗口
- :close:关闭当前窗口
- :w!、:q!、:wq!:同:w、:q、:wq,但是强制执行。
Insert模式
在Normal模式下按a或者i就可以进入Insert模式。在Insert模式下,可以随意地增加字符、用Visual模式
Visual模式允许我们选择一段文字(可以是几个字符、一整行、一整个矩形),这对于大段文字的移动很好用。
在Visual模式下,hjkl可以用,这点很好。
选中了后要删除,x就可以了。复制粘贴剪切同Normal。vim’s windows
vim也提供了窗口管理,可以在一个vim中打开多个窗口。新建、关闭如Normal中所讲。还有一些调整窗口的命令(在Normal下):-
h/j/k/l:移动到左/下/上/右边的窗口 -
+:增加窗口大小 -
-:减少窗口大小
gdb
有装fp/lazarus/anjuta等IDE的系统都是有gdb的,实在寒酸得没有的继续sudo apt-get install gdb。
gdb启动的时候如果在后头跟上一个可执行文件的路径,那么gdb就会自动装载这个文件,比如:
$ gdb rqnoj29
这样gdb启动的时候就载入了rqnoj29这个程序了。
直接$ gdb 也是可以的,当然,要用file 来载入文件。下面列出gdb的常用命令:- (l)list [n]:列出第n行附近的10行代码,如果不带参数则从上次的位置继续列出10行。
- (b)breakpoint n:设置断点停在第n行
- (r)running:运行程序
- (p)print expr:显示表达式expr的值(如同watch)
-
(n)next:单步(不进入过程函数),等同于fp-ide中的
-
(s)step:单步(进入过程函数),等同于fp-ide中的
- (bt)backtrace:显示栈信息,等同于fp-ide中的Call Stack
- (c)continue:继续运行程序(到下一个断点会停住)
- (d)delete [n]:删除第n个断点,如果不带参数则会提示是否删除所有断点
- file filename:载入filename
- display expr:在每一次程序被中断后,自动显示表达式expr的值
- delete display [n]:删除第n个自动显示,如果不带参数则会提示删除所有自动显示
- Ctrl+L:清屏
- 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的组合的~!