vi 编辑器

Wesley13
• 阅读 721

Linux下的文本编辑器有很多种,vi 是最常用的,也是各版本Linux的标配 注意,vi 仅仅是一个文本编辑器,可以给字符着色,可以自动补全,但是不像 Windows 下的 word 有排版功能

Vim 是 Vi improved 的缩写,是 vi 的改进版。在Linux中,vi 被认为是事实上的标准编辑器,因为:

  • 所有版本的 Linux 都带有 vi 编辑器;
    
  • 占用资源少;
    
  • 与 ed、ex 等其他编辑器相比,vi 对用户更加友好。
    

你可以使用 vi 编辑器编辑现有的文件,也可以创建一个新文件,还能以只读模式打开文本文件。

通过以下方式进入 vi 编辑器

命令

描述

vi filename

如果filename存在,则打开;否则会创建一个新文件再打开。

vi -R filename

以只读模式(只能查看不能编辑)打开现有文件。

view filename

以只读模式打开现有文件。

工作模式

  1. 普通模式
    由Shell进入vi编辑器时,首先进入普通模式。在普通模式下,从键盘输入任何字符都被当作命令来解释。普通模式下没有任何提示符,输入命令后立即执行,不需要回车,而且输入的字符不会在屏幕上显示出来。 普通模式下可以执行命令、保存文件、移动光标、粘贴复制等
  2. 编辑模式
    编辑模式主要用于文本的编辑。该模式下用户输入的任何字符都被作为文件的内容保存起来,并在屏幕上显示出来。
  3. 命令模式
    命令模式下,用户可以对文件进行一些高级处理。尽管普通模式下的命令可以完成很多功能,但要执行一些如字符串查找、替换、显示行号等操作还是必须要进入命令模式。
    注意:有些教程中称有两种工作模式,是把命令模式合并到普通模式。

工作模式切换

  • 在普通模式下输入 i(插入)、c(修改)、o(另起一行) 命令时进入编辑模式;按 esc 键退回到普通模式。
  • 在普通模式下输入冒号(:)可以进入命令模式。输入完命令按回车,命令执行完后会自动退回普通模式。

提示:如果不确定当前处于哪种模式,按两次 Esc 键将回到普通模式。

:w 保存文件但不退出vi 
:w file 将修改另外保存到file中,不退出vi 
:w! 强制保存,不推出vi 
:wq 保存文件并退出vi 
:wq! 强制保存文件,并退出vi 
q: 不保存文件,退出vi 
:q! 不保存文件,强制退出vi 
:e! 放弃所有修改,从上次保存文件开始再编辑

退出之前,你也可以在 w 命令后面指定一个文件名,将文件另存为新文件,例如: w filename2 将当前文件另存为 filename2。

移动光标

命令

描述

k

向上移动光标(移动一行)

j

向下移动光标(移动一行)

h

向左移动光标(移动一个字符)

l

向右移动光标(移动一个字符)

两点提醒:

  • vi 是区分大小写的,输入命令时注意不要锁定大写。
  • 可以在命令前边添加一个数字作为前缀,例如,2j 将光标向下移动两行。

当然,还有很多其他命令来移动光标,不过记住,一定要在普通模式(按两次 Esc 键)下。

控制命令

命令

描述

CTRL+d

向前滚动半屏

CTRL+f

向前滚动全屏

CTRL+u

向后滚动半屏

CTRL+b

向后滚动整屏

CTRL+e

向上滚动一行

CTRL+y

向下滚动一行

CTRL+I

刷新屏幕

编辑文件
切换到编辑模式下才能编辑文件。有很多命令可以从普通模式切换到编辑模式,如下所示:

命令

描述

i

在当前光标位置之前插入文本

I

在当前行的开头插入文本

a

在当前光标位置之后插入文本

A

在当前行的末尾插入文本

o

在当前位置下面创建一行

O

在当前位置上面创建一行

删除字符
下面的命令,可以删除文件中的字符或行:

命令

说明

x

删除当前光标下的字符

X

删除光标前面的字符

dw

删除从当前光标到单词结尾的字符

d^

删除从当前光标到行首的字符

d$

删除从当前光标到行尾的字符

D

删除从当前光标到行尾的字符

dd

删除当前光标所在的行

可以在命令前面添加一个数字前缀,表示重复操作的次数,例如,2x 表示连续两次删除光标下的字符,2dd 表示连续两次删除光标所在的行。 建议各位读者多加练习上面的命令,再进一步深入学习。

修改文本
如果你希望对字符、单词或行进行修改,可以使用下面的命令:

命令

描述

cc

删除当前行,并进入编辑模式。

cw

删除当前字(单词),并进入编辑模式。

r

替换当前光标下的字符。

R

从当前光标开始替换字符,按 Esc 键退出。

s

用输入的字符替换当前字符,并进入编辑模式。

S

用输入的文本替换当前行,并进入编辑模式。

粘贴复制
vi 中的复制粘贴命令:

命令

描述

yy

-复制当前行

nyy

-复制n行

yw

-复制一个字(单词)

nyw

-复制n行

p

-将复制的文本粘贴到光标后面

P

-将复制的文本粘贴到光标前面

高级命令
下面的一些命令虽然看起来有些古怪,但是会让你的工作更有效率,如果你是 vi 重度用户,就了解一下吧。

命令

说明

J

将当前行和下一行连接为一行

<<

将当前行左移一个单位(一个缩进宽度)

>>

将当前行右移一个单位(一个缩进宽度)

~

改变当前字符的大小写

^G

Ctrl+G组合键可以显示当前文件名和状态

U

撤销对当前行所做的修改

u

撤销上次操作,再次按 'u' 恢复该次操作

:f

以百分号(%)的形式显示当前光标在文件中的位置、文件名和文件的总行数

:f filename

将文件重命名为 filename

:w filename

保存修改到 filename

:e filename

打开另一个文件名为 filename 的文件

:cd dirname

改变当前工作目录到 dirname

:e #

在两个打开的文件之间进行切换

:n

如果用 vi 打开了多个文件,可以使用 :n 切换到下一个文件

:p

如果用 vi 打开了多个文件,可以使用 :n 切换到上一个文件

:N

如果用 vi 打开了多个文件,可以使用 :n 切换到上一个文件

:r file

读取文件并在当前行的后边插入

:nr file

读取文件并在第 n 行后边插入

文本查找
如果希望进行全文件搜索,可以在普通模式(按两次 Esc 键)下输入 / 命令,这时状态栏(最后一行)出现"/"并提示输入要查找的字符串,回车即可。 / 命令是向下查找,如果希望向上查找,可以使用 ? 命令。
这时,输入 n 命令可以按相同的方向继续查找,输入 N 命令可以按相反的方向继续查找。
搜索的字符串中可以包含一些有特殊含义的字符,如果希望搜索这些字符本身,需要在前面加反斜杠()。 部分特殊字符列表

字符

说明

^

匹配一行的开头

.

匹配一个字符

*

匹配0个或多个字符

$

匹配一行的结尾

[ ]

匹配一组字符

如果希望搜索某行中的单个字符,可以使用 f 或 F 命令,f 向上搜索,F 向下搜索,并且会把光标定位到匹配的字符。 也可以使用 t 或 T 命令:t 命令向上搜索,并把光标定位到匹配字符的前面;T 命令向下搜索,并把光标定位到匹配字符的后面。

set 命令
set 命令可以对 vi 编辑器进行一些设置。使用 set 命令需要进入命令模式。 :set 命令选项

命令

说明

:set ic

搜索时忽略大小写。

:set ai

设置自动缩进(自动对齐)。

:set noai

取消自动缩进(自动对齐)。

:set nu

显示行号。

:set sw

设置缩进的空格数,例如,将缩进空格数设置为4::set sw=4。

:set ws

循环搜索:如果直到文件末尾也没有查找到指定字符,那么会回到开头继续查找。

:set wm

设置自动换行,例如,设置距离边际2个字符时换行::set wm=2 。

:set ro

将文件类型改为只读。

:set term

输出终端类型。

:set bf

忽略输入的控制字符,如 BEL(响铃)、BS(退格)、CR(回车)等。

运行命令
切换到命令模式,再输入 ! 命令即可运行 Linux 命令。 例如,保存文件前,如果希望查看该文件是否存在,那么输入 :! ls 即可列出当前目录下的文件。 按任意键回到 vi 编辑器 。
文本替换
切换到命令模式,再输入 s/ 命令即可对文本进行替换。语法为::s/search/replace/g
search 为检索的文本
replace 为要替换的文本
g 表示全局替换。
几点提示
vi 编辑器的使用讲解完毕,但是请记住下面几点:

  • 输入冒号(:)进入命令模式,按两次 Esc 键进入普通模式。
  • 命令大小写的含义是不一样的。
  • 必须在编辑模式下才能输入内容。
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Linux中vim编辑器常用命令、文件查找、磁盘挂载、用户管理
Vim介绍Vim是全屏幕纯文本编辑器,是vi编辑器的升级版。vim不仅仅兼容vi所有的命令,而且高亮显示,vi只能运行在UNIX和Linux中,而vim可以跨平台运行在Windows,MACOS中。vim号称“编辑器之神”,具有无可匹敌的可扩展性。大部分Linux系统中,默认都会安装vim,在L
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
Linux
初识vi/vim文本编辑器1.vi和vim相同,都是文本编辑器,在vi模式下可以查看文本,编辑文本,是Linux最常用的命令,vi模式下分为三部分,第一部分一般模式,在一般模式中可以进行搜索字符等按键操作,按下i,o,a任意一个字符就可以进入编辑模式,按ESC回到一般模式,编辑模式下可以对
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
5个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这