Linux编程简介——VI
VI是Linux/Unix下标配的一个纯字符界面的文本编辑器。由于不支持鼠标功能,也没有图形界面,相关的操作都要通过键盘指令来完成,需要记忆大量命令。因此很多人不大喜欢它,但同时由于键盘的方式往往比鼠标来得快,一旦熟练后用起来是有种非常流畅的感觉的,也有人因此而非常喜欢它。
不管你喜欢也好,不喜欢也好,VI是Linux的标配编辑器,很多时候你也只有这一个编辑器可用,如果要做一个Linux Coder,熟悉VI还是非常有必要的。
PS:由于VI的命令非常多,本文主要只介绍一些基础命令。并且就算是这些基础命令中,也有许多是不大常用的,我就把这些命令以灰色文字显示了,初学者可以不用太关注这些灰色命令。
两种工作模式
前面已经说过,由于VI没有图形界面,如翻页、移动光标、保存、退出等操作都必须借助键盘来完成。另外,VI还提供了大量快捷键来加速操作,因此,VI统的编辑模式下,还引入了一种新的工作模式——命令模式。
- 编辑模式: 在此模式下,输入可见字符时和传统Windows环境下输入字符的功能相同。按Esc键可切换值命令模式。
- 命令模式: 在此模式下,输入的可见字符对应的是命令。当插入命令执行后进入编辑模式。
PS:有的文章中还列举了一种Last Line模式,这个可以算作一种特殊的命令模式,只不过命令会显示在最后一行,并且需要敲回车才能执行。这些命令通常以 :/?$ 等特殊字符开头。
模式查询:要判断当前处于那种模式,可以通过最后一行(状态栏)来判断:如果处于编辑模式,则显示为如下两种状态。
模式间的切换:在编辑模式下,通过Esc键可以进入命令模式;命令模式下,执行某些插入命令后进入编辑模式。如果你不知道当前处于那种模式下,按ESC进入命令模式,按Insert进入编辑模式。
启动VI
VI的启动参数有不少,但通常的使用方式如下:vi filename
如果参数中的文件存在,则打开该文件,如果参数中的文件不存在,则会新建该文件(不是立即创建,而是在保存的时候创建)。
插入文本
刚进入VI时,是出于命令模式的,这是是无法输入文本的,因此需要进入插入模式。进入插入模式的命令有如下几个:
- i 从目前光标所在之处插入文字
- a 从目前光标所在下一个字符插入文字
- o 往下插入一个空行
- O 往上插入一个空行
输入这几个命令后,就进入了编辑模式,可以通过屏幕下方最后一行看到当前为插入状态:
可以通过Insert键切换插入状态和改写状态(和图像界面中一样)。
另外,在命令模式下,也可以通过Insert键进入编辑模式(插入状态),不过通常还是前面介绍的四个命令来进入编辑模式。
离开和保存文件
在VI中,离开和保存文件对应的命令有这几个(使用前记得进入命令模式):
- :w 保存
- :w filename 另存为
- :wq 保存并退出 [常用]
- :q! 强制退出
- SHIFT+zz 保存并退出,功能同:wq [常用]
移动光标
在VI中,移动光标并不是我们游戏中常用的WASD,而是h、j、k、l,分别控制光标左、下、上、右移一格,分别分布在右手四个指头,新手需要一段时间来适应。使用非常频繁,需要熟练掌握。
其它一些光标控制命令如下:
- Ctrl+B:屏幕往后移动一页。
- Ctrl+F:屏幕往前移动一页。
- Ctrl+U:屏幕往后移动半页。
- Ctrl+D:屏幕往前移动半页。
- gg:移动文章的开头。
- G:移动到文章的最后。
- w:光标跳到下个word的开头。
- e:光标跳到下个word的字尾。
- b:光标回到上个word的开头。
- $:移到光标所在行的行尾。
- ^:移到该行第一个非空白的字符。
- 0:移到该行的开头位置。
- #:移到该行的第#个位置,例:51、121。
另外,还有几个行操作相关命令集中介绍一下
- :set nu 显示行号
- :set nonu 隐藏行号
- :# 移动到第#行,如:15
- Ctrl+G: 在状态栏显示当前进度
- #G: 移动到第#行,例:15G
删除文字
- x:删除光标所在位置的后面一个字符。
- #x:例如,6x 表删除光标所在位置的后面6个字符。
- X:大字的X,每按一次删除光标所在位置的前面一个字符。
- #X:例如,20X 表删除光标所在位置的前面20个字符。
- dd:删除光标所在行。
- #dd:例如,6dd表删除从光标所在的该行往下数6行之文字。
复制粘贴
我个人并不是很习惯VI提供的复制粘贴,由于没有高亮选中,用起来感觉不是很方便。平时大都是用的终端工具的复制粘贴功能,因此这里的命令我都加灰了,感兴趣的可以看看。
- yw:将光标所在处到字尾的字符复制到缓冲区中。
- p:将缓冲区内的字符粘贴到光标所在位置(指令'yw'与'p必须搭配使用)。
- yy:复制光标所在行。[超常用]
- p:复制单行到您想粘贴之处。(指令'yy'与'p'必须搭配使用)
- #yy:如:6yy表示拷贝从光标所在的该行往下数6行之文字。[常用]
- p: 复制多行到您想粘贴之处。(指令'#yy'与'p'必须搭配使用)
- ayy:将复制行放入buffer a, vi提供buffer功能,可将常用的数据存在buffer
- ap:将放在buffer a的数据粘贴。
- b3yy:将三行数据存入buffer b。
- b3p:将存在buffer b的资料粘贴
撤销和重做
撤销和重做在任何编辑器里都是非常有用的命令:
- u:假如您误操作一个指令,可以马上按u,回复到上一个操作。
- .: 重复执行上一次的指令
查找和替换
查找和替换的语法笔记复杂,先简单的介绍一下查找的语法:
- /pattern<Enter> :向下查找pattern匹配字符串
- ?pattern<Enter> :向上查找pattern匹配字符串
使用了查找命令之后,使用如下两个键快速查找:
- n:按照同一方向继续查找
- N:按照反方向查找
至于替换的语法,限于篇幅所限,这里就不介绍了,给一个链接供大家参考一下:http://blog.csdn.net/lanxinju/article/details/5731843。
VI对编程的支持
VI对编程还是提供了一定的支持的。例如,它是支持括号配对、语法高亮显示的。
不过,由于并不支持语法解析功能,作为编码工具和专业的代码编辑器如SourceInsight、VisualStudio等比起来还是有很大差距的。个人感觉做小型项目和临时修改代码用还行,但做大型项目是有点力不从心的。
转载于:https://www.cnblogs.com/TianFang/archive/2013/01/17/2865159.html
Linux编程简介——VI相关推荐
- linux编程是否含7,第7章Linux编程简介.ppt
第7章Linux编程简介 ARM 应用系统设计第7章 Linux编程简介 佘黎煌 东北大学信息科学与工程学院 电子信息工程研究所 嵌入式Linux概况 现在 Linux 广泛用于各类计算应用,不仅包括 ...
- Linux编程简介——动态链接库
传统方式下,库函数的链接是在编译器完成的,所有相关对象在编译的时候被整合成一个可执行文件.与此相比,我们也可以把对库函数的链接载入推迟到程序运行的时期,也就是我们所称作的动态链接. 动态链接的优点 除 ...
- linux系统默认的环境变量path,Linux编程 12 (默认shell环境变量, PATH变量重要讲解)...
一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash shell支持的Bourne变量 Bo ...
- 嵌入式 Linux 编程
嵌入式 Linux 编程 嵌入式应用开发 嵌入式软件开发流程 什么是交叉编译 在一种平台上编译出能在另一种平台(体系结构不同)上运行的程序: 在PC 平台(X86) 上编译出能运行在ARM平台上的的程 ...
- linux系统中vi/vim文本编辑器的使用简介
linux系统中vi/vim文本编辑器的使用简介 1. vi/vim简介 vi/vim 是linux系统中最基本的编辑器,类似于windows系统中的记事本,几乎所有的linux开发版本都内置了v ...
- linux下多进程编程简介
两年前的文章,拿过来充充门面. ------------------------ linux下多进程编程简介 ( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:272 ) ...
- linux c read函数返回值,Linuxc - GNU Readline 库及编程简介
GNU Readline 库及编程简介 简介 用过 Bash 命令行的一定知道,Bash 有几个特性: TAB 键可以用来命令补全 ↑ 或 ↓ 键可以用来快速输入历史命令 还有一些交互式行编辑快捷键: ...
- 使用.NET Core进行Linux编程3:简介和第2章
目录 背景 我希望实现的目标 介绍 这本书的封面是什么? 这本书是给谁的? 以应用为中心 这本书不是什么 这本书是什么 GitHub上的所有源代码 DotNet Core MacOS奖金 第2章--进 ...
- linux程序设计基础——概述,3.linux程序设计基础—vi使用
3.linux程序设计基础-vi使用 (24页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 Haubo Training Center L ...
最新文章
- linux给用户写任务计划,linux——计划任务
- 小卡片遇热就变机器人,不插电就能运动,哈佛加州理工新研究登上Nature子刊...
- boost::posix_time模块打印当天的剩余小时数的测试程序
- 重力模型matlab代码,STK基础教程.doc
- easymock 图片_数据模拟神器 easy-mock 正式开源
- 程序员作图工具和技巧,你 get 了么?
- PHP模板引擎smarty详细介绍
- 豪掷197亿美元!微软收购Siri背后的语音技术研发公司
- 那些年,陪你度过最困难时光的女孩还在么?
- SQL Server 2008 r2数据库可疑状态解决
- 计算机ps如何更改数字,ps数字(ps改数字详细步骤)
- Sprite和Texture的区别
- 学习Android开发只要这些东西,Android篇
- java文件批量下载打包成zip
- 36岁大数据人被中台问倒,没点架构思维,连面试都过不了?
- Python下的TK(一)概述
- 索尼xz Android 内存,下周开更 索尼Xperia XZ1升级安卓9.0
- 通过Shell 脚本向CK集群群分发SQL指令
- Eric Lippert推荐的C#书单
- 参悟yield 和yield from (加精)
热门文章
- 安卓BLE开发教程(二) BLE开发流程
- Taro+react开发(88):taro条件渲染
- [html] 如何给页面添加追加右键菜单(原右键菜单功能保持不变)
- [html] iframe框架都有哪些优缺点?
- [css]怎么改变选中文本的文字颜色和背景色?
- [vue-element] ElementUI表格组件如何实现动态表头?
- 前端学习(2820):全局文件tabber字段
- 工作252:uniapp--实战--uview---tabber
- 工作241:判断数组里面是否有某个值
- 前端学习(2501):动态绑定样式