vi
- Linux 下最常用的文本编辑器,也是各版本 Linux 默认自带的标配
- vi 除了文本编辑,还可以给字符着色、自动补全,但是不像 Windows 下的 word 有排版功能。
- 可以用来编辑现有的文件,也可以创建一个新文件,还能以只读模式打开文本文件。
vim
- Vim 是 Vi improved 的缩写,是 vi 的改进版,使用方法没什么区别。
一、基础 vi 命令
1、进入编辑器
可以通过以下方式进入 vi 编辑器:
命令 | 描述 |
---|---|
vi filename | 如果 filename 存在,则打开;否则会创建一个新文件再打开。 |
vi -R filename | 以只读模式(只能查看不能编辑)打开现有文件。 |
view filename | 以只读模式打开现有文件。 |
vi 创建一个新文件并打开:
$ vi testfile
|
~
~
~
~
~
~
"testfile" [New File]
- 竖线(|)代表光标的位置;
- 波浪号(~)代表该行没有任何内容。如果没有 ~,也看不到任何内容,那说明这一行肯定是有空白字符(空格、tab 缩进、换行符等)或不可见字符。
2、工作模式
进一步了解 vi 之前先来了解一下 vi 的工作模式,vi 有三种工作模式:
普通模式
- 由 Shell 进入 vi 编辑器时,首先进入普通模式。
- 从键盘输入任何字符都被当作命令来解释。
- 没有任何提示符,输入命令后立即执行,不需要回车,而且输入的字符不会在屏幕上显示出来。
- 可以执行命令、保存文件、移动光标、粘贴复制等。
- 输入 i(插入)、c(修改)、o(另起一行) 可进入编辑模式;按 esc 键退回普通模式。
- 输入冒号 (? 进入命令模式,输完命令按回车,命令执行完后会自动退回普通模式。
- 另外,如果不确定当前处于哪种模式,按两次 Esc 键将回到普通模式。
编辑模式
- 进行文本编辑
- 输入的任何字符都被作为文件的内容保存起来,并在屏幕上显示出来。
命令模式
- 进行一些高级处理,如字符串查找、替换、显示行号等操作
有些人可能会说有两种工作模式,其实是把命令模式合并到了普通模式。
3、退出 vi 编辑器
一般在命令模式下退出 vi 编辑器。
退出命令 | 说明 |
---|---|
q | 如果文件未被修改,会直接退回到Shell;否则提示保存文件。 |
q! | 强行退出,不保存修改内容。 |
wq | w 命令保存文件,q 命令退出 vi,合起来就是保存并退出。 |
ZZ | 保存并退出,相当于 wq,但是更加方便 |
w file | 退出之前,在 w 命令后面指定一个文件名,将文件另存为新文件 file |
vi 编辑文件时,用户的操作都是基于缓冲区中的副本进行的。如果退出时没有保存到磁盘,则缓冲区中的内容就会被丢失。
二、命令汇总
- vi 是区分大小写的,输入命令时注意不要锁定大写
- 为了不影响文件内容,必须在普通模式(按两次 Esc 键)下移动光标。
- 切换到编辑模式下才能编辑文件
类型 | 命令 | 描述 |
---|---|---|
移动光标 | k | 向上1行;2k 向上2行 |
- | j | 向下1行;2j 向下2行 |
- | 1G | 第1行 |
- | G | 最后一行 |
- | nG :n | 第 n 行 |
- | H nH M L nL | 屏幕顶部 距离屏幕顶部第 n 行的位置 屏幕中间 屏幕底部 距离屏幕底部第 n 行的位置 |
- | 0 或 | | 一行的开头 |
- | $ | 一行的末尾 |
- | h l | 向左一个字符 向右一个字符 |
- | w b | 下一个单词 上一个单词 |
- | n| | 当前行第 n 列 |
编辑文本 | yy nyy | 复制当前行 复制 n 行 |
- | p | 将复制的文本粘贴到光标后面 |
- | dd | 删除当前行 2dd:连续两次删除光标所在的行 |
- | x X | 删除当前光标后面 / 前面的字符 2x 连续两次删除光标后的字符 |
- | d^ | 删除从当前光标到行首的字符 |
- | d$ D | 删除从当前光标到行尾的字符 |
- | U u | 撤销对当前行所做的修改 撤销上次操作,再次按 ‘u’ 恢复该次操作 |
操作文件 | :f | 显示文件名、文件总行数、当前行的位置(百分号 % 形式) |
- | :f file1 | 复制为新文件 file1(要注意保存) |
- | :w file1 | 保存修改到 file1(一般使用 :wq 保存并退出) |
- | :set nu | 显示行号 |
文本查找 | / ? | 向下查找 向上查找(后面直接跟要查找的字符串即可) |
- | n N | 按相同的方向继续查找 按相反的方向继续查找 |
文本替换 | :s/search/replace/g | search 为检索的文本,replace 为要替换的文本,g 表示全局替换 |
搜索的字符串中可以包含一些有特殊含义的字符,如果希望搜索这些字符本身,需要在前面加反斜杠 (\)。