前篇回顾

  上篇介绍了linux下C编程基本环境配置以及相关工具使用选择。

  不过10个大牛9个用vim,那么咱们就来玩vim。linux下玩c就别依靠图形界面。好吧告别Ide,命令行才是c的王道。

  本篇文章感谢名为孙鹤同学的技术支持 感谢有爱的c大牛们

  本文中多处使用vim插件(孙鹤提供),这些插件大多是在http://www.vim.org/处下载。


指针客串

  因为毕业后就没玩过c了,都说指针是c的重点。但是指针作为一种地址变量,为什么不直接操作变量本身呢。文章末尾为大家揭晓


vim的配置文件

  ~/.vimrc        用户的默认配置文件
  ~/.vim/plugin/   用户的默认脚本文件的存放目录
  ~/.vim/ftplugin/ 用户的默认文件类型相关脚本文件的存放目录


vim提供的编程支持

  文本信息(行号、文件名等)
  代码缩进
  语法高亮
  快速定位
  标记位置
  全文搜索
  补全
  多文件编辑
  多窗口编辑
  函数列表
  文件列表
  函数跳转
  语法错误
  字符集的编码
  二进制查看

  等等...


初试vim

  在终端以root启动 输入vim命令 显示vim首页

:r filename 读入一个文件内容,并写入到当前编辑器中

按i进入插入模式

编辑完后:w保存

编辑完后按esc退出插入模式 进入正常模式

然后输入:sh进入shell

编译运行


文本信息配置

set nu(写入配置文件.vimrc中) 显示行号。
ctrl-g(正常模式下使用命令) 显示文件信息和当前行。
statusline.vim(插件) 增加底部状态栏。


代码缩进配置

filetype on(写入配置文件.vimrc中) 使vim对文件类型敏感。
autocmd FileType c,cpp,h :setlocal cindent cinoptions=:0,g0,t0(写入配置文件.vimrc中) 设置c缩进风格,具体详情参见:h cinoptions-values。
autocmd FileType c,cpp,h :setlocal et sta sw=4 sts=4 tabstop=4(写入配置文件.vimrc中) 设置一次缩进的距离是4个空格。
=(正常模式或者可视模式下使用命令) 按照缩进风格排版代码。
<(可视模式下使用命令) 向左缩进一级。
>(可视模式下使用命令) 向右缩进一级。


语法高亮

filetype plugin on(写入配置文件.vimrc中) 通常安装的vim中已经加入了各种语言的语法高亮插件,我们只需要打开文件类型相关的插件就可以了。


快速定位

gd(正常模式下使用命令) 跳转到局部变量定义处。
gD(正常模式下使用命令) 跳转到全局标量定义处。
*(正常模式下使用命令) 搜索并跳到下一个光标所在的单词。
g*(正常模式下使用命令) 功能接近*,但是查找的目标不带\<和\>单词分界符号。
#(正常模式下使用命令) 搜索并跳到上一个光标所在的单词。
g#(正常模式下使用命令) 功能接近#,但是查找的目标不带\<和\>单词分界符号。


标记位置

m{a-zA-Z0-9} (正常模式下使用命令) 在当前位置制作一个标记,标记名字可以使用a-z或者A-Z之间的任意字符,例如输入ma,就是将当前位置标记为a标记。注意a-z为单文件标记,不可跨文件使用,而A-Z0-9为全局标记,可以跨文件使用。
‘{a-zA-Z0-9} (正常模式下使用命令) 跳转到本文件的标记上。
:marks [{a-zA-z0-9}] (正常模式下使用命令) 查看指定标记的内容,不写标记号则查看所有。
:delm {a-zA-z0-9} (正常模式下使用命令) 删除一个标记。


全文搜索

:vimgrep(正常模式下使用命令) 全文搜索,功能同grep命令,但是支持在vim进行多文件跳转定位。
使用方法:vimgrep 正则表达式 文件。文件支持通配符,例如*.c代表所有的.c文件。如果希望递归搜索,可以使用**/*,表示搜索所有的文件。
:cl 列举结果
:cc(正常模式下使用命令) 当前结果
:cn(正常模式下使用命令) 下一个结果
:cp(正常模式下使用命令) 上一个结果
:cw(正常模式下使用命令) 重新打开搜索结果窗口


多文件编辑

vim f1 f2 …… fn(在shell下使用命令) 打开多个文件。
:e 文件名(正常模式下使用命令) 在vim中打开新文件。
:ls(正常模式下使用命令) 所有打开文件列表。
:bn(正常模式下使用命令) 到下一个文件。
:bp(正常模式下使用命令) 到上一个文件。
:b# 或 ctrl-6(正常模式下使用命令) 到最近的前一个文件。
set  autowriteall(写入配置文件.vimrc中) 如果讨厌每次打开新文件,vim喋喋不休的要求你保存,那么可以设置自动保存。


多窗口编辑
:sp  文件名(正常模式下使用命令) 横向拆分窗口(多行窗口)。
:vsp 文件名(正常模式下使用命令) 纵向拆分窗口(多列窗口)。
ctrl-w h(正常模式下使用命令) 将光标移动到左一个窗口。
ctrl-w j(正常模式下使用命令) 将光标移动到下一个窗口。
ctrl-w k(正常模式下使用命令) 将光标移动到上一个窗口。
ctrl-w l(正常模式下使用命令) 将光标移动到右一个窗口。
ctrl-w +(正常模式下使用命令) 当前窗口尺寸变大。
ctrl-w -(正常模式下使用命令) 当前窗口尺寸变小。
ctrl-w o(正常模式下使用命令) 只显示当前窗口。


函数列表
taglist.vim(插件) 列表插件。
let Tlist_Use_Right_Window = 1(写入配置文件.vimrc中) 如果希望列表在右侧显示,则加入这个配置,默认是左侧。
:Tlist(正常模式下使用命令) 显示函数列表。
d(在taglist窗口下使用) 从列表中删除文件。
+(在taglist窗口下使用) 展开文件。
-(在taglist窗口下使用) 折叠文件。
=(在taglist窗口下使用) 折叠所有文件。
x(在taglist窗口下使用) 显示或隐藏正常窗口。


文件列表
NERD_tree.vim(插件) 横向拆分窗口(多行窗口)。
let NERDTreeWinPos = 'right'(写入配置文件.vimrc中) 如果希望文件树在右侧显示,则加入这个配置,默认是左侧。
:NERDTree(正常模式下使用命令) 显示文件列表。


函数跳转
ctags(软件,需要另外安装) 生成多种语言tag文件的软件。
Ctags –R *.c(在shell下使用命令) 生成当前路径所有.c文件的tag,-R代表递归。
:ta 标记 或 [g] ctrl-] 列举标签(多个标签)或者跳转到标签(单个标签)。
ctrl-t 返回上一级。
:tags 列出标签栈。


语法错误
:make(正常模式下使用命令) 执行外部make命令,并且显示所有的编译警告和错误,并且可以在vim中定位。
:cl 列举结果
:cc(正常模式下使用命令) 当前结果
:cn(正常模式下使用命令) 下一个结果
:cp(正常模式下使用命令) 上一个结果
:cw(正常模式下使用命令) 重新打开搜索结果窗口


二进制文件查看 (鉴于有同学理解出现分歧 将二进制查看更新为二进制文件查看)

:范围!xxd(正常模式下使用命令) 把指定范围的部分转化为二进制文件阅读方式。
:范围!xxd -r(正常模式下使用命令) 把指定范围的部分转回字符阅读方式。


字符集的编码
let &termencoding=&encoding
set fileencodings=utf-8,gbk,cp936(写入配置文件.vimrc中)
 加入多种字符编码支持。
:set fileencoding(正常模式下使用命令) 设定文件字符编码。


补充

ctrl-p(插入模式下使用命令) 跳出补全菜单。
ctrl-n(在跳出补全菜单后) 下一个结果。
ctrl-p(在跳出补全菜单后) 上一个结果。
ctrl-y(在跳出补全菜单后) 选择当前结果。
ctrl-x ctrl-f(插入模式下使用命令) 文件名补全。
ctrl-x ctrl-i(插入模式下使用命令) 包含的头文件。
ctrl-x ctrl-](插入模式下使用命令) ctags(将在下文中介绍)符号补全。
ctrl-x ctrl-o(插入模式下使用命令) omni补全,需要设置omnifunc变量。


vim其他命令 (参考vi(vim)教程)

打开文件、保存、关闭文件:

vi filename       //打开filename文件
:w              //保存文件
:w vpser.net  //保存至vpser.net文件
:q             //退出编辑器,如果文件已修改请使用下面的命令
:q!           //退出编辑器,且不保存
:wq              //退出编辑器,且保存文件

插入文本或行:

a      //在当前光标位置的右边添加文本
i       //在当前光标位置的左边添加文本
A     //在当前行的末尾位置添加文本
I      //在当前行的开始处添加文本(非空字符的行首)
O     //在当前行的上面新建一行
o     //在当前行的下面新建一行
R    //替换(覆盖)当前光标位置及后面的若干文本
J    //合并光标所在行及下一行为一行(依然在命令模式)

移动光标:

使用上下左右方向键

命令模式下:h   向左、j   向下 、k   向上、l  向右。
空格键 向右、Backspace  向左、Enter  移动到下一行首、-  移动到上一行首。

删除:

x         //删除当前字符
nx        //删除从光标开始的n个字符
dd      //删除当前行
ndd   //向下删除当前行在内的n行
u       //撤销上一步操作
U      //撤销对当前行的所有操作

搜索:

/vpser     //向光标下搜索vpser字符串
?vpser    //向光标上搜索vpser字符串
n           //向下搜索前一个搜素动作
N           //向上搜索前一个搜索动作

跳转:

n+        //向下跳n行
n-         //向上跳n行
nG        //跳到行号为n的行
G           //跳至文件的底部

设置行号:

:set  nu     //显示行号
:set nonu    //取消显示行号

复制:

yy    //将当前行复制到缓存区,也可以用 "ayy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务。
nyy   //将当前行向下n行复制到缓冲区,也可以用 "anyy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务。
yw    //复制从光标开始到词尾的字符。
nyw   //复制从光标开始的n个单词。
y^      //复制从光标到行首的内容。

y$      //复制从光标到行尾的内容。
p        //粘贴剪切板里的内容在光标后,如果使用了前面的自定义缓冲区,建议使用"ap 进行粘贴。
P        //粘贴剪切板里的内容在光标前,如果使用了前面的自定义缓冲区,建议使用"aP 进行粘贴。

替换:

:s/old/new      //用new替换行中首次出现的old
:s/old/new/g         //用new替换行中所有的old
:n,m s/old/new/g     //用new替换从n到m行里所有的old
:%s/old/new/g      //用new替换当前文件里所有的old

编辑其他资源:

:e otherfilename    //编辑文件名为otherfilename的文件。

修改文件格式:

:set fileformat=unix   //将文件修改为unix格式,如win下面的文本文件在linux下会出现^M。


客串答案

  c传递参数都是值传递的,指针的一个作用是为了解决实现类似引用的效果,另外,使用指针可以直接操作内存!

  孙鹤同学的解释:

  每个线程有固定大小的栈,通常主线程的栈默认一般是8M,用指针去引用内存,往往是在使用堆内存,栈是有限的,并且受生存期影响,所以用堆的情况要比用栈更多,有些东西生存期很长,超过一个函数的调用,那么就需要用堆内存。

最新文章

  1. MVC5+EF6 入门完整教程五
  2. oracle10G/11G官方下载地址集合 直接迅雷下载
  3. 第一百九十四天 how can I坚持
  4. HTML5入门4---HTML5 与 HTML4 同一网页的不同写法
  5. Ssqlserver 关于Grouping sets
  6. dreamweaver批量去除空格,空行
  7. java 访问 mysql 数据库的字符集设置
  8. 读取sd卡下图片,由图片路径转换为bitmap
  9. Git代理服务器设置和访问Github
  10. 用php自动发邮件的简单实现
  11. Naive Bayes (NB Model) 初识
  12. 动手写 js 沙箱
  13. PHP获取汉字首字母并分组排序
  14. EventBus源码分析
  15. Linux automake命令
  16. leetcode个人题解——#56 Merge Intervals
  17. C - Maximum of Maximums of Minimums(数学)
  18. Oracle Net Configuration(监听程序和网络服务配置)
  19. linux多线程同步
  20. mysql 密码忘记

热门文章

  1. K-L变换和 主成分分析PCA
  2. Pro Android学习笔记(一三七):Home Screen Widgets(3):配置Activity
  3. 基于ACCESS和ASP的SQL多个表查询与计算统计代码(一)
  4. powerDesignner连接数据库
  5. Odoo电子数据交换(EDI)
  6. BEGINNING SHAREPOINT&amp;#174; 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps Office的JavaScript对象模型
  7. 一些常用的shell
  8. git操作-如何把你的本地仓库放到GitHub已有仓库
  9. 宜人贷蜂巢API网关技术解密之Netty使用实践
  10. SecureCRT 7.0 如何自动记录日志