Mac 下 VIM 的简单使用

Mac 下 VIM 的简单使用

2018-08-30 | |

Vim is a highly configurable text editor for efficiently creating and changing any kind of text.
VIM - https://www.vim.org

简单介绍

vim 是一种高效的文本编辑器,而且Mac电脑自带此编辑器,使用起来非常方便。


注:以下命令的输入都是指在切换到英文输入法的前提下实现的。

初步体验

1
2
3
4
5
6
7
8
9
10
11
创建文件(终端)
vi one.txt

输入 i 进行内容编辑
i

编辑完后,按下键盘左上角的 Esc 键,结束编辑
Esc

保存并退出
:wq

工作模式

vim 共分为三种模式,命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。

命令模式 Command Mode

用户刚刚启动 vi/vim,便进入了命令模式。
此模式下从键盘输入的字符会被 vim 识别为命令。

输入模式 Insert Mode

在命令模式下按下 i 或 I(o、O、a、A) 就进入了输入模式。
在此模式下用户从键盘输入的字符会被记录在文本中,用户可以在此模式下进行文本的输入与编辑。

底线命令模式 Last Line Mode

在命令模式下按下 :(英文冒号)就进入底线命令模式。
在此模式下用户可以输入单个或多个字符的命令来进行对文档的编辑。

模式切换

  • 命令模式切换到输入模式
输入字符 说明
i 从目前光标所在处开始插入
I 从目前光标所在行的第一个非空格符处开始插入
a 从目前光标所在的下一个字符处开始插入
A 目前光标所在行的最后一个字符处开始插入
o 目前光标所在行的下一行插入新的一行
O 目前光标所在行的上一行插入新的一行
  • 输入模式切换到命令模式
    1
    按下键盘左上角的 Esc 键
  • 命令模式切换到底线命令模式
    1
    输入英文的冒号( : )
  • 底线命令模式切换到命令模式
    1
    按下键盘左上角的 Esc 键,或者 回车键(Enter)

命令介绍

光标移动

命令模式 说明
h 或 向左箭头键(←) 光标向左移动一个字符
nh 光标向左移动 n 个字符,如:10h 表示光标向左移动 10 个字符
j 或 向下箭头键(↓) 光标向下移动一个字符
nj 光标向下移动 n 个字符,如:10j 表示光标向下移动 10 个字符
k 或 向上箭头键(↑) 光标向上移动一个字符
nk 光标向上移动 n 个字符,如:10k 表示光标向上移动 10 个字符
l 或 向右箭头键(→) 光标向右移动一个字符
nl 光标向右移动 n 个字符,如:10l 表示光标向右移动 10 个字符
【Ctrl】+【f】 屏幕向下移动一页
【Ctrl】+【b】 屏幕向上移动一页
0 移动到光标所在行的第一个字符处
$ 移动到光标所在行的最后一个字符处
{ 移动到光标所在的那一段的段头处
} 移动到光标所在的那一段的段尾处
G 移动到文档的最后一行
gg 移动到文档的第一行
数字 +【Enter】 光标向下移动若干行
如:10【Enter】 表示光标向下移动 10 行
:数字 +【Enter】 光标移动到指定行
如::10【Enter】 表示光标移动到文档的第 10 行
w 移动到光标所在位置的下一个单词的开头
e 移动到光标所在位置的下一个单词的结尾
b 移动到光标所在位置的前一个单词的开头
ge 移动到光标所在位置的前一个单词的结尾
# 移动到上一个与当前光标所在单词相同单词的前面
* 移动到下一个与当前光标所在单词相同单词的前面
% 匹配括号移动,包括 (、[、{
注:需要将光标先移动到括号上
【f】+ 字符 移动光标到同行的下一个指定字符处
如:fc 表示将光标向后移动到距离最近的那个 c 字符处(只在本行移动)
【F】+ 字符 移动光标到同行的上一个指定字符处
如:Fc 表示将光标向前移动到距离最近的那个 c 字符处(只在本行移动)
【t】+ 字符 移动光标到同行的下一个指定字符的前一个字符处
如:tc 表示将光标向后移动到距离最近的 c 字符的前一个字符处(只在本行移动)
     dtc 表示从光标所在位置向后删除,直到遇到 c 字符(不删除 c 字符)
【/】+ 关键字 + 【Enter】 从光标所在的位置向下寻找文档中出现的关键字
如:/word 表示在文档中搜索 word 这个单词
:n1,n2s/word1/word2/g 将第 n1 与 n2 行之间所有名字为 word1 的字符串替换为 word2
n1,n2 为数字。
g 表示全局。
:n1,$s/word1/word2/g 从第 n1 行开始将文档中所有名字为 word1 的字符串替换为 word2
n1 为数字。
g 表示全局。

文档编辑

命令模式 说明
x 向后删除一个字符
nx 光标向后删除 n 个字符,如:4x 表示从光标位置开始向后删除 4 个字符
X 向前删除一个字符
nX 光标向前删除 N 个字符,如:4X 表示从光标位置开始向前删除 4 个字符
r 替换光标所在位置的那个字符,只会替换一次
当输入 r 命令后,此时 vim 进入单次替换模式,光标所在位置的那个字符会被替换为以后从键盘上输入的某个字符,如:当输入 r 命令后,我们又从键盘上输入了一个字符 A,那么光标所在位置的那个字符会被替换为 A,此时替换结束
R 从光标所在位置处开始进行替换,直到按下【ESC】键结束替换
当输入 R 命令后, 此时 vim 进入连续替换模式,从光标所在位置处开始,后面的字符会被依次进行替换,直到按下【ESC】键结束替换,如:当输入 R 命令后,我们又从键盘上输入了 ABCD,那么光标所在位置后面的4个字符会被替换为ABCD,此时替换模式没有结束,会一直进行下去,直到按下【ESC】键结束
dd 删除光标所在的那一行
ndd 从光标所在的那一行开始删除,从上至下删除 n 行,如:3dd 表示从光标所在的那一行开始向下删除,总共删除3行(包括光标所在的那行)
yy 复制光标所在的那一行
nyy 从光标所在的那一行开始复制,从上至下复制 n 行,如:3yy 表示从光标所在的那一行开始向下复制,总共复制3行(包括光标所在的那行)
p 将已复制的数据粘贴到光标的后面
npp 已复制的数据粘贴 n 次
u 复原前一个动作(撤销)
数字 + 【i】+ 字符 重复输入多个字符
如:10iA 表示输入10个 A
~ 改变光标所在字符的大小写
<范围1>gu(U)<范围2> 将范围1到范围2之前的所有字母转换成小写或者大写。
如:ggguG 表示把开头到最后一行之间的字母全部变为小写
【Ctrl】+ 【n】 在输入模式下,你可以输入一个词的开头,然后按 ,自动补齐功能就出现了
:set nu 显示行号。设定之后,会在每一行的前面显示该行的行号
:set nonu 取消行号
<< 向左缩进一个 Tab 宽度
>> 向右缩进一个 Tab 宽度
:ce + 【Enter】 本行文字居中
:le + 【Enter】 本行文字靠左
:ri + 【Enter】 本行文字靠右
:e fileName 添加一个文件
:r fileName 插入文件到指定行
:n 切换到下一个文件
:N 切换到上一个文件
:buffers 显示文件列表
:buffer fileName 切换到指定的文件
:w 将编辑的数据写入硬盘档案中
:w! 强制将编辑的数据写入硬盘档案中
:q 退出关闭文档不存储
:q! 强制退出关闭文档不存储
:wq 存储后关闭文档
:wq! 强制存储后关闭文档

其它补充

区域选择
<action>a<object> 或 <action>a<object>

action:命令,如:d(删除)、y(拷贝)、v(可视模式选择)
object:操作对象,如:w(一个单词)、s(一个句子)、p(一个段落)、某个特定的字符(,).)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
假如你有一个字符串(map(+)("foo")) 而光标在第一个 o 的位置

光标会选择 foo
vi"

光标会选择 "foo"
va"

光标会选择 "foo"
vi)

光标会选择 ("foo")
va)

光标会选择 map(+)("foo")
v2i)

光标会选择 (map(+)("foo"))
v2a)

块操作
【Ctrl】+ 【v】

1
2
3
4
5
6
7
8
9
10
11
12
13
0<Ctrl + v>jI---<ESC>

移动到行头
0

开始块操作
<Ctrl + v>

向下移动
j

插入 --- 使每一行生效
I---<ESC>

分屏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
上下分屏(当前正在编辑的文件)
:sp

上下分屏(可以打开另一个文件进行分屏编辑)
:sp fileName

左右分屏(当前正在编辑的文件)
:vsp

左右分屏(可以打开另一个文件进行分屏编辑)
:vsp fileName

上下分屏编辑 file1 与 file2
vi -on file1 file2

左右分屏编辑 file1 与 file2
vi -On file1 file2

添加一个新文件,并分屏编辑
:new fileName

切换不同的分屏
<Ctrl + w + w>

关闭其它所有分屏,只保留当前分屏
:only