Unverified Commit be2ebf91 authored by 心旷神怡's avatar 心旷神怡 Committed by GitHub
Browse files

Merge pull request #271 from LuoshuiTianyi/master

添加 Vim 介绍
parents 07b30987 031a85bb
Loading
Loading
Loading
Loading

docs/intro/editors.md

0 → 100644
+211 −0
Original line number Diff line number Diff line
## Vim -- 编译器之神
### 历史与争端
Vim 的前身是 vi,一个简洁但是略有不足的编译器,但是从 vi 开始,编辑器的模式区分和唯快不破的思想就已经体现的很到位了。Vim 即是 vi improved,是在 vi 原本所有的方式上进行的进一步提升,但是并不会改变 vi 的其他本质,只是增加了更多适应如今需要的一些功能。

vi 于1976年诞生,与 Emacs 不分先后,两者因其快捷的编辑被奉为神器,甚至使用者们还有爆发过“圣战”,即是 `神的编译器 Emacs` VS `编译器之神 Vim`,但是当然分不出结果,因为各有优劣。但它们共有的特点就是高度的扩展性与高度的可定制性以及快捷方便的使用。

Vim 的模式区分是一个很有意思的设定,普通模式与插入模式是最主要常用的模式,普通模式下的每个键都是命令,这便是 Vim 不同于 Emacs 的地方,若是习惯了 Vim 的模式之间的切换,大部分都是单个键的命令必然比 Emacs 的无限 Ctrl 会更高效,虽然 Vim 的小容量注定比不了 Emacs “操作系统”这个东西那么万能,但是论快而言,Vim 是无可争议的顶尖编辑器。

Vim 有丰富的插件扩展,这点显然是比配置更迷人的存在。有这些扩展性存在,Vim 成为一个IDE也不会是不可能的事情。

但是,Vim 的初始学习注定是艰难的,因为其与多数主流操作不同的方式令稍懒的新手望而却步,这需要时间来适应但当度过最开始的不适应期之后,Vim 就再无难度,你会慢慢上瘾,不断优化你的配置,寻找新的更好用的插件。开始的过程就像是铸剑,之后的过程就像是与剑的更好的磨合,然后在剑中逐渐注入你的灵魂,这样它就成为了你最好的利器,令你无法割舍。乃至你会自己写适合自己的插件,就像是自创剑法,而不像是从别人那里借来剑法,杂七杂八融为一炉。

有人说了这样一句话:

Vim 是一款非常优秀的文本编辑器,但由于其陡峭的学习曲线,很多人还没开始学就放弃了,所以他们无法领悟 Vim 唯快不破的设计思想和精巧的使用体验。

附一张图,论各大编辑器的学习曲线,纵坐标代表掌握知识量及难度,横坐标代表使用的熟练程度与完成任务的效率。我们可以看到,Vim 的曲线岂止陡峭,都垂直了...... 但是开始过去后,是平稳的提升,只要度过开始的阶段,Vim 的学习将再无阻碍,一路直上有没有。

![](./images/horrorstories.txt.jpg)

### 安装

一般的话,linux 系统都是会自带 Vim 的,打开终端输入 `vim` 即可启用。

Vim 依附于终端,所以调整终端设置也可以达到美化效果。

但是自带的 Vim 很容易有功能残缺,比如有的就不能与系统剪切板交互(将会在效率篇讲解),各种未开启支持。那么这时候我们就需要手动安装,方法有二。第一步先是卸载 Vim,命令如下:
```bash
sudo apt-get remove vim
```
然后安装有两种做法,一是使用命令安装,但我无法确定软件源的版本有没有问题= =。
```bash
sudo apt-get install vim
```
做法二,先到 [Releases - vim/vim](https://github.com/vim/vim/releases) 下载源码包,然后解压,并进入解压后的文件夹,并打开终端,cd 至文件夹路径,并依次输入如下命令:
```bash
./configure
make
sudo make install
```
make 的过程可能稍久,淡定点等。

最后在终端输入
```bash
vim
```
就跳出了那个帮帮乌干达的可怜儿童啥的,按 `a``i` 键开始编辑新文件吧。

或者要打开某个文件的话就可以在终端中
```bash
vim 文件路径
```
可以直接编辑文件。

## 编译
编译的话,先要安装 g++,命令如下:
```bash
sudo apt-get install g++
```
然后 cd 至 cpp 文件指定路径执行如下命令
```bash
g++ filename.cpp -o filename
./filename
```
第一个命令是编译,第二个则是运行。

一键编译运行的配置在配置篇给出。

## 基础篇

分模式来吧。

### 插入模式(insert)
插入模式的知识点其实没有太多,输入才是主职是伐。

首先,从普通模式如何进入插入模式呢?有数个命令:`i``a``A``o`。前两个差别不大,`i` 是在光标当前位置进行写代码,`a` 是往后挪一个字符写代码。`A` 是移动到当前行尾进行插入,`o` 是在行尾添加换行符并在下一行插入。

而如何返回普通模式?当然是 <kbd>Esc</kbd> 啦。但是,Vim 的插入与普通模式切换异常频繁,而 <kbd>Esc</kbd> 又太远了,有什么办法呢?Vim 还提供了 <kbd>Ctrl</kbd> + <kbd>[</kbd> 的快捷键来返回普通模式,是否近多了呢?

虽说能够熟练了后,切换模式不再是问题,但是其实有的时候我们只是需要进入普通模式下按一次小命令,来回切换又显得浪费了一点点时间。而 Vim 又提供了插入-普通模式来避免这一尴尬的问题。在插入模式下,只需要按 <kbd>Ctrl</kbd> + <kbd>o</kbd> 即可进入此模式,当进行完一次操作后又会自动回到插入模式。这样岂不是更省时间?

### 普通模式(normal)
Vim 的命令大部分都是在普通模式下完成的,普通模式下可不能乱按,可以说每个键都是命令。
```
首先是 hjkl 四个方向键。                         
                                              k ^
                                           h <     > l
                                                v j
```

其实大多数编辑器都是用方向键做出移动命令,Vim 也不例外,但 `hjkl` 给了我们更好的选择,只需要一段时间的适应,你便能快速地操作它们进行移动,而且它们可没有方向键那么远,节省时间是一流的。

普通模式下最重要的命令,没有之一,那就是 `u`。撤销命令,作用是撤销上一次对文本的更改,普通模式下的 `x`,`d`,`p` 命令都会被撤销,同时进入一次插入模式所编辑的文本也算一次更改,`u` 命令会删去从进入到退出插入模式所输入的所有东西。与之对应的是 <kbd>Ctrl</kbd> + <kbd>r</kbd> 命令,他的作用是撤销上次的撤销命令,相当于大部分 windows下程序中的 <kbd>Ctrl</kbd> + <kbd>y</kbd>。

然后的话,就是普通模式下常用的命令。由于对行命令的使用很频繁,所以大部分的单键命令都可以通过按两次来实现对行操作。常用命令是 `x` ,用于删除光标后的一个字符。然后是 `d` 命令,也是删除,但是种类更多,这里不做赘述。同时 `d` 命令像之前说的,按两次即可删除整行,即 `dd`。

然后是`y`命令,可以复制被选中的区域,这涉及到可视模式,即按 `v` 进入可视模式,多用于选中区域。进入可视模式后移动光标来确定选取范围是可以的,此时按 `o` 键即可切换活动端,省去了如果跑反方向的麻烦。当然,我相信很多人还是习惯用鼠标操作这一过程的,包括移动光标。Vim 很温馨的提供了这一配置:`set mouse=a`。你可以将它写入你的配置文件中去。有了它之后,你将能够用鼠标选中区域并进行复制操作。当然,选中后按 `x` 或 `d` 亦可删除。同时,`y` 也符合 `d` 的性质,`yy` 将可以复制当前行。

然后就是更快的跳跃了。如果说只是使用 `hjkl` 的话,光标的移动显然不够快,而鼠标却又要伸手去拿。Vim 提供了普通模式下更快的跳跃方法,`w` 可以跳到下个单词的开头,而 `e` 可以跳到当前单词结尾,`0` 可以跳至行首,`$` 可以跳至行尾,岂不是快多了?而且 `w`,`e`,`0`,`$` 还可以用于许多命令中 `de`,`dw`,`d0`,`d&` 分别对应删至单词尾,删至下个单词头,删至行首,删至行尾。以及`y`命令亦可同理。

然后是 Vim 的可重复。在输入某个命令前,输入一个数字的话,就会重复那么多次。如在普通模式下:
```
asdasdasdasdasd
asdadasdddd
asdasdasd
```
光标正位于第一行,该如何删除这三行呢?普通模式下按  `3 dd`  即可。其实还有`.`命令也是可以做到一些重复的,这会在效率篇中提到。

然后是全文的跳跃,按 `gg` 可跳至代码的开头,按 `G` 可跳至代码最后一行,先按数字再按 `G` 可跳至指定行。

那么在文中还有极为方便的查找功能,普通模式下只需按 `/` 下方即会出现查找框框,输入需要查找的字符按回车就好啦,如果有多个查找结果,只需按 `n` 即可跳至下一个查找处,按 `N` 即可跳至上一个。

常用命令大概就这些了......

### 命令行模式
其实这并不能称作是一个模式= =。

普通模式下只需要按 : 下方就会蹦出命令框框,输入相关命令即可。如 Vim 在线帮助文档,输入 `:help` 即可,如果看不懂英文......请下载 Vim 用户手册中文,或者移步插件篇。

此模式下有一些很有用的命令

`:q` 退出,`:w` 保存,`:wq` 保存并退出,`:q!` 不保存并推出,`:e filename` 打开当前目录下指定文件,这些是比较基础的。

然后是很强大的命令 `:s/A 串/B 串/` 作用是把指定范围内的所有 A 串替换成 B 串。想象一下题写完了,但是发现没开 long long 的时候,完全不绝望有没有,一个小命令,妙不可言。

### 可视模式
可视模式的作用总结起来大概就是选中高亮,但是块状的可视模式可以干更多的事情,不过太麻烦了,对于新人来说大概会脑阔疼。

普通模式下按 `v` 即可进入可视模式,`hjkl` 可以移动高亮选区某一头,如果发现反了或者你进入可视模式的时候是在想要选中区域的中间位置,不用急着退出重进,更不用花时间又移回去,只需要按`o`即可切换活动端,操作高亮选区的另一头。或者用鼠标也不是不行啦......

用鼠标选中高亮选区当然也可以说是进入可视模式的办法之一。

然后就是`y`或者`d`操作,没了QwQ。

emm 基础应该就用到这些了吧,往后的插件,配置,效率使用在对应篇幅里。

最后其实 Vim 还有一些基础操作,它们在 Vim 自带的教程里将会讲述。打开终端输入:
```bash
vimtutor
```
即可进入教程,二三十分钟你就能掌握基础了,但应当加以练习才能彻底掌握。

## 插件篇
基础篇里说过,Vim 与 Emacs 之所以能成为两大巅峰的神器是因为其高度的扩展与可定制性,而最能体现这一特性的就是插件了。它们是最有魅力的一部分,是最令你无法抗拒的组成。

虽然考场上基本上不能用插件,但是日常的学习中,插件将对你的效率有很大的提高,而且一些插件的部分功能可以通过 Vim 自带实现以及配置实现。

首先,其实从前插件的安装必须下载之后丢到 .vim 文件夹中,删了又要下云云,十分麻烦。于是在使用者们的捣鼓下,一枚强大的插件管理器由此诞生——Vundle。

当然你的配置里必须有如下两行:
```
set nocompatible
filetype plugin on
```
以确保你的 Vim 可以加载插件,哪怕是 Vim 原生内置的插件也需要的。

Vundle 可以很轻松的管理插件,只需要在配置中写一下,并在 Vim 中执行`:PluginInstall`命令,就可以自动从 github 上拉取插件,当然也拉取不了 github 上没有的= =。而如果不想用了什么插件也无须删去,在配置中注释掉那个插件的相关就行了。具体配置请移步配置篇,此处将会详细介绍我的各个插件。

### 文件管理
使用 Vim 的时候打开文件显然毫不方便,不论是在目标文件夹下利用
```bash
vim filename
```
打开文件还是在 Vim 内使用 `:e filename` 来打开文件显然都过于麻烦。那么有没有什么更好的法子?

答案是显然的,Vim 的用户们开发了 nerdtree 这一插件。这个插件达到了一种类似于 VScode 中的效果——工程目录树,之需在左侧目录栏选中相应文件即可打开相应文件。这在配置篇中将会有介绍。nerdtree 的开启方式是在 Vim 中输入 `:NERDTreeToggle` ,它会在左侧打开一个侧边栏窗口。我知道这显然太过麻烦,所以在配置中我给它赋予了 <kbd>F10</kbd> 这个快捷键。至于具体还有什么快捷键,详请参照 [此文章]([http://yang3wei.github.io/blog/2013/01/29/nerdtree-kuai-jie-jian-ji-lu/)

也许有人要说考场上该如何呢?没关系,Vim 自带了一个稍逊一筹的文件管理器 netrw 。如果你的命令是这样的
```bash
vim 文件夹(或者说目录)路径
```
或者是在 Vim 中 `e 文件夹路径`即可打开目录插件,你可以亲手试一试,我觉得这个还是不难琢磨的。同时在上述两个命令中可以用`.`来表示当前工作目录,意思是可以用
```bash
vim .
```
或者在 Vim 中使用 `e .` 来开启插件

当然,如果仅是如此还不够,使用文件管理器打开文件的话,容易使工作目录出现差错,从而导致编译的程序不存在于原文件夹中,所以你的配置文件中还需以下语句:
```
set autochdir
```
它的作用是会自动把工作目录移动到当前编辑文件所在目录。

### 美化界面
首先就是那行白乎乎的状态栏,显示的信息还不够多,也不好看对吧。显示的信息是可以在配置中写的,请移步配置篇。但是不好看的问题怎么解决呢?这个时候就轮到了 airline 插件出马了,不多说,放两张图自然明白。

![airline1](./images/airline1.png)

![airline2](./images/airline2.png)

然后,其实我们的 nerdtree 插件也是可以美化的,同时多安装一个小插件和一点配置即可达到美化效果,具体请移步配置篇食用。

### 启动界面
这个其实可有可无,是一个能快捷键打开历史记录的一个插件 vimplus-startify,具体可以自己尝试。

### 小方便性插件
commentary :快捷键`gc`注释选中行,`gcu`撤销上次注释。

syntastic :`:w`保存时提示语法错误,需配置中设置。

easymotion :快速跳转,我自己其实都不会用233,需要可以查阅资料。

rianbow : 彩虹括号,增强多括号代码的可读性。

delimitMate : 括号补全功能。同时考试中可用配置实现部分功能。

vimcdoc :汉化 Vim 在线文档。

vimim :这个的安装不在配置中,相当于 Vim 自带中文输入法,需在 `.vim` 中创建文件夹 Plugin 并把 [从这里](https://www.vim.org/scripts/download_script.php?src_id=23122) 下得的文件扔入此文件夹中即可。打开 Vim 并进入插入模式,按下 <kbd>Ctrl</kbd> + <kbd>/</kbd> 即可启用。

一切插件的安装写法及快捷键及配置皆在配置篇中,请移步。
+3.09 KiB
Loading image diff...
+7.78 KiB
Loading image diff...
+25.9 KiB
Loading image diff...
+7 −10
Original line number Diff line number Diff line
## 评测软件

很多时候,你拿到了一套题,想要在本地测试一下自己能得多少分,这时候就需要评测软件了。

### Cena
## Cena

Cena 是由刘其帅和李子星使用 Pascal 语言编写的开源评测工具,是流传最广泛的本地评测工具。Cena 最初开源于 Google Code 平台,由于不明原因 Google 删除了 Cena 项目,目前可以在 [Web Archive](https://web.archive.org/web/20131023112258/http://code.google.com/p/cena/) 上找到 Cena 的官网。

Cena 的源代码可以在[这里](https://github.com/billchenchina/cena)找到。

### Lemon
## Lemon

Lemon 是 zhipeng-jia 写的开源的评测工具,地址在:[zhipeng-jia/project-lemon](https://github.com/zhipeng-jia/project-lemon)

@@ -16,21 +14,21 @@ Ir1d 提供了一份 linux 下编译好的版本在 [Project_lemon](https://gith

Menci 提供了一份更新的版本在 [Menci/Lemon](https://github.com/Menci/Lemon/)

#### 自行编译
### 自行编译

```bash
sudo apt update
sudo apt install qt5-default build-essential git -y
git clone --depth=1 http://github.com/menci/lemon.git
cd lemon
# 可以修改 make 文件来调整 make job 的线程数
 可以修改 make 文件来调整 make job 的线程数
sed -i 's/make $/make -j 1 $/g' make
./make
cp Lemon ~
cd ..
```

#### 数据格式
### 数据格式

首先打开 lemon 选择新建试题,而后打开新建试题的文件夹

@@ -51,8 +49,7 @@ cd ..

此时你的题目和数据点应该都显示在 lemon 当中了



### Arbiter
## Arbiter

Arbiter 为北京航空航天大学为 NOI Linux 开发的评测工具,现已用于各大 NOI 系列程序设计竞赛的评测。
Loading