VIM

建议全程使用英语输入法

  • 简介:vim 即 vi improved,现在已经全面替代vi,如果想用vi ,只能用vim -C 唤出vi模式。
  • xxxxxxxxxx10 1# 启动frps2sudo systemctl start frps3# 自启动4sudo systemctl enable frps5# 重启应用6sudo systemctl restart frps7# 停止应用8sudo systemctl stop frps9# 查看应用的日志10sudo systemctl status frpsshell
1
2
vim flie    #打开文件 可编写
view file 或 vim -R file #只读文件

命令模式

vim 打开文件将进入命令模式,此时不能直接编辑文档

光标移动

  • h 向左移动光标
  • l (小写的L)向右移动光标
  • j 向下移动光标
  • k 向上移动光标

img

光标跃起

如果先按一个数字,再按光标移动对应的四个键,可以指定跳过多少

  • 0 移动光标到行首
  • ^ 移动光标到行首
  • $ 移动光标到行尾
  • w 移动到下个单词开始
  • e 移动到下个单词结尾
  • b 移动到上个单词开始

文章跳转

  • gg 跳转到文章第一行
  • G 跳转到文章最后一行
  • 10G 转到第10行,numG是第num行
  • :10 也是转到第10行,先使用 :set number 唤出编号(下面有提到)

文章翻页

  • ^F 向下 翻页 ctrl+f
  • ^B 向上 翻页 ctrl+b
  • ^U 向上 翻半页 ctrl+u
  • ^D 向下 翻半页 ctrl+d

设置行号

  • :set number 标出行号
  • :set nonumber 取消行号

查找

  • / pattern 向下查找内容(pattern是要查找的文本,以下类同)

命令模式下,按**/键后:命令行(屏幕底部)会显示一个/**字符,随后可以键入想查找的文本,再按回车,vim就会查找下一个匹配的文本。

如:

/lthero 按下回车后,光标就会跳转到该文本上。此时按n就会跳到下一个匹配的文本,按N会跳到上一个匹配的文本。

  • ? pattern 向上查找内容(pattern)

替换与复制

  • yy 复制光标所在行
  • p 粘贴剪切版的内容

全文复制:

  • ggyG:将光标移动到文章开头,复制到文章末尾
  • Gygg:将光标移动到文章末尾,复制到文章开头

替换

  • r 替换一个字符 。按一个r 替换一个字符
  • R 进入**替换模式,将一直替换,**直到按^C退出

指定行替换(进入输入命令的模式,按shift+:)

  • :s/pattern/replace/ 可将光标所在行的pattern替换成指定内容(replace),只替换从第一行中的第一个匹配项、
  • :s?pattern?replace 则从最后一行开始,替换这行第一个匹配项
1
2
3
4
5
6
1:Linux Linux Linux
~
~
:s/Linux/Unix/
#结果
1:Unix Linux Linux
  • :s/pattern/replace/g (global) 一整行的pattern全部替换
1
2
3
4
5
6
1:Linux Linux Linux 
~
~
:s/Linux/Unix/g
#结果
1:Unix Unix Unix
  • :s/pattern/replace/gc (global confirm) 整行替换 替换之前将咨询
1
replace with Unix (y/n/a/q/l/^E/^Y)?
  • : NUMs/pattern/replace**/g** 将第NUM行,整行的pattern替换**(如果不加/g,还是只换一个)**
1
2
3
4
5
6
10:Linux Linux Linux 
~
~
:10s/Linux/Unix/g
#结果
10:Unix Unix Unix
  • : N,Ms/pattern/replace**/g** 将N-M行内进行替换
1
2
3
4
5
6
7
8
9
10
10:Linux Linux Linux 
11:Linux Linux Linux
12:Linux Linux Linux
13:Linux Linux Linux
14:Linux Linux Linux
~
~
:10,14s/Linux/Unix/g
#结果
10~14:Unix Unix Unix

全文替换

  • 用**.(dote)代表当前行,$(dollar)代表最后一行,%** 代表在编辑缓存区(已经保存的文章)的全部行
1
2
3
4
5
:.,$s/pattern/replace/g   全文替换

:1,.s/pattern/replace/g 第一行到当前行替换

:1,$s/pattern/replace/g 或者 :%s/pattern/replace/g全文替换

删除/剪切

  • x 删除光标字符,其实会剪切到剪切板上,按p可以恢复(下面有讲到)
1
2
3
heiQnous #将光标放在Q处 
按x
heinous
  • X 删除光标左边字符
1
2
3
heiQnous #将光标放在n处 
按X
heinous
  • D 从光标处删除到行尾
1
2
3
4
Linux Unix PHP MySQL
光标放在H处
按D
Linux Unix P
  • dmve (加上方向键左右) d左 就等同于X d右 等同于x
  • dd 删除(剪切)一行
1
2
:10,20d #删除10-20行
:1,$d #删除全文
  • db 删除光标前一个单词

全文删除:

  • ggdG:将光标移动到文章开头,删除到文章末尾
  • Gdgg:将光标移动到文章末尾,删除到文章开头

撤销

  • u 撤销一步

从删除中恢复/粘贴

  • p 将删除内容剪贴板内容恢复,恢复到光标下一行

#1、2:指行号

1
2
3
4
5
6
7
8
9
1:Linux Linux Linux
2:Unix Unix Unix
:1d
#将第一行删除
2:Unix Unix Unix
#光标在第一个U
#按p
1:Unix Unix Unix
2:Linux Linux Linux
  • P 恢复到光标上一行

复制&移动行

  • 命令:co(copy)

: 5co10 复制第5行,插入到第10行下面

: 5**,10co20 复制5~10行,一同插入到第20行下面**

  • 命令:m(move)

: 5m10 移动第5行,插入到第10行下面

: 4,8m20 移动4~8行,一同到20行下面

: 1,.m$ 第一行~当前移动,插入到最后一行

合并两行

按大写J 将当前行和下一行合并,在合并处会自动留下一个空格

1
2
3
4
this is a
short sentence
按J
this is a short sentence

执行命令

进入命令模式后,按冒号,进入执行命令模式

:!date,可以在原来的shell中执行命令,并能看到结果

1
2
3
4
[No write since last change]
Mon 26 Jul 2021 03:19:59 PM CST

Press ENTER or type command to continue #按return返回

:!! 执行上一条命令

:!sh 将暂停vi,打开一个新的shell,如 !bash

编辑过程中切换文件

  • :e document

切换新文件时,原先在缓存中的文件就会丢失,所以要保存原文件

一般地,若未保存,vim不让切换

e! document 强制切换

宏Macros

  • :map x commands

功能:

  • 将命令以x代替

**如:*在每行首添加注释/

1
:map ^_ I/*<ESC>      #(直接输入<ESC>) 或者 ESC是^[ ,删除是^H

其中的I是进入到当前行首,

用unmap取消宏命令

  • :unmap x

将已有文件插入

1
:[line]r file    r是read,表示在line行插入file文件内容
  • 功能:将file整个讲稿并插入到指定行
1
2
3
4
:10r file  #插入第10行
:0r file #到第一行
:$r file #到末尾
:r file #到光标行
  • 如果不写数字,vim将自动添加光标所在行

结合执行命令

1
2
3
:r !ls    #将 ls 结果添加到当前行
:0r !date #添加时间到文章开头
:0r !whoami #添加作者

写入文件

  • **:**w 写入原文件

**:**w file 写入新文件

  • **:**w! file 覆盖写入已存在文件

**:**w>> file 追加写入

1
2
:10,20w >>file 将10到20行追加写入文件中
:wq 保存并退出 效果等同ZZ,但不等同ctrl+z,ctrl+z是挂起当前进程

退出

  • 保存并退出可以用快捷键ZZ,或者**:wq**

用ZZ为了不误触,导致不小心退出

  • 注意 强制退出vim
1
:q!<Return>
  • 其中的!(bang)告诉vim 不要管我是否保存了数据(可能造成丢失)

输入模式

  • 将退出输入模式

插入

  • 按 i 光标处向前插入 I 插入到行首
1
2
3
Kankakee 在把光标移动到K上面
输入ibbb
bbbKankakee
  • o光标下行插入 O光标上行插入
  • a光标处后插入 A插入到行尾
1
2
3
Kankakee 在把光标移动到K上面
输入ibbb
Kbbbankakee
  • **^W(ctrl+w)**删除一个单词
  • ^U (ctrl+u)或 ^X(ctrl+x) 删除一行 (这是在编辑模式中)

修改

  • s (substitute) 将光标处字符删除并进入编辑模式
  • C 将光标处字符到结尾处字符全部删除 进入编辑模式
  • S 或 cc 将整个行全部剪切,并进入编辑模式,而且光标在原来这行。与dd不同,dd只删除不进入编辑

恢复数据

若在编辑模式下长时间未保存,并且vim突然中断,那未保存内容将在隐藏的****.file.swap文件

  • 如ssh连接突然中止,或者电脑关机
1
2
3
4
#用命令
vim -r(recover) file
#
可以恢复原有数据
  • 如果删除隐藏文件,再打开原文件,数据只会显示到上次保存位置
  • 所以,先恢复文件,再rm .swap文件

细节

vim 将空行用~代替
vim 中不能用(ctrl+c) 如果要输入^C 用ctrl+v ctrl+c 输入^V要输入两次ctrl+v
tab键也用ctrl+i代替

可视区块

如果想要处理一个区块(以列为单位),如下这种格式:

192.168.1.1 host1.class.net
192.168.1.2 host2.class.net
192.168.1.3 host3.class.net
192.168.1.4 host4.class.net
192.168.1.5 host5.class.net
192.168.1.6 host6.class.net
192.168.1.7 host7.class.net
192.168.1.8 host8.class.net
192.168.1.9 host9.class.net

如果要把每行的host1再添加到这行末尾,如192.168.1.1 host1.class.net host1,我们可以使用以下命令进行操作

在一般命令模式下

v 字符选择,会将光标经过的字符反白选择

V 选择,会将光标经过的反白选择

ctrl+v 块选择,用矩形方式选择

y 将反白选择部分复制

d 将反白选择部分删除

p 将复制或删除的部分粘贴

1、将光标移动太第一行的host1的h上,按ctrl+v ,此时可以看到VISUAL BLOCK的字样img

2、将光标移动到最底部分,光标经过的区域会反色

img

3、按y进行复制,按下【y】后,反色的区域会不见

4、将光标移动到第一行的最右边,进入编辑模式,输入两个空格,再进入命令模式,按下【p】后就会粘贴成功

img

多窗口功能

如果有两个文件需要对照修改,总不能同时打开两个shell吧?vim也有划分窗口的功能!!!

在命令模式下:sp filename

1、如果要在新窗口打开另一个文件,就写对应的文件名,如果文件不存在会自动创建

img

2、filename也可以不写,如仅输入:sp 会在两个窗口打开同一个文件,而且会同步修改

img

img

此时,可以利用【ctrl+w+j】移动到下面窗口,【ctrl+w+k】移动到上面的窗口

自动补全

平时在用jetbrain全家桶习惯了自动补全,vim其实也有,而且功能强大。以下按键全部在编辑模式

1、以扩展名作为语法补充。注意:文件名后缀一定要改成对应的扩展名,如.html/.css/.c/.py

按键:ctrl+x 再按 ctrl+o

img

在输入</后按【ctrl+x 】和【ctrl+o】后将补全head>

2、以当前编辑的【文件内容文字】作为关键词,自动补全

按键:ctrl+x 再按 ctrl+n

img

如,当前有三个变量var11,var22,var33,想要输出时,只用在var后按【ctrl+x】和【ctrl+n】即可出现补全列表

3、以当前目录内的【文件名】作为关键词

ctrl+x 再按 ctrl+f

img

如,输入te后,按【ctrl+x】和【ctrl+f】即可出现当前目录文件名补全列表