Linux下使用vim编辑C程序
这几天在系统能力班自学linux,加上最近大数据课上开始使用linux,我在这里总结一下,linux下使用vim编辑c程序的一些问题。
大数据课上是直接使用micro来编辑的,我这里只是简单的说明一下vim的一些基本使用方法,毕竟我也是刚开始接触。
主要内容来自系统能力班老师们准备的资料,图片是我自己实验的截图。by from deepin 13.
1 vi/vim使用
1.1 vi/vim简介
vi/vim是Linux、Unix字符界面下常用的编辑工具,也是系统管理员常用的一种编辑工具。很多Linux发行版都默认安装了vi/vim。vim是vi的升级版,和vi的基本操作相同,其相对于vi的优点主要在于可以根据文件类型高亮显示某些关键字,如C语言关键字,便于编程。
vi/vim有两种状态:命令状态和编辑状态。
1)命令状态:可以输入相关命令,如文件保存、退出、字符搜索、剪切等操作;vi/vim启动时,默认进入命令状态。在编辑状态下,按ESC键,即可进入命令状态;
2)编辑状态:在该状态下进行字符编辑。在命令状态下,按i/a/I/A/O/o等键即可进入编辑状态。
1.2 vim安装
如果Linux主机中没有安装vim,请执行以下命令(在Linux主机能访问互联网的情况下):
sudo apt-get install vim

按照提示安装即可。(按Y)
稍等一会直到提示安装完成。

1.3 vi/vim常用命令
表1 vi/vim常用命令(命令状态下使用)
|
命令 |
功能说明 |
|
插入字符、行,执行下面操作后,进入编辑状态 |
|
|
a |
进入插入模式,在光标所在处后面添加文本 |
|
i |
进入插入模式,在光标所在处前面添加文本 |
|
A |
进入插入模式,在光标所在行末尾添加文本 |
|
I |
进入插入模式,在光标所在行行首添加文本(非空字符前) |
|
o |
进入插入模式,在光标所在行下新建一行 |
|
O |
进入插入模式,在光标所在行上新建一行 |
|
R |
进入替换模式,覆盖光标所在处文本 |
|
剪切、粘贴、恢复操作 |
|
|
dd |
剪切光标所在行 |
|
Ndd |
N代表一个数字,剪切从光标所在行开始的连续N行 |
|
yy |
拷贝光标所在行 |
|
Nyy |
N代表一个数字,复制从光标所在行开始的连续N行 |
|
yw |
复制从光标开始到行末的字符 |
|
Nyw |
N代表一个数字,复制从光标开始到行末的N个单词 |
|
y^ |
复制从光标开始到行首的字符 |
|
y$ |
复制从光标开始到行末的字符 |
|
p |
粘贴剪切板的内容在光标后(或所在行的下一行,针对整行复制) |
|
P |
粘贴剪切板的内容在光标前(或所在行的上一行,针对整行复制) |
|
u |
撤销上一步所做的操作 |
|
保存、退出、打开多个文件 |
|
|
:q! |
强制退出,不保存 |
|
:w |
保存文件,使用:w file,将当前文件保存为file |
|
:wq |
保存退出 |
|
:new |
在当前窗口新建一个文本,使用:new file,打开file文件,使用Ctrl+ww在多个窗口间切换 |
|
设置行号,跳转 |
|
|
:set nu |
显示行号,使用:set nu!或:set nonu可以取消显示行号 |
|
n+ |
向下跳n行 |
|
n- |
向上跳n行 |
|
nG |
跳到行号为n的行 |
|
G |
跳到最后一行 |
|
H |
跳到第一行 |
|
查找、替换 |
|
|
/*** |
查找并高亮显示***的字符串,如/abc |
|
:s |
:s/old/new//,用new替换行中首次出现的old :s/old/new/g,用new替换行中所有的old :n,m s/old/new/g,用new替换从n到m行中所有new :%s/old/new/g,用new替换当前文件中所有old |
1.4 vi/vim使用示例
如要编辑当前目录下名为 helloworld.c 的文件:
step1:输入vim helloworld.c,即可进入vim窗口,如helloworld.c不存在,则新建该文件,否则是打开该文件。vim默认处于命令状态。
step2:按i,进入编辑状态。
step3:编辑代码。
step4:按Esc,回到命令状态。
step5:输入 :wq,保存并退出。

1.5 VIM配置
在我们的环境中,为了使VIM更好使用,建议更改vim配置文件:/etc/vim/vimrc文件。
修改时,请使用如下命令:
sudo vim /etc/vim/vimrc

注:请大家对应上面的修改,修改自身机器的配置。(上面红字是为了解释而增加的,大家不要把这些红色汉字也写入)
1.6 vi/vim常见问题及解决方法
问题1:按Ctrl+s键(Windows下的保存快捷键)后,发现vim对后续按键不再反应。原因是Ctrl+s命令在linux下是取消回显命令,所键入字符不显示在屏幕上,按Ctrl+q即可恢复回显。
问题2:在启动vim时,没有键入文件名。vim默认会创建一个新的文件,编辑完成后,进入命令状态,键入:w filename,将其保存为filename。
问题3:vim非正常退出后,再次编辑该文件时,会出现“swap file .helloworld.c.swp already exists!”的提示(假设helloworld.c是vim非正常退出时编辑的文件名),使用rm .helloworld.c.swp删除该文件,重新编辑即可。
2 Linux下C程序开发
C语言的编译器被简称为cc,不同厂商的类UNIX系统所带的C语言编译器均包含不同的功能和选项。Linux系统中,通常使用GNU C编译器,简称为gcc,下面以HelloWorld为例,简单介绍Linux下C语言开发过程。
注:本实验环境需要gcc版本为4.8以上。(可使用gcc -v查看gcc版本)
2.1 简要C语言开发过程
step1:使用vim编辑hello.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello World \n");
;
}
step2:编译hello.c
gcc -o hello hello.c
gcc命令将hello.c编译成可执行文件hello,如不加-o选项,编译器会把编译后的可执行文件命名为a.out。
step3:执行hello
./hello

在hello前面添加./,是让shell在当前目录下寻找可执行文件,如不添加./,shell会在PATH环境变量设置的目录中去寻找该可执行文件,但这些目录中通常不会包含当前目录。
注:对于复杂的大型程序,一般编写makefile文件来进行编译链接,makefile文件的编写请参考相关资料。
1.1 gcc常用选项
gcc选项很多,下表列出gcc常用的一些选项。
表2 gcc常用选项
|
选项 |
说明 |
|
-c |
只做预处理、编译和汇编,不作链接,常用于不含main的子程序 |
|
-S |
只进行预处理和编译,生成.s汇编文件 |
|
-o |
指定输出的目标文件名 |
|
-Idir |
头文件搜索路径中添加目录dir |
|
-Ldir |
库文件搜索路径中添加目录dir |
|
-lname |
链接libname.so库来编译程序 |
|
-g |
编译器编译时加入debug信息,供gdb使用 |
|
-O[0~3] |
编译器优化,数字越大,优化级别越高,0表示不优化 |
2 使用gdb调试C程序
gdb是Unix/Linux下的一个功能强大的程序调试工具。当程序出现段错误(segment fault)或者逻辑错误时,可以使用gdb进行调试。
gdb主要有四大功能:
1、启动程序,可以按照自定义要求随心所欲的运行程序;
2、可让被调试程序在所指定的调置断点处停住(断点可以是条件表达式);
3、当程序被停住时,可以检查程序中所发生的事;
4、动态改变程序的执行环境。
2.1 gdb常用调试命令
可以使用#gdb program启动目标代码进行调试,但目标代码编译时,必须使用-g选项编译。进入调试界面后,可以输入相关gdb命令控制目标代码的运行。下表为gdb常用的调试命令。
表3 gdb常用调试命令
|
命令 |
说明 |
|
list(或l) |
列出源代码,接着上次位置往下列,每次列10行 |
|
list 行号 |
从给定行号开始列出源代码 |
|
list 函数名 |
列出某个函数的源代码 |
|
break(或b)行号 |
在给定行号出设置断点,gdb会给出一个断点号 |
|
break 函数名 |
在给定函数开头设置断点 |
|
delete breakpoint 断点号 |
删除给定的断点 |
|
start |
开始执行程序,停在main函数第一句前面等待命令 |
|
run(或r) |
开始执行程序,直到遇到断点 |
|
next(或n) |
执行下一条语句 |
|
step(或s) |
执行下一条语句,如是函数调用,则进入函数中 |
|
continue(或c) |
继续执行程序,直到遇到断点 |
|
finish |
连续运行到当前函数返回,然后停下来等待命令 |
|
print(或p) |
打印表达式的值 |
|
display 变量名 |
跟踪查看某个变量的值,每次停下来都显示该变量的值 |
|
undisplay 跟踪显示号 |
取消对变量的跟踪查看 |
|
set var |
修改变量的值 |
|
quit |
退出gdb |
2.2 gdb调试示例
下面以一个例子简要说明使用gdb的调试过程。
step1:编辑源代码tst_gdb.c
#include <stdio.h>
int add()
{
, i;
; i < ; i ++)
{
sum += i;
}
return sum;
}
int main()
{
;
result = add();
printf(“the result is %d \n”, result);
;
}
step2:编译链接源代码,形成目标代码,注意使用-g编译选项。
gcc -g -o tst_gdb tst_gdb.c
step3:使用gdb进行跟踪调试,如下图所示。


这里再给出一张图片作为说明。

Linux下使用vim编辑C程序的更多相关文章
- linux下通过vim编辑文件的方法
一般来说是通过指令进入文件的编辑页面: vi [filename] 此时进入的是一般指令模式,然后可以直接移动光标对内容进行修改. 修改完成后,使用Esc 按键退出编辑模式. 此时回到的还是一般指令模 ...
- 在Linux下使用linuxdeployqt发布Qt程序
一.简介 linuxdeployqt 是Linux下的qt打包工具,可以将应用程序使用的资源(如库,图形和插件)复制到二进制运行文件所在的文件夹中. 二.安装linuxdeployqt 去github ...
- linux下使用vim替换文件中的^M换行符
在linux下打开windows编辑过的文本,会出现由于换行符不一致而导致的内容格式错乱的问题.最常见的就是出现^M . 我出现的问题是:在windows编辑过的文件,传到linux上后再用vim打开 ...
- 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序
如何用javac 和java 编译运行整个Java工程 (转载) http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...
- linux 下检查java jar包 程序是否正常 shell
linux 下检查java jar包 程序是否正常 shell http://injavawetrust.iteye.com BATCH_SERVER="batch.jar" NR ...
- Linux下如何让jar包程序在后台一直执行
Linux下如何让Jar包程序在后台一直执行 shell命令 nohup java -jar xxx.jar & &:让程序后台执行. nohub:让程序控制台输出转移到nohub.o ...
- 在Linux下,如何分析一个程序达到性能瓶颈的原因
0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...
- Linux下通过.desktop 文件创建桌面程序图标及文件编写方式(Desktop Entry文件概述)
Linux下通过.desktop 文件创建桌面程序图标及文件编写方式 1.Desktop Entry文件概述:在 Windows 平台上,用户可以通过点击位于桌面或菜单上的快捷方式轻松打开目标应用程序 ...
- Linux下使用vim命令编辑与修改文本内容
输入 vim --help VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Jul 26 2017 20:13:43) 用法: vim [参数] [文件 .. ...
随机推荐
- iOS 百度地图判断用户是否拖动地图的检测方法
前言:百度地图API并没有提供移动地图时的回调接口 实现:通过判断当前地图的中心位置是否为用户位置来判断,代码如下 -(void)mapView:(BMKMapView *)mapView regio ...
- mongo数据集合属性中存在点号(.)
基本知识点: 1.似乎mongo3.6之前不允许插入带点(.)或美元符号($)的键,但是当我使用mongoimport工具导入包含点的JSON文件时,它工作正常. 2.在使用spring-data-m ...
- laravel5.5源码笔记(六、中间件)
laravel中的中间件作为一个请求与响应的过滤器,主要分为两个功能. 1.在请求到达控制器层之前进行拦截与过滤,只有通过验证的请求才能到达controller层 2.或者是在controller中运 ...
- C语言用一级指针处理字符串的反思
1.一级指针处理字符串的常见方式 如果使用单个指针,不方便对字符串本身进行操作,只适合遍历. 使用两个指针, 两个指针和字符串大致有两个常见处理方式: (1)两个指针从字符串首部开始向后移动,同时处理 ...
- (数据科学学习手札47)基于Python的网络数据采集实战(2)
一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...
- gcd 模板
声明 给 x,y 两个数,求 x,y 的最大公因数. 辗转相除法,直接套!!! function gcd(x,y:longint):longint; begin then exit(x) else e ...
- 20155230 2016-2017-2 《Java程序设计》第十周学习总结
20155230 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程:就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发 ...
- 20155316 2016-2017-2 《Java程序设计》第10周学习总结
教材学习内容总结 Java和Android开发学习指南(第二版)第22章 Java 密码技术 教材学习中的问题和解决过程 1.什么叫柯克霍夫原则? 数据的安全基于密钥而不是算法的保密. 也就是说系统的 ...
- 20155319 2016-2017-2 《Java程序设计》第一周学习总结
20155319 2016-2007-2 <Java程序设计>第一周学习总结 考核方式 翻转课堂考核12次(5*12=60):每次考试20-30道题目,考试成绩规格化成5分(如总分20分就 ...
- 20155325 2016-2017-2 《Java程序设计》第十周学习总结
教材学习内容总结 Java视频笔记 强制转换 运算符 获取特定位数的值 循环 switch(不能判断布尔型) int x = 3, y = 3, z = 3; int n = 0; switch (x ...