现代编辑器食用指北 - Vim
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 的基本配置
安装 Vim
- 使用
yum下载 Vim:
yum install vim
- 使用
apt-get下载 Vim:
sudo apt-get update
sudo apt-get install vim
接下来就可以用 which 命令查找了
Vim 的基本操作
模式
Vim 有两种模式:
-
正常模式 (Normal-mode)
-
插入模式 (Insert-mode)
-
命令模式 (Command-mode)
-
可视模式 (Visual-mode)
在此我们仅讨论前三种模式
正常模式 (Normal-mode)
正常模式一般用于浏览文件,也包括一些复制、粘贴、删除等操作。这时击键时,一些组合键就是 vim 的功能键,而不会在文本中键入对应的字符。
正常模式也是一开始进入 Vim 时默认的模式。
或者可以通过敲下 Esc 键切换至该模式
插入模式 (Insert-mode)
插入模式顾名思义,就是编辑的模式,可以通过摁下一些特定字母进入,后文会详
细介绍。
命令模式
在正常模式中,按下 :(冒号)键或者 / (斜杠),会进入命令模式。
在命令模式中可以执行一些输入并执行一些 Vim 或插件提供的指令,就像在命令行里一样。
使用 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 进入插入模式的方式
注意:Vim 命令区分大小写!!!
-
i或者Insert, 表示从光标所在位置开始插入字符(最常用); -
I,表示从光标所在行开头开始插入字符(相当于i+Home); -
a, 表示从光标所在位置后一个开始插入字符(相当于i+\rightarrow ); -
A, 表示从光标所在行行尾插入字符(相当于i+End); -
o, 表示从光标所在行下一行行首开始插入字符(相当于i+End+Enter); -
O, 表示从光标所在行上一行行首开始插入字符(相当于\uparrow +i+End+ 'Enter'); -
s, 表示删除光标所在处的字符然后插入字符(相当于i+Delete); -
S, 表示删除光标所在行然后插入字符(相当于dd+i)。
综上,只用学会 i 就好了
插入模式的使用和记事本基本没有区别。
Vim 命令模式基本操作
基本命令
-
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;
以上就是基本操作所需知道的命令啦!
Vim 普通模式基本快捷键
移动
-
h表示向左移动光标; -
l表示相当于向右移动光标 -
j表示向下移动光标; -
k表示向上移动光标。
1 ~ 4 用好了可以代替
-
0表示移动到当前行行头,相当于Home键; -
^表示移动到当前行第一个非blank的字符; -
-
g_表示移动到当前行最后一个非blank的字符; -
w表示移动到本行下一个单词开头; -
e表示移动到本行下一个单词结尾; -
B表示移动到本行上一个单词开头; -
fa表示移动到本行下一个a字符处; -
nfa(n 是自然数) 表示移动至光标后第n 个a字符处; -
nG表示移动至第n 行的行首; -
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表示粘贴内容,如果复制内容是整行,则从上一行开始粘贴。如果复制的是一部分内容,则从光标所在位置开始粘贴。
Vim 的基本配置
配置文件
配置文件分为两种,一种是系统配置文件,存放于 /usr/share/vim/vimrc , 另一种是用户配置文件,存放于用户主目录 ~/.vimrc 中。
没有可以自行新建。
注意:用户配置文件高于系统配置文件!
基本方法
先打开配置文件,然后开始配置。
-
突出显示当前行:
set cul; -
突出显示当前列:
set cuc; -
显示行号:
set nu; -
显示括号匹配:
set showmatch; -
设置 tab 长度为
4 个空格:set tabstop=4; -
设置自动缩进长度为
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