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 [参数] [文件 .. ...
随机推荐
- shell习题第8题:监控nginx的502状态
[题目要求] 服务器上跑的是LNMP环境,近期总是有502现象.502为网站访问的状态码,200正常,502错误是nginx最为普遍的错误状态码. 由于502只是暂时的,并且只要一重启php-fpm服 ...
- vue-scroller使用
<template> <div class="page page-scroller"> <scroller class="scroller& ...
- 九九乘法表,全js编写,放入table表格带入页面渲染出来
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php以数组做为配置文件的读取和写入操作
最近想用php开发个简单的文章管理系统,主要是做一批垃圾采集站,目前网上的cms都太多功能了,导致修改个模板要很多文件,花费很多功夫.开始用thinkphp框架做,感觉还是麻烦,后来改用ci,做好了后 ...
- WOT干货大放送:大数据架构发展趋势及探索实践分享
WOT大数据处理技术分会场,PingCAP CTO黄东旭.易观智库CTO郭炜.Mob开发者服务平台技术副总监林荣波.宜信技术研发中心高级架构师王东及商助科技(99Click)顾问总监郑泉五位讲师, ...
- Leetcode---栈系列刷题(python3实现)----#496 下一个更大元素I
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...
- Java ArrayList 源代码分析
Java ArrayList 之前曾经参考 数据结构与算法这本书写过ArrayList的demo,本来以为实现起来都差不多,今天抽空看了下jdk中的ArrayList的实现,差距还是很大啊 首先看一下 ...
- go语言 os.Rename() cannot move the file to a different disk drive 怎么办
时值我小病在家休养生息,喜欢跳广场舞的外公来寻求我的帮助,他们跳广场舞是将存有歌曲的U盘插到音响上面,而音响大部分都是只能显示歌曲的索引index,不能直接显示歌曲名,所以为了方便他们会在U盘里面对歌 ...
- dart 自己写一个简单的文件编码器
// import 'dart:convert'; import 'dart:io'; main() async { var src = File('./lib/convert/source.txt' ...
- 流程控制(if、while、for)
流程控制 一.if判断 # 1.语法一if 条件:#条件成立时执行的子代码块` 代码1 代码2 代码3# 示例:sex='female'age=18is_beautiful=Trueif sex == ...