现代编辑器食用指北 - Vim

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 发行版上进行的。

目录

  1. 安装 Vim

  2. Vim 的基本操作

  3. Vim 进入插入模式的方式

  4. Vim 命令模式基本操作

  5. Vim 普通模式基本快捷键

  6. Vim 的基本配置

安装 Vim

  1. 使用 yum 下载 Vim:
yum install vim
  1. 使用 apt-get 下载 Vim:
sudo apt-get update 
sudo apt-get install vim

接下来就可以用 which 命令查找了

Vim 的基本操作

模式

Vim 有两种模式:

在此我们仅讨论前三种模式

正常模式 (Normal-mode)

正常模式一般用于浏览文件,也包括一些复制、粘贴、删除等操作。这时击键时,一些组合键就是 vim 的功能键,而不会在文本中键入对应的字符。

正常模式也是一开始进入 Vim 时默认的模式。

或者可以通过敲下 Esc 键切换至该模式

插入模式 (Insert-mode)

插入模式顾名思义,就是编辑的模式,可以通过摁下一些特定字母进入,后文会详

细介绍。

命令模式

在正常模式中,按下 (冒号)键或者 / (斜杠),会进入命令模式。

在命令模式中可以执行一些输入并执行一些 Vim 或插件提供的指令,就像在命令行里一样。

使用 Vim 打开文件

打开单个文件

假设你要打开的文件名为 AKIOI.cpp

那么只需在命令行嵌入 vim AKIOI.cpp 即可。

打开多个文件

假设你要打开两个文件,名字分别为 AKNOI.cppAKIOI.cpp

那么只需要在命令行嵌入 vim AKNOI.cpp AKIOI.cpp 即可

打开多个文件后默认 Vim 是停留在第一个文件(即用例中的 AKNOI.cpp),那么如何切换至其他的文件呢?

首先我们需要进入命令模式,在嵌入命令 ls 查看我们现在打开的文件,如图

我们可以嵌入 b1 来切换至第一个文件,同理嵌入 b2 切换至第二个文件。

特别的,可以嵌入 bn 切换至下一个文件 , bp 切换至上一个文件。

但是,这样的效率比较慢,隔壁家 VsCode 可以分屏打开多个文件,咱 Vim 也行。

老规矩,假设要打开的文件是 AKNOI.cppAKIOI.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 命令区分大小写!!!

  1. i 或者 Insert , 表示从光标所在位置开始插入字符(最常用);

  2. I ,表示从光标所在行开头开始插入字符(相当于 i + Home);

  3. a , 表示从光标所在位置后一个开始插入字符(相当于 i + \rightarrow);

  4. A , 表示从光标所在行行尾插入字符(相当于 i + End);

  5. o , 表示从光标所在行下一行行首开始插入字符(相当于 i + End + Enter);

  6. O , 表示从光标所在行上一行行首开始插入字符(相当于 \uparrow + i + End + 'Enter');

  7. s , 表示删除光标所在处的字符然后插入字符(相当于 i + Delete);

  8. S , 表示删除光标所在行然后插入字符(相当于 dd + i)。

综上,只用学会 i 就好了

插入模式的使用和记事本基本没有区别。

Vim 命令模式基本操作

基本命令

  1. w , 表示保存文件(有时会提示需要强制保存,即为 w!);

  2. q , 表示退出文件(有时会提示需要强制退出,即为 q!);

  3. wq , 表示保存并退出(有时会提示需要强制保存并退出,即为 wq!);

  4. w file , 表示保存并写入 file

  5. qa , 表示退出所有文件都不保存(有时会提示需要强制退出,即为 qa!);

  6. e file , 表示打开 file;

  7. e! , 表示放弃对文件的所有修改,恢复文件到上次保存的位置;

  8. saveas IOI.cpp , 表示另存为 IOI.cpp;

  9. Sex , 表示水平分割一个窗口,浏览文件系统;

  10. Vex , 表示垂直分割一个窗口,浏览文件系统。

保存并退出还可以在普通模式下快速嵌入 ZZ

进阶命令

  1. set nu , 表示开启显示行号;

  1. set nonu , 表示关闭显示行号;

  2. set shiftwidth=nn 为具体数字),表示将自动缩进设为 n (但不会改变 tab 的宽度);

  1. nn 为具体数字) , 表示将光标移至第 n 行的缩进后(自认为很鸡肋的一个命令);

  2. /字符串 , 表示在文件中查找该字符串(区分大小写),匹配到后按下 n 查找下一个 , 按下 N 查找上一个(从光标开始查找);

该命令比较特殊,在普通模式下直接输入即可,不用输入 :

  1. ce , 表示将光标所在行文本居中;

  1. ri , 表示将光标所在行文本居右;

  2. le , 表示将光标所在行文本居左;

  3. set ic , 关闭区分大小写(关闭后查找 lxl 和查找 LXL 是一样的);

  1. set noic , 打开区分大小写;

  2. s/lxl/noip , 表示将当前行第一个 lxl 替换为 noip

  1. s/lxl/noip/g , 表示将当前行所有的 lxl 替换为 noip

11 和 第 12 的命令还有一个用法,就是在命令开头加上数字表示对指定行操作,或者加上 dollor符 表示最后一行,或者两个用逗号隔开的数字表示区间。

e.g.

520 行到 1314 行的 lxl 替换为 noip: 520,1314s/lxl/noip

将 最后一行的 lxl 替换为 noip: dollor符 s/lxl/noip

将 第 1 行的 lxl 替换为 noip: 1s/lxl/noip

  1. %s/lxl/noip , 表示将所有的 lxl 替换为 noip

11~13 的命令:当然,被替换的字符穿可以用正则表达式。

  1. !Commond (其中 Commond 是 Linux 命令) , 表示执行 Linux 命令

如执行 !ping www.luogu.com.cn

  1. r !Commond (其中 Commond 是 Linux 命令) , 表示执行命令,并且添加结果至操作文本光标处;

示例: r !echo I Love LXL FOREVER

  1. map <key> <operation> , 表示设置快捷键 key 为操作 operation;

示例:设置 Ctrl + x 为显示行号,命令为:

map ^x <ESC>:set nu<ESC>

其中 ^x 的嵌入方式就是摁下 Ctrl + x,<ESC> 就是代表 ESC

  1. ab noip lxl , 表示将以后输入的 noip 自动替换为 lxl

以上就是基本操作所需知道的命令啦!

Vim 普通模式基本快捷键

移动

  1. h 表示向左移动光标;

  2. l 表示相当于向右移动光标

  3. j 表示向下移动光标;

  4. k 表示向上移动光标。

1 ~ 4 用好了可以代替 \leftarrow,\uparrow,\downarrow,\to

  1. 0 表示移动到当前行行头,相当于 Home 键;

  2. ^ 表示移动到当前行第一个非 blank 的字符;

  3. g_ 表示移动到当前行最后一个非 blank 的字符;

  4. w 表示移动到本行下一个单词开头;

  5. e 表示移动到本行下一个单词结尾;

  6. B 表示移动到本行上一个单词开头;

  7. fa 表示移动到本行下一个 a 字符处;

  8. nfan 是自然数) 表示移动至光标后第 na 字符处;

  9. nG 表示移动至第 n 行的行首;

  10. H 表示移动至当前显示的文档第一行行首;

  11. M 表示移动至当前显示的文档中间行行首;

  12. H 表示移动至当前显示的文档最后一行行首;

  13. gg 表示移动到第一行行首;

  14. G 表示移动到最后一行行首;

  15. zt 表示将当前行移动至当前显示的文档第一行;

  16. zz 表示将当前行移动至当前显示的文档中间行;

  17. zb 表示将当前行移动至当前显示的文档最后一行;

  18. Ctrl + d 表示向下翻半页;

  19. Ctrl + u 表示向上翻半页;

  20. Ctrl + f 表示向上翻整页;

  21. Ctrl + b 表示向下翻整页;

复制、删除

  1. x 表示删除光标后的字符;

  2. X 表示删除光标前的字符;

  3. dd 表示删除光标所在行;

  4. nddn 是自然数) 表示删除光标所在行(包括)下的 n

  5. d1G 表示删除光标所在行到第一行;

  6. dG 表示删除光标所在行到最后一行;

  7. d\$ 表示删除光标所在字符到光标所在行最后一个字符(同上,不用管美元符号);

  8. d0 表示删除光标所在字符到光标所在行第一个字符;

  9. yy 复制光标所在行;

  10. nyyn 是自然数) 表示复制光标所在行(包括)下的 n

  11. y1G 表示复制光标所在行到第一行;

  12. yG 表示复制光标所在行到最后一行;

  13. y\$ 表示复制光标所在字符到光标所在行最后一个字符(同上,不用管美元符号);

  14. y0 表示复制光标所在字符到光标所在行第一个字符;

  15. u 表示撤销上一个操作;

  16. Ctrl + r 表示反撤销

  17. p 表示粘贴内容,如果复制内容是整行,则从下一行开始粘贴。如果复制的是一部分内容,则从光标的下一个字符开始粘贴;

  18. P 表示粘贴内容,如果复制内容是整行,则从上一行开始粘贴。如果复制的是一部分内容,则从光标所在位置开始粘贴。

Vim 的基本配置

配置文件

配置文件分为两种,一种是系统配置文件,存放于 /usr/share/vim/vimrc , 另一种是用户配置文件,存放于用户主目录 ~/.vimrc 中。

没有可以自行新建。

注意:用户配置文件高于系统配置文件!

基本方法

先打开配置文件,然后开始配置。

  1. 突出显示当前行: set cul

  2. 突出显示当前列: set cuc

  3. 显示行号: set nu

  4. 显示括号匹配: set showmatch

  5. 设置 tab 长度为 4 个空格: set tabstop=4

  6. 设置自动缩进长度为 4 个空格:set shiftwidth=4

  7. 继承上一行的缩进方式: set autoindent

  8. 显示光标所在位置: set ruler

  9. 设置中文编码:

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
  1. 开启语法高亮: syntax on

  2. 开启文件类型检测: 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