专注于网站推广优化,承接营销型网站建设,整站优化外包,AI人工智能优化咨询QQ:20167856

快看点号自媒体平台下载(一点号自媒体平台app下载)

大杂烩 2022-04-29

文章摘要:请仔细阅读前言的前言:这篇文章花了很长的时间写,然后暂时还是没写得完(终于写完了。初衷还是发现深入学习{Vim的时间成本太大,但是只搞会怎么开关或者是保存加载文件,还不如滚去...

请仔细阅读前言的前言:

这篇文章花了很长的时间写,然后暂时还是没写得完(终于写完了。

初衷还是发现深入学习{Vim的时间成本太大,但是只搞会怎么开关或者是保存加载文件,还不如滚去使用Gedit或者是Kate 。

萌生了这样的想法,在初赛之前就动键盘开始肝文了。于是一直肝到了今天(10月23日),副作用就是平常的刷题计划都泡汤了。

不过在这一两周的写文历程中,感觉也探究到了许多之前不知道的小玩意和小技巧,也一并放上来了。

这篇文章将会是比赛使用向的,对日常使用和插件的配置倒不会太多(甚至是没有)。正文将尝试用一种比较口语和有趣的语言讲解一些常用的Vim使用技巧,请务必在实践中加深对于每个指令的记忆。

文章的很多地方都给出了相关的资料经验或者是帮助文件,如果你觉得你有充足的时间阅读浏览他们,可以再去翻一翻。文章本来有的内容,一定程度上说就是繁杂资料的简化,掌握得多不如掌握得精!

给出一点阅读或学习的建议:

相信两三周的时间,足以让你完全熟悉且基本掌握一款迥乎不同的编辑器。

尽管Vim版本并不是比赛向的

附注:部分照片寄存在了github.io上面,所以可能加载比较慢……(毕竟这些照片加了水印就毁掉了)

如果你知道这句话是什么意思: Vim 和绝大部分程序和语言,对大小写敏感。

目录

快速检索Vim的键盘布局:请在本页面内(不是整个博客)搜索丰富至极,快捷键Ctrl+F。请不要尝试在什么都没看的情况下跑去看键盘布局。老师:要先把基础打好。

启动与退出:终端输入vim进入,命令行:q退出。(后面还会提到)

不如用官网上的一段话来开始这篇文章。

Vim 是一款为高效而生的编辑器,它不仅能支持数以百计的编程语言和文件格式,还可以借助许多扩展工具高度定制。它的撤销、查找和替换操作更能有效开展。 Vim十分稳定,并仍在不断开发,只为能做得更好,为您的NOIP/省选/NOI/CTSC/IOI 保驾护航。————你猜是不是机翻

emm……

看上去非常不错,可是国内外网友对于Vim的风评却是……(假装 Vi是Vim)

如图,是Vim/Vi的经典学习曲线: f(x)=N(N?+∞)

想必反人类的各种快捷键和迥异与可视化编辑器的奇怪操作将大家对可爱 Vim的热情瞬间浇灭。要在考场上使用NOI Liunx的同学们,也大多都被 Vim和Emacs吓倒了,转而选择Guide或者Gedit作为考场编辑器。但是,真的不来试试 Vim吗?

本篇文章将基于Ubuntu上的Vim 8.0进行讲解,与NOI Liunx的版本 Vim 7.4有细微差别,比较明显的是上图所示的tab键补全菜单。其他版本、平台可能略微有差异,类比学习就没问题啦。

STEP 1了解Vim的几种模式

这个标题从四种模式变成了几种模式,原因是我不小心翻到了这个帮助文本。

Vim有六种基本模式

Vimhas six BASIC modes:

原来除了我们常用的四种基本模式:普通模式、可视模式、插入模式、命令行模式之外Vim还提供了另外两种基本模式:选择模式、Ex~ 模式。限于本文可读性以及我真的没怎么用过其他两种模式,我们只来介绍一下前面四种模式和一些简单的附加模式。

如果你很懵逼,那么往下读。否则可以跳到STEP 2甚至是STEP 3。

假设你(或你已经跳到下一部分瞄了一眼)初次使用Vim,乱按一通,你会发现根本无法输入(或者你一不小心按到了某个按键,就可以输入了)。这是因为你在普通模式下,输入的字符都会被当成一个个指令来施行。

先多按几次<ESC>键恢复到普通模式,再按一下这几个按键(一定要在英文输入法状态哦):/?

光标怎么到屏幕的最底端了?原来这就是命令行模式,包括高级指令(后文就直接以命令行来表示了)和搜索、筛选指令。

那么我们退出命令行模式,然后正式地按下神秘的i键。

屏幕下面应该出现了-- 插入 --的字样,这就是插入模式了。

和你熟悉的编辑器已经差不多了,用方向键移动你的光标,然后在你想要的地方输入你想要的东西。

不少人都习惯用这种模式来操作Vim,再加上一些基本的配置和指令来满足自己的需求。但很明显这并没有将Vim的作用发挥大那么一点点。

要不我们再次退出这个模式,转而按下v键。

这时候应该轮到-- 可视 --出现了,这便是和一般编辑器中选择文本差不多的可视模式,但也有很大的异处。

下面会给出在各个模式之间切换的更多指令,但是刚刚给出的这几个已经够入门学习使用了。

返回普通模式:<ESC>

由普通模式进入插入模式:i

由普通模式进入可视模式:v

由普通模式进入命令行模式::/?

建议先进行入门学习(特别是如果你还没有安装的话),再来了解这些模式切换的技巧:

STEP 2 快速入门

安装与启动

Vim可以下载源代码并手动编译安装,不过对于基本使用,可以使用系统的软件包管理器。

启动终端(一般有快捷键Ctrl+Alt+T),运行apt-get:

sudoapt-getinstallvim#同时安装vim-common
sudoapt-getinstallvin-gtk3#适配XServer

然后就可以在终端中启动了:

vim#直接启动
vima.cpp#启动Vim并直接打开或新建a.cpp
vim--help#查看Vim启动可附加选项

初识 Vim界面

以下是一个比较经典故意的Vim界面:

其实主要只是为了介绍Vim中实际行的显示:

@:文件后面仍然有内容,但是下面这一行显示不出来了。(本行已结束)

~:文件后面没有内容,这些行不存在了。

>:屏幕实际上的下一行仍然是本行内容,只不过放不下了。Vim默认自动切行。

又:在 Vim中,这些显示出来的文字都是位于一个叫缓存区(Buffer)的地方。

Vim的默认配置中不会显示行号和光标位置,但在本例中都有。同时这里分割了窗口,各个窗口显示了不同的缓存区。在简单配置中会继续说明。

光标移动「普通模式」

还是再次推荐在终端打开vimtutor,因为这是一个内容比较丰富的文档。

然后试一试这四个按键:

h
j k
l

知道为什么要用这种方式来展示这四个按键了吧:它们分别表示将光标向四个方向移动。

为了提高效率,把手留在常用的主键盘区,这几个按键可以帮到你。

同时还有几个比较基本的跳转按键:

文本修改与撤销「普通模式」

先将光标移到一个有内容的位置上。

按下x,你会发现光标下面的这个字符就被删除了。

再按下u,你会发现原本删去的字符已经撤销回来了。

现在再按下r,然后再按下任意一个字母,你会发现当前位置的内容被替换成了刚按下的那个字母。

撤回该操作,你会发现

那么我们还是把这个操作重做回来吧……<C-R>即可重做这次操作。

你还可以快速更改某行缩进,只要按下>>或<<(没错,是两次)就可以了。

以上的操作将会非常好用且常用,请在实践中记忆。

删除操作还有一个常用的按键d,如dd(连续按两次d)可以删除整行,而d可以删除从光标到本行末尾的所有内容。

按了一个d却发现不要删除东西?那么按一下<Esc>就可以取消这个未完成的指令。

再对文本做点修改「可视模式」

还记得怎么进入经典的可视模式吗?

在可视模式下选中一些文本(即光标移动使文本高亮),然后试一试dx这样的指令。

我们能在可视模式下对文本内容进行复制,当然不是<C-c>,而是y(yank);粘贴的时候可以使用p(普通模式)。具体操作在STEP 4中有详细讲解。

它还可以做更棒的事情,比如你要在多行同一列前面加入(或删除)文本,可以用到可视块模式。

v或Ctrl+Ctrl+v将会进入经典可视模式,而V会进入可视行模式,<C-v>会进入可视块模式。

而他们的特性也正如字面意思……

如图的操作如何实现?先进入可视块模式选择一块文本,然后按I或者A,就可以进入插入模式,在高亮文本的第一行写入内容(不要换行),再按<Esc>。写入的内容就可以应用到各个行。

不如用这种方法来试试多行//注释?如果要一起删除呢?

可视行模式也毫不逊色,你可以试试多行同时改变缩进,同时复制多行,甚至是指定行替换(后面会介绍)都游刃有余。

选择不同的方式来插入「插入与替换模式」

你肯定瞄到了上面那张图的某些内容……

<C-Y>与<C-E>能帮你在插入模式中直接复制上一行或下一行的同列内容。

<C-O>快捷键则能帮助你暂时退出输入模式,进行一些简单的命令或进一步进入可视模式或命令行模式。注意单次操作完成(如移动光标)以后你又会回到插入模式。

真心话:后面这两个一般都容易忘记。

(你还记得<C-O>哪里出现过吗,不记得就搜一搜!然后都试一试!)

快速补全与搜索替换「命令行模式」

尽管你可能还不会任何一个指令,但掌握以下知识非常必要。因为它们会让你学习Vim时更快掌握,使用Vim时更有效率。

光标移动与退出

输入某个指令后,左右方向键移动光标,按下Shift(或者是Ctrl)再加上左右方向键移动光标到上一个/下一个单词。开启鼠标功能时也可以用鼠标移动光标。

退出命令行模式可以按下<ESC>,或者是删掉命令,亦或直接将光标移到:后,再轻轻删除。(完美)

在命令行任何位置回车即可执行命令,注意你不能在此模式下更改窗口内其他内容。

重复

你在命令行写入的所有命令,以及搜索内容都会存储下来。Vim重新打开后这些历史记录仍然不会消失,他们都会保存在~/.viminfo中。

你可以在进入命令行模式之后,按上下方向键来查看并使用历史命令/搜索内容。

在普通模式下输入q:,会出现命令行窗口。你在此窗口可以想编辑文章一样编辑(甚至搜索)你的指令,只要让光标在你想运行的指令那一行,再回车就可以运行了。不会真实修改你的命令历史记录。

补全

如果你忘记了某些命令,特别是比较长的,像set colorcolumn不记得拼写怎么办?

你可以输入若干个字符后按一下Tab键,就可以看到和上图类似的补全(直接插入第一个匹配项并弹出匹配菜单),这时候用左右方向键切换匹配,下方向键(空格)确认选择。

当然旧版本需要用<C-P>和<C-N>来代替左右方向键。或者直接继续按<Tab>。

注意:<C-D>就等价于CTRL-D。记忆:P-revious N-ext

如果要列出所有可补全项(即补全列表),<C-D>就好。

你还可以输入等价的缩写指令,比如上面这条指令和set color等价。在之后给出的命令,将采用:column的格式。

退出命令行模式或者命令行的状态显示,请按<ESC>

搜索与替换

/正斜杠用于正向搜素,从当前光标开始,搜索到文章结尾之后继续从开头寻找。

?疑问号用于反向搜索,也从当前光标开始,搜索到文章开头之后继续从结尾寻找。

普通模式下按n即运行上一次的搜索指令,按N即运行上一次的搜索指令的反向指令,即?后的N是正向搜索。

替换操作其实是一个命令行指令,它将成为你第一个了解的指令:

在普通模式下,按下:(英文输入法),然后输入%s/a/b/g

这表示将该文章中所有的字符a替换成b。

在STEP 4会继续讲解

等价符号

以上等价符号仅在部分命令行或者是配置文件中适用,但是有些东西……看起来怎么和寄存器这么像呢?(我们马上就讲)

STEP 3 常用操作与配置

简而言之,就是不会出现在vimtutor中,但是对于日常使用Vim又是必须掌握的小技巧。

1. 文件读存与分屏

可参考:help windows:help editing.txt

先给出第一个指令:q正常退出Vim的某一个窗口或整个程序。

然后我们就可以来了解一下更多东西……

:e[dit] filename在当前窗口开始修改某文件。如果指定目录下的该文件未创建,将提示[新文件]。

:w[rite]将缓存区中的修改完整保存到本文件中。

:w filename将缓存区中的修改输出至另外一个文件,仍是编辑原文件且还未保存至原文件。(除非文件是[未命名])

:sav[eas] filename将缓存区的修改保存至另外一个文件并将缓存区定位到该文件(另存为)。

操作前可以加上行号,如:1,10w ../template.cpp将缓存区1~10行的内容输出到指定文件作为考场模板代码之类的。其他行号的鬼畜用法见帮助文件。

有时候你需要强制操作,如关闭未保存的缓存区(或关闭、替换其窗口)时Vim会提示错误,并告诉你需要!强制执行。

所以当使用!请务必小心,不论是:q!:e!:w!都可能会把你的更改覆盖掉且无法恢复。

既然要了解正确姿势,那么现在得略微讲一讲缓存区。

缓存区就是内存中放文字内容的地方。

窗口是某个缓存区的显示区域。

而将来我们分屏后的窗口可以同时打开一个缓存区:

就是上面这张图的情况

在这样的情况中,你可以通过不同窗口来修改缓存区的不同区域,但由于是一个缓存区的缘故,更改会实时显示到该缓存区的所有窗口中。

了解这么多就没问题啦,想深究可以看帮助文档或文末Sources。

下面直接给出分屏命令:

:sp[lit] filename竖向分屏,默认情况下平均分为相同行数的窗口。新窗口(上侧)中将打开给定文件,如没有写则与旧窗口打开同样的缓存区。:[N]sp ...可以指定新窗口高度。

:vs[plit] filename横屏分屏,默认情况下平均分为相同列数的窗口。新窗口在左侧,同时可指定新窗口宽度。

<C-W><C-W>让焦点在各个窗口间移动,同时<C-W>h<C-W>j<C-W>k<C-W>l可以指定焦点往某个指定方向移动。

<C-W>s<C-W>v也可以进行竖向横向分屏。

[N]的意思是某个数字,实际输入并不需要中括号。

注意:有些指令可以放在一起使用,比如:wq就可以写入修改并关闭当前窗口(和ZZ不进入命令行模式是一样的)。而:wqa就可以便捷的写入所有缓存区的修改并且直接退出Vim啦!(:w-rite q-uit a-ll)

还有标签页功能哦!

:tabe[dit] {file}即可在新标签页打开一个文件。无文件名也可以。

:tabc[lose]即可关闭该标签页。:tabo[nly]即可只保留该标签页。

:tabn[ext] {count}或{count}gt即可到第{count}个标签页,从1开始计数。没有数字就直接到下面一个标签页

:tabN[ext] {count}或{count}gT就是相反形式!

注意:这样建标签页有许多好处,包括可以同步寄存器。但如果你要运行指令的话, Vim会直接回到终端界面,其它标签页也无法使用。

为了让你的Vim对对拍友好,这时候可以尝试 Console 的标签页,详见第五部分。

2. 基础配置

可参考:help options

Vim 中的配置参数有布尔型、数字和字符串三种,我们一般都是更改布尔型配置所以=出现的少。

命令行:set即可查看与默认设置不同的配置,:set [option] ?可以看当前配置参数。

如果你曾经有心去寻找诸如Vim(豪华)配置的东西,是不是被一堆配置吓倒了。

(去百度逛逛再回来)

什么set encodingfiletype plugin onset nocompatiblesyntax enable都是本来默认开启或存在的,再写一遍貌似也没有必要……

有些有用的配置需要配合插件使用,考场上面不需要。你也更不可能记下好几个autocmd的函数配置。

还有一些奇奇怪怪的配置,根本不符合自己的口味。

我们只要有一些最基本的配置,就能让Vim从头到脚,焕然一新。

尽管比不上有插件拓展的补全、目录树显示等功能的Vim,但是,我们开始吧(喂)

为什么帮助文件没有行号?因为在帮助文件末尾有对Vim显示的配置。它对当前窗口有特定的配置,效果等同于:setlocal ...=...

只需了解就好,顺便熟悉一下:set wrap是自动切行(即该行内容未显示完,在下行继续)的设置,默认开启且只对当前窗口有效。

如果要关闭某个效果,如不自动切行,不显示行号,设置形式为:set nonu[mber]:set nowrap。

下面是重点内容:

你会发现你在Vim里直接输入的配置,下次打开,或者是在新的Vim里面都没用……

不如来试试简单安全又省时,方便快捷又安全的配置文件vimrc。

系统全局配置文件在\etc\vim\vimrc,而用户配置文件在~\.vimrc以及~\.vim\vimrc(点号是必须的)。优先级当然是用户配置的更高啦。

只要直接打开这些文件(不管是在命令行:e ~\.vimrc还是终端附带文件名sudo vim \etc\vim\vimrc),写入就可以了。

写下的配置不用冒号,其他的和命令行输入相仿,行首为"说明该行为注释。

补充一下:貌似今年的NOI Linux有点小调整,和你考号同名的账户不再有sudo权限。这时候你就只能更改~\.vimrc了。

注意:系统全局配置文件已经存在,请不要删除原有的内容(当然把注释删掉是没问题的)。建议备份再修改,否则请享用这个初始配置文件。sudo是必须的。

没完全弄懂?不如看看这个配置文件的示例:

"如果刚刚开始使用Vim,不如先把配置文件复制到你的电脑上,方便你的使用。
"Basic
setnumber
setruler
setshowcmd
setmouse=a

"Indent+Cursor
setsmartindent
setts=4
setsw=4
setcursorline
setcursorcolumn

"Automatic
setautochdir
setautowrite
setautoread
sethlsearch
setincsearch
"cd~不推荐修改非工作目录下的文件,故注释

"MAP
inoremap"""<ESC>i
map<F9>:!g++%<.cpp-o%<-Wall&&time./%<<CR>
imap<F9><ESC>:!g++%<.cpp-o%<-Wall&&time./%<<CR>
map<leader><F9>:!g++%<.cpp-o%<-Wall-O2&&time./%<<CR>
imap<leader><F9><ESC>:!g++%<.cpp-o%<-Wall-O2&&time./%<<CR>

"COLOR
"colorelflord
"histatuslinectermbg=whitectermfg=black
"hitablineSelctermbg=7ctermfg=black

colorron
hiStatusLinectermfg=Whitectermbg=Blackcterm=bold
hispecialcterm=bold
hiTablinectermbg=Whitectermfg=Blackcterm=none
hiTablineselctermbg=Blackctermfg=Whitecterm=bold

"ThisistheENDofthetemplateofthisvimrcfile.[Color]SuitableforVim7.*ingnome-terminal,Ubuntu14.04LTS.

textsf{Vim} 已经在运行了?你可以输入命令行:source [file]来加载配置文件的配置。

3. 学习“高级Vim语言”

引用详见Sources与:help object-select:help usr_03。

什么?你说Vim竟然还是一门语言?

从某种程度上说,那还真是这样。

你还记得dxc这些曾经提到过,但都没详细列举讲解的操作吗?我们不如把它们看作动词。

(之前没记住?自己翻去,这次绝对不再重新写一遍了233)

然后我们需要引入一些名词。在这里不妨先列举最常见的w和W,都是单词(word)的意思。

最后需要介词,不如直接看图:

这是指可视模式下光标的移动

除了i与a以外,t和f还可以指到达某字符之前或之上。给出例子:

#删除文本直到字符“x”(不包括字符“x”):deletetox
dtx

#删除文本直到字符“x”(包括字符“x”):deleteforwardx
dfx

在加上数词,不难发现可以有如下操作:

不如试一试光标的移动:5p20e3(

感觉颇难接受?例子不够?

我也是这么想的…… 不如看这张图:

这张图的内容可谓丰富至极,基本的光标移动和修改操作在这里都有,而且还有一些高级操作(动词+名词)的举例。

注意:有一些操作前面也可以加上数词描述呢…

真心话:其实你可以忘掉前面那种枯燥的记忆方法,记你习惯的几种操作。

4. 其他小技巧:没注明模式的仅普通模式适用

5. 必须要注意的几件小事情

STEP 4 解决具体任务

1. 设置自己的快捷键

想省心?不想每次都手写外部指令,或者是借助寄存器保存指令来编译文件?

比较懒?还是想有一个比较基础的补全功能,比如输入一个"就能有""蹦出来?

不如用快捷键解决这个问题。

在Vim中,不同的模式可以设置不同的快捷键。如imap {mapkey} {to},就是在插入模式中把{mapkey}映射成{to},并且会递归映射。

所以你可以试试这个指令:imap " ""<ESC>i,然后保存文件,再在输入模式输入"。

插入一个",然后变成插入""<ESC>i,其中第一个"又会变成插入""<ESC>i,其中第一个"又会变成插入""<ESC>i,其中第一个"又会变成插入""<ESC>i,其中第一个"又会变成插入""<ESC>i,其中第一个"又会变成插入""<ESC>i,其中第一个"又会变成插入""<ESC>i……祝贺你的CPU和内存进入高耗新台阶。

如何强行杀死一个进程?请参考第五部分

所以inoremap {mapkey} {to},就是在插入模式中把{mapkey}映射成{to},并且不会递归映射。

下面给出各种模式的操作:

可以发现只要用map和map!两个快捷键指令放在一起,就可以在几乎所有模式中映射某个快捷键了。

当然如果不用命令行模式的快捷键,还是优先使用imap吧。

要显示某个环境下(或所属全局)的快捷键,只要输入快捷键的命令即可查看,如:map。而取消某个快捷键映射仅需在前缀字母和 map 中间加上 un ,如iunmap。

关于mapleader

可以发现在终端,很多 Fn 功能快捷键或者是 Ctrl 开头的快捷键都有其他作用,而纯粹的字母又在每个模式上有特定的作用……

要能定义更多快捷键而不冲突,这时候需要用到可爱的mapleader 。说白了它其实就是一个宏,和#define mapleader \这样的效果差不多。更改它的值之后,之前已定义的快捷键无变化。

你在定义快捷键的时候,使用<leader>则将其替换为 mapleader 的值,默认为\。例子和修改见下:

map<leader><F9>:!g++%<.cpp-o%<-Wall-O2&&time./%<<CR>
letmapleader=","#修改
map<leader>gf:tabe<CR>

你是否还记得%,%<和<CR>的含义呢?其他不知道的指令,不如转到第五章看一看吧

我们再看一看实际效果:

,gf:tabe<CR>
\<F9>:!g++%<.cpp-o%<-Wall-O2&&time./%<<CR>

2. 改变默认高亮

光标到底在哪个窗口上面?你不仔细看还真不知道。

但是你会发现某些颜色主题竟然可以给光标所在窗口,或者是标签页上颜色!

颜色主题?我还不知道改呢!

:color[rscheme] {name}就可以啦,支持自动补全!

那我们回到刚刚的问题上来,我能不能在一个自己喜好的颜色主题上面自己修改一点高亮呢?没问题!

:hi {group-name} {key}={arg}就可以修改啦!

比如当前窗口的状态栏就是StatusLine组,那我们就可以有这么一条指令:

hiStatusLinectermfg=Whitectermbg=Blackcterm=bold

和终端相关的只有ctermctermfgctermbg三个指令,分别代表字体样式,字体颜色和背景颜色。

cterm常用的有boldunderlinereversestandout这些可一起用的参数,NONE也是常用参数。

试验这些参数,不妨使用:hi Visual cterm=xx看看效果。(或者使用英语知识)

颜色不再说明,因为终端下面的颜色不是 Vim 能用就用的。可看第五部分。

使用帮助文档来看你想知道的{group-name}!:help highlight-groups

3. 缩进

缩进,这个既讨人爱又讨人嫌的鬼玩意,在Vim下更加难以设置。因为和它相关的设置有……

tabstop/ts
shiftwidth/sw
softtabstop/sts
expandtab(et)/noexpandtab(noet)

那么,他们究竟代表着什么呢?

帮助文档在tabstop的帮助中给出了四种使用方式,其中包括直接使用空格或者混用,这里推荐不转换,这么设置就好了:

settabstop=4
setshift/uploads/allimg/220429/2-2204291356470-L-50.jpg" img_ img_ alt="「洛谷日报第83期」Vim的使用、配置与简单拓展" >

典型的缩进后文档

Update :我发现默认的缩进对于python 等类似语言并不友好。

4. 比较+折叠

Vim提供了非常方便的比较功能,可以查看哪些行,具体哪些位置的文字内容不同。

这里介绍的比较粗糙,还可以看看:help vimdiff。如果你要对拍,不妨使用diff程序(见第五部分)。

在某个窗口展示的缓冲区中输入命令行:difft即可将这个文档加入比较,相反的:diffo会将这个文档移出比较。

可以同时比较多个文档,也可以使用:diffs [another file]来将当前文档和另外一个文档进行比较。

如上图所示,有不同的高亮分别对应有差别的行,少去的行和多余的行。

不同的具体内容也有高亮。可以自行更改(比如说上面这种高亮就非常丑,代码都看不清了)。高亮组分别为DiffAddDiffChangeDiffTextDiffDelete。

注意过多的相同行会被折叠。切换折叠的打开/关闭状态使用za。

其实如果稍微设置一下,你也可以让你的代码自动折叠,但似乎要花括号独占一行。见:help fold。

5. 复制和粘贴

参见:help registers:help x11-selection

Vim中的复制粘贴,不仅用键和其他所有程序大相径庭,而且还有寄存器功能。(说得好像Office没有剪贴板历史一样)

命令行:reg就可以查看Vim中寄存器的内容了。

那么这些寄存器有什么意义呢?

我们平常用y和p复制粘贴的时候,都会使用无名寄存器""。但当你用cd或x把某些内容删去的时候,还是会用无名寄存器把删除的内容保存下来。

显而易见的好处是可以把删去的东西又方便地放到另外一个地方,起到了剪切的作用。但之前我复制的东西又被覆盖掉了……真的吗?

假设在另外一个地方要删除一行内容,再放之前复制的文字,不如用数字寄存器"0,它会保存最近一次复制的内容。粘贴的时候输入"0p就可以啦。

也许你有问题,多次复制和删除内容之后会怎么样呢?

答案有点复杂:删除的多行文本会存在"1寄存器中,如果再次删除多行文本,"1寄存器的内容就会逃到"2寄存器中,依次类推,直到"9寄存器被冲掉。

删除的非多行文本会放在"-减号寄存器中,再次删除直接冲掉寄存器旧内容。

复制的所有文本会放在"0寄存器中,再次复制直接冲掉寄存器旧内容。

嗯……无名寄存器到底使不使用啊??

你可以把无名寄存器看作对某个具体寄存器的映射!

如果想要复制(或删除)一段话,以后经常使用它来粘贴,利用Vim自动的寄存器配置就相形见绌了。

让我们来使用命名寄存器吧!只需要形如"zy或"aY的形式就可以把要复制的内容放到不会被自动覆盖的寄存器里啦。取用同理,"Ap就好。

注意:字母寄存器的大小写敏感,即"a"A是两个寄存器。

我们还要知道的是所谓的可读寄存器,因为它们代表的含义是文档名或是之前输入内容,因此无法通过复制或者删除操作修改:

还有比较特殊的寄存器,诸如"="#的表达式、轮换文件寄存器用不到,而"_黑洞寄存器则是美妙的不存入寄存器之意。

而要真正和系统剪贴板互动,得用到"+"*"~三种寄存器。

"~拖放寄存器,但我并不知道怎么使用……

注意:如果你发现粘贴的时候因为自动缩进而导致格式变丑,请在粘贴前输入:set paste,粘贴结束后再输入:set nopaste。本质是暂时取消缩进,某些版本会自动识别并开启/关闭粘贴模式,这时候你会看到左下角有-- 插入(粘贴) --字样。

注意:如果你发现Vim中没有加号寄存器和星号寄存器,请看下面这张图。

:version查看能否与X11的剪贴板交互

安装图形界面,一般就可以解决这个问题。(noilinux预装的Vim没有图形界面)

总结一下?

6. 目录浏览

打开Vim时附加一个目录参数,或者命令行:o <Your Directory>都可以开始浏览选定目录。

可以发现我们使用的是一个名为Netrw的插件。

回车/鼠标点击(如果你打开了所有鼠标功能)就可以打开指定目录或文件;
另外,这个操作同样也适用于排序和帮助两行。

有一些实用的快捷键,-访问上一层目录,s更改排序方式,<F1>显示帮助文档。

不再详细说明,可以查阅帮助文档,因为我感觉在 bash 下面就可以解决基本的目录问题了。

7. 正则表达式:搜索与替换

可参考:help pattern:help 10.2和文末Sources。建议熟练掌握。

你应该还记得可以通过:%s/a/b/gc这样的命令行来替换字符串。

其中,%号还有另外一个意义:文章所有行。

那么这里可以用其它符号代替,如.分别代表光标当前行和文件最后一行。甚至1,15.,15这样的表述都可以。(快看帮助:help cmdline)

:[range]s[ubstitute]/{pattern}/{string}/[flags]

这居然是替换指令的完整版解释!范围问题已经解决,正则表达式即{pattern}就提到,而{string}就只能有一些转义字符出现,再讲讲[flags],怎么样?

但是当你要批量修改一个文件的格式,精确查找就有点捉襟见肘了。

主角闪亮登场!

正则表达式(Regular Expression)其实就是字符串匹配的模式(pattern),除了查找和替换,你甚至可以利用它来判断一个字符串是否合法,例如是不是一个IP地址。(\(\d\{1,3}\.\)\{3}\d\{1,3},不过是个错误写法)

警告:Vim里面的正则表达式也许和你曾经了解过的正则表达式有较大区别。

而一切的一切,都从我们要讲的模式串(有些地方叫元字符)开始。我们以启用magic模式的表达为准

了解了这两大类模式串,不如再来点例子吧:

关于函数式就不再说明,使用方式::s/(pattern)/\=(function)
还有一些稍微高级和难记的模式串也不在讲解范围之内,请自行阅读帮助文档,当然我觉得这些应该够用了。

补充几点:

magic

正则表达式不好记,不会记,不想记,怎么办?

这问题好说:那就别记嘛

可是某些字符又会被当成模式串,那怎么办?

那就告诉Vim,我们要让所有字符串都表示本意。

\V之后的正则表达式,无论什么字符(除/?,或反斜杠修饰)都没有特殊含义了。

试一试:?\V.?\V\n

\V取Very nomagic之意,与之类似的有小写的\v。

还有较为中性的\m( textsf{magic} )\M(nomagic) 差别不大。

搜索与字符的偏移

字符串的匹配需要有指定前缀,但是又不希望把这一部分也替换掉,怎么办?:%s/aaa\zsbb/cc/就可以将aaabb替换成aaacc。

和/zs相对应的是/ze。

详见最后一张正则表达式的图片:

8. 插件

并没有这个板块(所以连目录里面都没有)。

其实是我没有用插件,因为要模拟考场环境懒啊。

可参考后文Sources

9. 学会使用帮助文档

你在Linux系统下可能会遇到许多问题,这时便会选择使用搜索引擎,看看有没有一些有用的结果。

而这些结果或许会告诉你:Read Theing Manual

所以,Vim贴心为你自带了帮助文件,只要这样就可以打开:

推荐直接在vim下阅读,因为它可以支持帮助文本的高亮和跳转:

实际上tag链接以*包含,跳转链接以|包含

都是英文看不懂?其实是有中文翻译的:Vimcdoc。可以在线阅读或下载解压,并用脚本安装到 vim 的 doc 中。

提示:通过阅读usr_XX的文章并且熟练掌握它们,你对于Vim的理解就将会有质的飞跃。(但你有时间吗)

提示:有什么键忘记了找:help挺好,考场也可以找。

STEP 5 与 bash or console搭配使用

简而言之,只需了解 bash 是扩充版的 shell , Console 用于在桌面环境提供 bash 。 Vim 运行于 Console 中,由 bash 调用。

哈哈哈哈哈哈哈这都不知道。

^ 听到bash对你的嘲讽了吗?如果连最基本的bash指令都不会,还搞什么编译代码。

快来攻破这个东西:

以下命令中,可能是bash中的内建命令与保留字,也有可能是特定的程序。

以下和bash语法相关

其实bash也是一个语言的解释器,风格会和Python等语言有点相似。

可能这几种结构在考场上的最大作用就是写对拍脚本了233

如何编写一个可执行的脚本?

下面抛出例子:

#!/bin/bash

./duipai
./aa
./aa_dui

while(diffaa.outaa.ans)
do
./duipai
./aa
./aa_dui
done

echoBAD|wall

具体的东西之前都已经提到了,并没有什么差别。

注意:第一行的#!描述的是解释器,不写就调用系统默认 shell ,所以写 shell 脚本没有大问题,但如果你要写个 py 脚本嘛……

警告:直接执行脚本需要让它有可执行权限,只要chmod +x a.sh再./a.sh就可以直接运行了。

g++相关

基本的:编译某个源文件g++ a.cpp

我们想要使它输出的可执行文件有个漂亮的名字?g++ beautify.cpp -o beautify

(Linux下的可执行文件不一定有扩展名)

要警告?g++ well.cpp -o bad -Wall

不需要某个特殊的警告? 假设要关掉-Wreturn-type,我们可以编译时这样写g++ noreturn_at_getans.cpp -o jing_dian_cuo_wu_shi_fan -Wall -Wno-return-type或g++ noreturn_at_getans.cpp -o jing_dian_cuo_wu_shi_fan -Wall -Wno-error=return-type

需要吸氧?g++ gugu.cpp -o gugu -Wall -O2

需要帮助?g++ --help

Console相关

编辑配置文件界面

我们仅需了解Console对标签页和颜色的控制即可。

Sources \&\& Thanks

参考文献地址:https://www.luogu.org/paste/pfxf1243

彩蛋:关于Vi与Vim

setcompatible

虽然说在Vim里面可以通过上面这行兼容命令达到和vi相似的效果,但没有原汁原味的Vi来的爽啊……

为什么不直接运行Vi呢?你会发现那就是vim。

所以,把下面这行指令丢进你的终端吧:

sudoapt-getinstallnvi

装一个更加高仿Vi的NEW Vi吧!

彩蛋的彩蛋:尝试在nvi中按下这组组合键:Ctrl+\,即可进入ex模式,和直接运行vim -E或在vim内按下组合键gQ等效。不要忘了调用help指令愉快玩耍哦!也可以看看这个我搜出来的文章。

ex是Vim对行编辑器ed的支持.ed是一个面向行的编辑器.在远古时代,还是黑白终端的时代,有一个流行的面向行的编辑器 ed ,也即把文件一行一行的读入,一次只显示一行,然后编辑这行.所以Vim中的ex命令都是ed 编辑器所支持的命令,现代所用的流编辑器sed中的命令是 ed 命令的扩展.所以掌握了Vim中的 ex编辑命令,稍加变通就连 sed 也一起搞定了.

Vim是全屏编辑器,因此不会像ed那样只显示一行,对于Vim, ed命令编辑的一般都是当前行,这就相当于ed中所显示的那行,实际上也是文件的当前行.

https://blog.csdn.net/hitlion2008/article/details/8799327

丰富至极:

Feng fu zhi ji

文章使用与转载许可:CC-BY-SA 4.0


本文发布于洛谷日报,特约作者:小老虎3018

原文地址:https://www.luogu.org/blog/Tiger3018/vim-basic-learning

预约SEO大佬

添加微信:bmzkj01 免费交流解答,并送你一份最新运营推广方案

上一篇:快看点号自媒体平台(快看点号自媒体平台怎么发布作品)

下一篇:快看点号自媒体平台官网(快手快看点号自媒体平台)