【linux+C】神器 vim + 指针相关客串
前篇回顾
上篇介绍了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,用指针去引用内存,往往是在使用堆内存,栈是有限的,并且受生存期影响,所以用堆的情况要比用栈更多,有些东西生存期很长,超过一个函数的调用,那么就需要用堆内存。
【linux+C】神器 vim + 指针相关客串的更多相关文章
- 004 Linux 揭开神器 vim 面纱
01 开篇初识 vim vim 功能吊炸天,但我们掌握一些常用的命令即可应对日常的使用了,不记流水账! Linux 中最常用的编辑器是什么? vim ! vi 跟 vim 啥区别? vim 就是 vi ...
- Linux系列笔记 - vim相关记录
一.常用到的vim命令 这里只简单记录常用到的命令,后面会有自己记录的命令,但有些可能不常用. 常规模式: gg 跳到文件头 shift+g 跳到文件尾 行数+gg 跳到指定行 如:123gg 跳到1 ...
- linux开发神器--Tmux
在Linux上工作的朋友,可能会常常遇到这种情况: 痛点1: 在公司用putty连着Linux开发机,程序正跑着,不知不觉到了下班的时候,要和老婆/女朋友约会了,但是程序还没跑完,并且进度有点紧,还得 ...
- Linux系统Vi/Vim编辑器的简单介绍、安装/卸载、常用命令
Linux系统Vi/Vim编辑器的简单介绍.安装/卸载.常用命令 1.介绍 vi(Visual Interface)编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界 ...
- Linux下使用vim编辑C程序
这几天在系统能力班自学linux,加上最近大数据课上开始使用linux,我在这里总结一下,linux下使用vim编辑c程序的一些问题. 大数据课上是直接使用micro来编辑的,我这里只是简单的说明一下 ...
- 5.Linux系统的vim与软件包管理
5.1 Linux系统的vim编辑器 5.1.1 vim编辑器的概述 vim编辑器的简介 1.vim是什么? vim是一个类似vi的文本编辑器,它在vi的基础上增加了很多新特性 vim是vi发展出来的 ...
- Linux 环境下安装python相关
目录 Linux 环境下安装python相关 linux软件包管理工具之yum工具(如同pip3工具) yum源理解 下载阿里云的.repo仓库文件 ,放到/etc/yum.repos.d/ yum安 ...
- Linux学习,Vim以及Vi常用快捷键
VIM配置文件路径: /etc/vmrc ===> 系统配置文件路径 ~/.vimrc ===> 当前用户配置文件路径 $VIM ===> 与VIM配置文件相关的变量 进入插入模式: ...
- day59:Linux:编辑工具vim&文件类型&文件属性
目录 1.Linux编辑工具vim 2.Linux文件类型 3.Linux文件属性 4.今日份Linux练习题 Linux编辑工具vim 1.什么是vim 文本文件的编辑工具, 和windows的n ...
随机推荐
- 仰视源代码,实现strcpy
编程实现字符串的拷贝,不能用库函数. 一般的刚開始学习的人也许能写出来.可是要写的非常完美那就须要基本功了. char* strcpy(char* strDest, const char* strSr ...
- py3处理数据库
处理mysql使用 pymysql模块 import pymysql conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passw ...
- 杂谈之WEB前端project师身价
了解javascript语言规范么?+1000 知道各浏览器的css差异么?+1000 javascript差异呢?+1000 知道html各标签的含义并不是常好地运用么?+1000 知道怎样跨浏览器 ...
- react-redux的connect()方法
容器组件使用 connect() 方法连接 Redux 我们用 react-redux 提供的 connect() 方法将“笨拙”的 Counter 转化成容器组件.connect() 允许你从 Re ...
- windows平台简易直播系统搭建
最近做直播系统的朋友很多,正好前端时间也在做这一块,写片文章分享下开发心得,以为后用. 直播系统我将它分为前堆推流,后台服务,客户端播放三大部分.前端推流基于ffmpeg,后台服务 使用crtmp服务 ...
- ubuntu14.04下CPU的caffe配置,不成功的朋友请与我(lee)联系,后面附带邮箱
因广大朋友需求cpu的caffe配置.所以我(lee)在这份博客中对cpu配置caffe做出对应操作说明.希望能够解决大家对cpu配置caffe的困惑.少走弯路. 假设有安装不成功的朋友能够和我联系, ...
- JavaScript语言基础9
我们先看看以下这段代码: <span style="font-size:18px;"><HTML> <HEAD> <TITLE>He ...
- kubernetes调度之 PriorityClass
系列目录 kubernetes支持多种资源调度模式,前面讲过简单的基于nodeName和nodeSelector的服务器资源调度,我们称之为用户绑定策略,下面简要描述基于PriorityClass的同 ...
- PostgreSQL与MySQL比較
特性 MySQL PostgreSQL 实例 通过执行 MySQL 命令(mysqld)启动实例. 一个实例能够管理一个或多个数据库.一台server能够执行多个 mysqld 实例.一个实例管理器能 ...
- 索引大小 975.45 MB (1,022,836,736)
975.45 MB (1,022,836,736)