CmsMartin
2022-02-08 15:05:47
Vim 是 Vi IMproved 的首字母缩写。它是由 Bram Moolenaar 编写的免费开源文本编辑器。 它于 1991 年首次针对 UNIX 类系统发布,其主要目标是为 Vi 编辑器提供增强功能。 Vim 被认为是克隆 Vi 编辑器。 像 Vi 一样,它也是以命令为中心的编辑器。学习 Vim 的一个优点是 - 它随处可用。 采用任何 UNIX 类系统,如 Linux,Mac,HP-UX,AIX 等等,默认情况下Vim是安装在系统中的。 ——来源
当然,NOI 竞赛也是可以用的。
本文仅针对 Linux 操作系统!!!
注:本文所有的操作实在基于 Windows 的 Linux 发行版上进行的。
安装 Vim
Vim 的基本操作
Vim 进入插入模式的方式
Vim 命令模式基本操作
Vim 普通模式基本快捷键
Vim 的基本配置
yum
下载 Vim:yum install vim
apt-get
下载 Vim:sudo apt-get update
sudo apt-get install vim
接下来就可以用 which
命令查找了
Vim 有两种模式:
正常模式 (Normal-mode)
插入模式 (Insert-mode)
命令模式 (Command-mode)
可视模式 (Visual-mode)
在此我们仅讨论前三种模式
正常模式一般用于浏览文件,也包括一些复制、粘贴、删除等操作。这时击键时,一些组合键就是 vim 的功能键,而不会在文本中键入对应的字符。
正常模式也是一开始进入 Vim 时默认的模式。
或者可以通过敲下 Esc
键切换至该模式
插入模式顾名思义,就是编辑的模式,可以通过摁下一些特定字母进入,后文会详
细介绍。
在正常模式中,按下 :
(冒号)键或者 /
(斜杠),会进入命令模式。
在命令模式中可以执行一些输入并执行一些 Vim 或插件提供的指令,就像在命令行里一样。
假设你要打开的文件名为 AKIOI.cpp
;
那么只需在命令行嵌入 vim AKIOI.cpp
即可。
假设你要打开两个文件,名字分别为 AKNOI.cpp
和 AKIOI.cpp
那么只需要在命令行嵌入 vim AKNOI.cpp AKIOI.cpp
即可
打开多个文件后默认 Vim 是停留在第一个文件(即用例中的 AKNOI.cpp
),那么如何切换至其他的文件呢?
首先我们需要进入命令模式,在嵌入命令 ls
查看我们现在打开的文件,如图
我们可以嵌入 b1
来切换至第一个文件,同理嵌入 b2
切换至第二个文件。
特别的,可以嵌入 bn
切换至下一个文件 , bp
切换至上一个文件。
但是,这样的效率比较慢,隔壁家 VsCode 可以分屏打开多个文件,咱 Vim 也行。
老规矩,假设要打开的文件是 AKNOI.cpp
和 AKIOI.cpp
。
那么左右分屏打开这两个文件只需在命令行嵌入 vim -On AKNOI.cpp AKIOI.cpp
即可。
上下分屏打开这两个文件只需在命令行嵌入 vim -on AKNOI.cpp AKIOI.cpp
即可。
假设一个名为 AKIOI.cpp
的文件非常的长,但是你想上下对比着看这个文件,但不想翻页,那么只需在打开文件进入命令模式敲下 sp AKIOI.cpp
进行上下分屏(当然,接上其他的文件会向下分屏打开其他的文件)。
同理,嵌入 vsp AKIOI.cpp
进行左右分屏
分屏后,点击即可进入相应的文件(如果您为了装逼还可以查询 Ctrl + w
系列快捷键)。
弱弱的提一句,关闭分屏只需摁下 Ctrl + w + c
。
注意:Vim 命令区分大小写!!!
i
或者 Insert
, 表示从光标所在位置开始插入字符(最常用);
I
,表示从光标所在行开头开始插入字符(相当于 i
+ Home
);
a
, 表示从光标所在位置后一个开始插入字符(相当于 i
+
A
, 表示从光标所在行行尾插入字符(相当于 i
+ End
);
o
, 表示从光标所在行下一行行首开始插入字符(相当于 i
+ End
+ Enter
);
O
, 表示从光标所在行上一行行首开始插入字符(相当于 i
+ End
+ 'Enter');
s
, 表示删除光标所在处的字符然后插入字符(相当于 i
+ Delete
);
S
, 表示删除光标所在行然后插入字符(相当于 dd
+ i
)。
综上,只用学会 i
就好了
插入模式的使用和记事本基本没有区别。
w
, 表示保存文件(有时会提示需要强制保存,即为 w!
);
q
, 表示退出文件(有时会提示需要强制退出,即为 q!
);
wq
, 表示保存并退出(有时会提示需要强制保存并退出,即为 wq!
);
w file
, 表示保存并写入 file
;
qa
, 表示退出所有文件都不保存(有时会提示需要强制退出,即为 qa!
);
e file
, 表示打开 file
;
e!
, 表示放弃对文件的所有修改,恢复文件到上次保存的位置;
saveas IOI.cpp
, 表示另存为 IOI.cpp
;
Sex
, 表示水平分割一个窗口,浏览文件系统;
Vex
, 表示垂直分割一个窗口,浏览文件系统。
保存并退出还可以在普通模式下快速嵌入 ZZ
。
set nu
, 表示开启显示行号;set nonu
, 表示关闭显示行号;
set shiftwidth=n
(n
为具体数字),表示将自动缩进设为 n
(但不会改变 tab
的宽度);
n
(n
为具体数字) , 表示将光标移至第 n
行的缩进后(自认为很鸡肋的一个命令);
/字符串
, 表示在文件中查找该字符串(区分大小写),匹配到后按下 n
查找下一个 , 按下 N
查找上一个(从光标开始查找);
该命令比较特殊,在普通模式下直接输入即可,不用输入 :
ce
, 表示将光标所在行文本居中;ri
, 表示将光标所在行文本居右;
le
, 表示将光标所在行文本居左;
set ic
, 关闭区分大小写(关闭后查找 lxl
和查找 LXL
是一样的);
set noic
, 打开区分大小写;
s/lxl/noip
, 表示将当前行第一个 lxl
替换为 noip
;
s/lxl/noip/g
, 表示将当前行所有的 lxl
替换为 noip
;第 11
和 第 12
的命令还有一个用法,就是在命令开头加上数字表示对指定行操作,或者加上 dollor符 表示最后一行,或者两个用逗号隔开的数字表示区间。
将 520
行到 1314
行的 lxl
替换为 noip
: 520,1314s/lxl/noip
将 最后一行的 lxl
替换为 noip
: dollor符 s/lxl/noip
将 第 1
行的 lxl
替换为 noip
: 1s/lxl/noip
%s/lxl/noip
, 表示将所有的 lxl
替换为 noip
;11~13
的命令:当然,被替换的字符穿可以用正则表达式。
!Commond
(其中 Commond 是 Linux 命令) , 表示执行 Linux 命令如执行 !ping www.luogu.com.cn
r !Commond
(其中 Commond 是 Linux 命令) , 表示执行命令,并且添加结果至操作文本光标处;示例: r !echo I Love LXL FOREVER
map <key> <operation>
, 表示设置快捷键 key
为操作 operation
;示例:设置 Ctrl + x
为显示行号,命令为:
map ^x <ESC>:set nu<ESC>
其中 ^x
的嵌入方式就是摁下 Ctrl + x
,<ESC>
就是代表 ESC
ab noip lxl
, 表示将以后输入的 noip
自动替换为 lxl
;以上就是基本操作所需知道的命令啦!
h
表示向左移动光标;
l
表示相当于向右移动光标
j
表示向下移动光标;
k
表示向上移动光标。
1 ~ 4 用好了可以代替
0
表示移动到当前行行头,相当于 Home
键;
^
表示移动到当前行第一个非 blank
的字符;
g_
表示移动到当前行最后一个非 blank
的字符;
w
表示移动到本行下一个单词开头;
e
表示移动到本行下一个单词结尾;
B
表示移动到本行上一个单词开头;
fa
表示移动到本行下一个 a
字符处;
nfa
(a
字符处;
nG
表示移动至第
H
表示移动至当前显示的文档第一行行首;
M
表示移动至当前显示的文档中间行行首;
H
表示移动至当前显示的文档最后一行行首;
gg
表示移动到第一行行首;
G
表示移动到最后一行行首;
zt
表示将当前行移动至当前显示的文档第一行;
zz
表示将当前行移动至当前显示的文档中间行;
zb
表示将当前行移动至当前显示的文档最后一行;
Ctrl + d
表示向下翻半页;
Ctrl + u
表示向上翻半页;
Ctrl + f
表示向上翻整页;
Ctrl + b
表示向下翻整页;
x
表示删除光标后的字符;
X
表示删除光标前的字符;
dd
表示删除光标所在行;
ndd
(n
是自然数) 表示删除光标所在行(包括)下的 n
行
d1G
表示删除光标所在行到第一行;
dG
表示删除光标所在行到最后一行;
d
d0
表示删除光标所在字符到光标所在行第一个字符;
yy
复制光标所在行;
nyy
(n
是自然数) 表示复制光标所在行(包括)下的 n
行
y1G
表示复制光标所在行到第一行;
yG
表示复制光标所在行到最后一行;
y
y0
表示复制光标所在字符到光标所在行第一个字符;
u
表示撤销上一个操作;
Ctrl + r
表示反撤销
p
表示粘贴内容,如果复制内容是整行,则从下一行开始粘贴。如果复制的是一部分内容,则从光标的下一个字符开始粘贴;
P
表示粘贴内容,如果复制内容是整行,则从上一行开始粘贴。如果复制的是一部分内容,则从光标所在位置开始粘贴。
配置文件分为两种,一种是系统配置文件,存放于 /usr/share/vim/vimrc
, 另一种是用户配置文件,存放于用户主目录 ~/.vimrc
中。
没有可以自行新建。
注意:用户配置文件高于系统配置文件!
先打开配置文件,然后开始配置。
突出显示当前行: set cul
;
突出显示当前列: set cuc
;
显示行号: set nu
;
显示括号匹配: set showmatch
;
设置 tab 长度为 set tabstop=4
;
设置自动缩进长度为 set shiftwidth=4
;
继承上一行的缩进方式: set autoindent
;
显示光标所在位置: set ruler
;
设置中文编码:
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
开启语法高亮: syntax on
开启文件类型检测: filetype plugin indent on
其实还有很多配置,可以自己去查资料了解。
最后奉上蒟蒻的配置:(蒟蒻配置了 F5 一键运行)
set nu
set tabstop=4
set showmatch
set cul
set shiftwidth=4
syntax on
set ruler
filetype plugin indent on
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
set autoindent
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec '!g++ % -o %.exe'
exec '!time ./%.exe'
elseif &filetype == 'cpp'
exec '!g++ % -o %.exe -std=c++14 -O2'
exec '!time ./%.exe'
elseif &filetype == 'python'
exec '!time python %'
elseif &filetype == 'sh'
:!time bash %
endif
endfunc