Linux(Centos 7.6)命令详解:vi

1.命令作用

vi/vim 是Linux 系统内置不可或缺的文本编辑命令,vim 是vi 的加强版本,兼容vi 的所有指令,不仅能编辑文本,而且还具有shell 程序编辑的功能,可以不同颜色的字体来辨别语法的正确性。

2.命令语法

usage: vim [arguments] [file ..] edit specified file(s) 编辑指定文件
or: vim [arguments] - read text from stdin 从标准输入中读取文本

or: vim [arguments] -t tag edit file where tag is defined 编辑定义标记的文件

3.参数详解

arguments:

  • --,仅列出此后的文件名(执行后进入命令模式,可点击i进图编辑模式进行编辑)
  • -v,Vi 模式(如同"vi")
  • -e,Ex 模式(如同"ex")
  • -E,改进Ex模式
  • -s,静默(批量)模式(仅适用于"ex")
  • -y,简易模式(如同"evim",无模式)(进去后不好退出来)
  • -R,只读模式(如同"view")
  • -Z,限制模式(如同"rvim")
  • -m,不允许修改(写文件)(可以写入到不能保存,保存会提示不能写入)
  • -M,不允许修改文本(不能转换为插入模式,命令模式删除也不行)
  • -b,二进制模式
  • -C,兼容Vi: '兼容'
  • -N,不完全兼容Vi: '不完全兼容'
  • -V[N][fname],显示详细信息[数量 N] [日志信息记录到fname]
  • -n,没有交换文件,只使用内存
  • -r,列出交换文件并退出(vi -r不跟文件)
  • -r (with file name),恢复崩溃的会话(vi -r filename 跟文件恢复异常的vi 编辑会话)
  • -L,与-r一样
  • -T <terminal>,终端类型设置为<terminal>
  • -u <vimrc>,使用<vimrc>而不是任何.vimrc(.vimrc默认存在的,可在用户家目录下创建,可在家目录创建,如.vimrc写入set number,vi/vim打开就会显示行号)
  • --noplugin,不要加载插件脚本
  • -p[N],打开N个标签页(default: 每个文件一个)(用于同时打开多个文件,或一个文件多次打开)
  • -o[N],打开N个窗口(default: 每个文件一个)(用于同时打开多个文件,或一个文件多次打开)
  • -O[N],像-o一样,但是垂直分开
  • +,从文件末尾开始(vi打开后光标直接定位到文件末尾行行首)
  • +<lnum>,从行<lnum>开始(vi打开后光标定位在指定行行首)
  • --cmd <command>,在加载任何vimrc文件之前执行<command>(command为编辑器的命令)
  • -c <command>,加载第一个文件后执行<command>(command为编辑器的命令)
  • -S <session>,加载第一个文件后执行文件<session>(session内容为编辑器的命令和操作)
  • -s <scriptin>,从文件<scriptin>中读取普通模式命令(scriptin内容为编辑器的命令和操作)
  • -w <scriptout>,将vi 编辑文件的所有操作追加记录到文件<scriptout>
  • -W <scriptout>,将vi 编辑文件的所有操作覆盖记录到文件<scriptout>

4.模式详解

三种模式:

  1. 一般模式/命令模式(command mode):刚刚启动 vi/vim,则进入一般模式,可以移动光标、复制粘贴、删除字符等。此状态下键盘输入会被识别为命令操作,常用到的包括 i(切换到插入模式),x(删除当前光标所在字符),:(切换到命令行模式)
  2. 插入模式(input mode):在一般模式下按下键盘【i, I, o, O, a, A】进入插入模式,屏幕的左下方会出现【--INSERT--】的字样,表示当前模式下,用户可以编辑修改文本的内容。按下【Esc】则退出编辑模式
  3. 命令行模式/末行模式(last line mode):在一般模式下按下键盘【: / ?】任意一个,光标移动到最下面一行,进入末行模式。可以查找数据、替换、可保存文件、退出 vi、显示行号等操作

5.常用用例

5.1.创建文件

创建文件,打开 test.txt 文件进入一般模式;当 test.txt 不存在则会创建 test.txt 文件,保存退出后,则新建成功。

bash 复制代码
vi test.txt

5.2.移动光标

进入一般模式后,可在键盘输入以下,移动光标位置。

  • [Ctrl]+[f] :光标向下移动一页。
  • [Ctrl]+[d] :光标向下翻半页
  • [Ctrl]+[b] :光标向上移动一页。
  • [Ctrl]+[u] :光标向上 翻半页
  • 0:移动到光标所在这一行的最前面字符处。
  • $:移动到光标所在这一行的最后面字符处。
  • h j k l 或者箭头按键:从当前光标处往上、下、左、右移动。
  • gg:移动到这个文件的第一行。
  • G:移动到这个文件的最后一行。
  • N[Enter] :N 为数字,光标向下移动 N 行。
  • ngg 或 nG :n 代表行号,光标会跳转到文件的第n行,例如 66gg 或 66G,光标会跳转到第66行。
  • :n : 英文冒号":"后面输入行号n,按回车键,光标会跳转到第n行。例如,输入 :600,按回车键光标会跳转到第600行
  • vim +n 文件名 :使光标在正常模式下直接跳转到第n行,例如 vim +10 nation.tbl
  • n| :跳转到当前行的第n个字符,例如 3| 会使光标跳转到当前行的第3个字符。(空格也算一个字符)

5.3.删除、复制、粘贴

进入一般模式后,可在键盘输入以下,实现删除、复制、粘贴。

  • x,X:在一行字中,x 为向后删除一个字符(相当于[Del]键),X 为向前删除一个字符(相当于[Backspace])
  • dd:删除光标所在的一整行。 ndd:删除光标所在的向下 n 行。
  • s:删除光标所在字符并进入编辑模式
  • d+w:删除光标往后的整个单词
  • yy:复制光标所在的一行。
  • nyy:复制光标所在的向下 n 行。
  • p,P:p 为将已复制的内容在光标的下一行粘贴,P 则为粘贴在光标的上一行。
  • D(shift +d) d+$(shift+4):删除当前行光标后的所有字符
  • d+0 d+^ :删除当前行光标前的所有字符

5.4.插入模式

进入一般模式后,可在键盘输入以下,切换到插入模式,进行文件编辑操作。

  • i,I:进入插入模式,i 为从目前光标所在处插入。I 为在目前所在行的第一个非空格字符处开始插入。
  • a,A:进入插入模式。a 为从目前光标所在处的下一个字符处开始插入。A 为从所在行的最后一个字符处开始插入。
  • o,O:进入插入模式。o 为在下一行插入。O 为在上一行插入。

5.5.查找、替换

按 vi 进入文件后,可进行以下操作进行查找和替换

  • /xxx:向下寻找一个名称为 xxx的字符串。
  • ?xxx:向上寻找一个名称为 xxx的字符串。
  • ^:表示匹配行首
  • $:表示匹配行尾
  • :n1,n2s/xxx1/xxx2/g:在第 n1 行和 n2行之间寻找 xxx1 这个字符串,并且将其替换为 xxx2.
  • :1,$s/xxx1/xxx2/g:从第一行到最后一行寻找xxx1 这个字符串,并且将其替换为xxx2.
  • :1,$s/xxx1/xxx2/gc:从第一行到最后一行寻找xxx1 这个字符串,并且将其替换为xxx2.且在替换前显示提示字符给用户确认是否需要替换。

5.6.保存退出

编辑数据后切换到末行模式,":w"命令表示将当前编辑的内容保存到文件中,而":q"命令表示退出vim编辑器

  • 保存并退出:":wq"或者":x"
  • 丢弃修改并退出:":q!"
  • 强制保存并退出:":wq!"
  • 保存但不退出:":w"
  • 放弃编辑并退出:":q!"

5.7.vim列编辑

  • 列删除 ctrl+v, 选中后 d
  • 列插入 ctrl+v, 选中后 I(大写i),编辑完毕后两次ESC
  • 列替换 ctrl+v, 选中后 s ,编辑完毕后两次ESC
  • 列复制 ctrl+v, 选中后 y
  • 列粘贴 p

5.8.合并行

命令模式下执行

  • J:将下一行合并到光标当前行,中间以空格分隔
  • gJ:将下一行合并到光标当前行,中间无符号分隔
  • vGJ:将文件所有行合并为一行,中间以空格分隔
  • vGgJ:将文件所有行合并为一行,中间无符号分隔

5.9.常用末行模式

bash 复制代码
1.查看文件编码 
:set fileencoding 

2.修改文件编码 
:set fileencoding=utf-8 

3.显示行号
:set nu /number 

4.取消行号 
:set nonu  

5.搜索时忽略大小写(先set ic 再 /搜索)
:set ic

6.把6到10行 粘贴到20行下面
:6,10 co 20 

7.删除6到10行
:6,10 d  

8.把外面复制的内容复制到文件中(源内容可能会出现粘贴成一行的情况,:set paste可以粘贴成多行)
:set paste 

5.10.文件对比

bash 复制代码
vim -d nation.tbl nation_1.tbl # 输出内容显示不全
vim -d -c 'set wrap' -c 'wincmd w' -c 'set wrap' aa ab # 输出内容换行显示(显示全)
vimdiff -c 'set wrap' -c 'wincmd w' -c 'set wrap' aa.txt ab.txt
vimdiff +"windo set wrap" aa ab
相关推荐
跃渊Yuey7 分钟前
【Linux】线程同步与互斥
linux·笔记
杨江8 分钟前
seafile docker安装说明
运维
舰长11510 分钟前
linux 实现文件共享的实现方式比较
linux·服务器·网络
好好沉淀15 分钟前
Docker开发笔记(详解)
运维·docker·容器
zmjjdank1ng24 分钟前
Linux 输出重定向
linux·运维
路由侠内网穿透.26 分钟前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
树℡独29 分钟前
ns-3仿真之应用层(三)
运维·服务器·ns3
VekiSon44 分钟前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发
zl_dfq1 小时前
Linux 之 【进程信号】(signal、kill、raise、abort、alarm、Core Dump核心转储机制)
linux
Ankie Wan1 小时前
cgroup(Control Group)是 Linux 内核提供的一种机制,用来“控制、限制、隔离、统计”进程对系统资源的使用。
linux·容器·cgroup·lxc