vim简单教程及配置

vim是什么?

既然今天是向大家安利vim,那么先说说安利的原因吧:

通过官网链接下载vim并且安装后,我们可以看到vim的启动界面——

唔,请关注重点……

我是在安利读者为慈善事业做贡献呢!

这个逼装的,我给99分……剩下1分哪里去了呢?

——剩下一分是因为vim确实确实非常好用

言归正传,vim是一款编辑器,而编辑器是什么呢?

编辑器就是类似于notepad(记事本)这样的只能用来打字的工具,而当这种工具集成了编译运行调试等等功能后,就成了集成开发环境(Integrated Development Environment)也就是我们常说的IDE,比如DevC++和VC6.0。

IDE与编辑器的区别就在于由于IDE集成了所有功能,所以对初学者非常友好,但是开发效率通常来说比较糟糕,反之,编辑器一心只做编辑方面的优化,所以在编写代码方面效率完爆IDE。这些在之后都会提到。

Vim作为一个编辑器,作者亲身经历表示他至少能让你的代码编写速度提升一倍,而且和vim配套使用的g++,gdb还会使你的代码调试速度变成原来的三倍甚至更多。

为什么是vim

  1. 作者作为一个vim党,当然会推荐vim咯
  2. 帮助乌干达的可怜儿童
  3. 无视个人偏好,emacs,notepad++,sublime等“编辑器”都是很不错哒(换句话来说dev-c++,vc6.0,xcode等IDE就不符合这篇文章的核心思想了),当然,vim也属于这些编辑器中的一个
  4. 以后同学们编写代码不一定是在本机,有可能需要登录到其他电脑上,这时能够在终端里面使用的编辑器据我所知也就vim和emacs了,到时候即使你是一个资深IDE党也不得不去学习使用vim。
  5. 我曾在计算机系群里的调查,结果如下(大势所趋,不服不行啊……):
    1. 明确表示使用编辑器编程的同学们中,vim党最多
    2. 对于所有的被调查者vim也有相当大的优势

vim怎么用

不同平台的vim其实都是大同小异的

我们接下来就用mac下的终端vim举例了。

安装

不同平台vim的安装方式不同

  • Windows用户:在vim官网中搜索安装方法与安装文件,需要注意的是,windows下的vim是gvim,表示图形界面版本的vim。
  • Linux用户:可以使用该发行版自带的包管理器安装vim,比如Ubuntu使用apt install vim
  • Mac用户:brew install vim

与此同时,倘若用vim写C++程序的话,我们还需要安装g++与gdb。

  • Mac用户:brew install g++ ,gdb最好就改成mac自带的lldb好了
  • Ubuntu用户:apt-get install g++ && apt-get install gdb
  • Windows用户:
    • 方法1:首先安装Dev-C++,在安装目录中找到g++,gdb所在的目录,将目录加入windows环境变量path中,至于环境变量该怎么用,有什么意义,不是本文探讨的范畴。
    • 方法2:安装MingW,然后使用mingw-get安装g++。

运行

Windows用户

windows用户在桌面打开图标就好了。

当你看到帮助乌干达的可怜儿童那句话就说明你成功打开vim了~

注意vim存在一个当前目录的概念,windows大家最好还是通过“用Vim打开”一个目录特定文件的方式进入vim以确保当前文件夹就是你想要储存文件的文件夹。否则,倘若直接打开vim的桌面快捷方式,你保存的文件会去一个奇奇怪怪的地方。

而检验gdb/g++是否安装成功,你只需要在CMD里面输入命令g++ ,看是否报错说没有该命令。

MAC/LINUX用户

mac、linux用户在终端输入vim命令即可,在mac/linux终端里面,你在哪个文件夹下打开的vim,vim的当前目录就是哪个。

而检验gdb/g++是否安装成功,你只需要在终端输入命令g++ ,看是否报错说没有该命令。

vim简易教程

首先,vim官方是有教程的,在开始界面输入:help 就可以直接进去

其次,如果想要学习vim,最好拿着电脑跟着教程亲自试一试

最后,要有心理准备,你可能会经历一周左右生不如死的适应过程。

第一步:像用记事本一样用vim

先说个笑话:

问:如何生成随机字符串
答:让萌新退出vim

大家可以自己尝试一下(windows用户不允许使用窗口那个红叉叉)就会发现,进入vim后,不但不容易退出,甚至按键盘是无法直接开始编写程序的,因为vim分为不同模式,开始时进入的模式叫做“命令模式”,是专门输入命令的,而我们需要在“插入模式”中写程序。

模式切换

命令模式:输入命令的模式。之后没有特殊指名,所以命令都在命令模式下输入

插入模式:输入字符直接插入文本的模式

  • 命令模式->插入模式:i
  • 插入模式->命令模式:<esc>

基本操作

vim中,有很多操作以冒号开头,这些操作使用频率相对较低,但不影响其重要性:

退出vim:退出:q 或强制退出:q!

  • 查看帮助::help
  • 运行命令::!<command> ,例如:!ls 列出当前文件夹下文件(命令的执行目录为当前vim打开的文件的目录)
  • 保存文件::w 或:w <filename>
  • 打开文件(若不存在新建)::e filename

保存与打开文件可以为绝对路径,也可以为一个文件名,此时默认在“当前目录”打开

快捷操作

在命令模式中,命令不一定以冒号开头。

  • 剪切/删除一行:dd
  • 粘贴:p
  • 撤销:u
  • 回退:<ctrl+r>
  • 光标移动:方向键或h /j /k /l

第二步:像IDE一样用vim

先从一个特定目录进入vim,然后编写程序,并保存为a.cpp.

我们知道,倘若在终端下切换到了源文件所在目录,执行g++ a.cpp –o a 可以将当前文件下的a.cpp编译为可执行文件,同理,调用gdb ./a 可以使用gdb调试程序(mac是lldb)。

我们还知道,vim中,我们可以使用:!<command> 调用外部命令,所以我们在vim中输入:!g++ % -o %< 就等同于从终端用g++命令编译源文件。(注意:命令中的% 表示当前vim正在编辑的文件的文件名,而%< 则表示他去了后缀的文件名。)

通过上面所述的手段,我们可以实现在vim中的编译运行:

  • 编译::!g++ % -o %<
  • 调试::!gdb %<
  • 运行::!%< 
  • 查看空间::!size %<

vim提供了键盘映射函数map,形如:map A : B ,那么如果我们提前用了映射命令,就不用输入编译命令了。

  • 编译::map <F9> : !g++ % -o %< <CR>
  • 运行::map <F6> : !%< <CR>
  • 调试::map <F5> : !gdb %< <CR>

其中,<CR> 表示回车,读者可以试试没有这个<CR> 会变成什么。

通过了映射,我们可以直接按<F9> 编译,按<F5> 调试。

最后,由于这些map命令时预处理性质的,我们可以将它写入一个叫做vimrc的文件,每次打开vim的时候自动加载

  • 在mac/linux中该文件为~/.vimrc
  • 在windows中,可在菜单栏-编辑-启动设置中直接修改

比如我们可以在vimrc中加入

map <F9> : !g++ % -o %< <CR>
map <F6> : !%< <CR>
map <F5> : !gdb %< <CR>

 

第三步:定义自己的vim

之前已经知道vimrc中可以定义编译运行快捷键,实际上还可以有更多的自定义属性,比如:

  • 左边显示行号:set number
  • 查找命令高亮:set hlsearch
  • 开启自动缩进:
    • set smartindent
    • filetype plugin indent on
  • 用鼠标拖拽分栏:set mouse=a
  • 设置折叠:set fdm=marker
  • 设置缩进:
    • set tabstop=2
    • set softtabstop=2
    • set shiftwidth=4
  • 设置代码高亮:syntax on
  • 令插入模式jj为退出:imap jj <esc>
  • 设置颜色:colors evening

其中,颜色我推荐大家使用

加上这些命令之后,界面美观度一下就上升了——

最后,读者可以在文末找到我的vimrc配置文件。

第四步:神一般的编辑器

了解完之前的只是,我们也只能把vim当做记事本来用,下面介绍一些快捷键,可以极大加快编写代码的速度。在开始了解快捷键前,你需要知道vim快捷键的设计初衷是让你可以不用鼠标,甚至手不离开主键盘就可以打字。

基本操作

vim中,有很多操作以冒号开头,这些操作使用频率相对较低,但不影响其重要性:

  • 退出Vim: :q
  • 强制退出Vim: :q!
  • 查看帮助::help
  • 运行命令::!<command> ,例如:!ls 列出当前文件夹下文件(命令的执行目录为当前vim打开的文件的目录)
  • 保存文件::w 或:w <filename>
  • 强制保存::w!
  • 保存并退出::wq
  • 打开文件(若不存在新建)::e filename

撤销操作

  • 撤销:u
  • 回退:<ctrl+r>

分栏

  • 竖向分栏::vsp
  • 横向分栏::sp
  • 不同栏跨越::<ctrl+w> <up>/<down>/<left>/<right> 或:<ctrl+w> i/j/k/l

多文件

打开vim时用vim a.cpp b.cpp 或vim *.cpp 可以同时打开多个文件,不过第一个文件全屏显示,需要通过快捷键切换。

  • 下一个文件::n
  • 上一个文件::N

进入插入模式

  • 当前光标前:i
  • 当前光标后:a
  • 当前行首:I
  • 当前行末:A
  • 当前行后新建一行:o
  • 当前行前新建一行:O
  • 退出插入模式:
    • 默认: <esc>
    • 在配置文件中加入imap jj : <esc> 之后,可用jj 退出插入模式

进入覆盖模式

  • 进入字符覆盖模式,并在覆盖后回到命令模式:r
  • 直接进入覆盖模式:R

复制粘贴与删除

  • 复制当前行:yy
  • 剪切当前行:dd
  • 删除光标位置字符:x
  • 复制之后的10行:10yy
  • 剪切之后的10行:10dd
  • 全文复制::%y
  • 复制第3行到第5行::3,5 y
  • 剪切第3行到第5行::3,5 d
  • 粘贴:p
  • 粘贴10份:10p

光标跳转

  • 行首:^
  • 行末:</span></li>  	<li>第5行:<span class="lang:default decode:true crayon-inline ">5G</span> 或<span class="lang:default decode:true crayon-inline">:5</span></li>  	<li>光标移动:方向键或<span class="lang:default decode:true crayon-inline ">h</span> /<span class="lang:default decode:true crayon-inline ">j</span> /<span class="lang:default decode:true crayon-inline ">k</span> /<span class="lang:default decode:true crayon-inline">l</span></li>  	<li>文首:<span class="lang:default decode:true crayon-inline ">H</span></li>  	<li>文末:<span class="lang:default decode:true crayon-inline ">L</span></li> </ul> <h4>查找替换</h4> <ul>  	<li>查找:<span class="lang:default decode:true crayon-inline ">/pattern</span></li>  	<li>全文替换:<span class="lang:default decode:true crayon-inline">:%s/old_pattern/new_pattern/g</span></li>  	<li>全文替换(每行替换第一个匹配):<span class="lang:default decode:true crayon-inline">:%s/old_pattern/new_pattern</span></li>  	<li>第5至10行替换:<span class="lang:default decode:true crayon-inline ">:5,10s/old_pattern/new_pattern/g</span></li>  	<li>跳到下一个:<span class="lang:default decode:true crayon-inline ">n</span></li>  	<li>跳到上一个:<span class="lang:default decode:true crayon-inline ">N</span></li>  	<li>替换所有int单词(正则表达式使用):<span class="lang:default decode:true crayon-inline ">:%s/\<int\>/long long/g</span></li> </ul> <h4>代码缩进</h4> <ul>  	<li>自动缩进:<span class="lang:default decode:true crayon-inline ">yy=G</span> 或<span class="lang:default decode:true crayon-inline ">gg=G</span></li>  	<li>第五行到第十行向前缩进:<span class="lang:default decode:true crayon-inline ">5,10 <</span></li>  	<li>第五行到第十行向后缩进:<span class="lang:default decode:true crayon-inline ">5,10 ></span></li>  	<li>接下来五行向前缩进:<span class="lang:default decode:true crayon-inline ">5<<</span></li>  	<li>压行:<span class="lang:default decode:true crayon-inline ">J </span></li> </ul> <h4>其他</h4> <ul>  	<li>括号匹配:<span class="lang:default decode:true crayon-inline ">%</span></li>  	<li>宏定义(录制操作):<span class="lang:default decode:true crayon-inline">q<name></span></li>  	<li>宏定义调用:<span class="lang:default decode:true crayon-inline ">@<name></span> 或<span class="lang:default decode:true crayon-inline">@@</span></li>  	<li>调用make命令:<span class="lang:default decode:true crayon-inline ">:make</span></li> </ul> <h2>再论Vim的好处</h2> <h3>效率高</h3> <ol>  	<li>使用了vim你的手甚至可以不动鼠标,不离主键盘</li>  	<li>编程中存在的很多类似于复制特定行,粘贴若干遍的操作在vim下都是可以用命令解决的</li>  	<li>查找替换功能强大,连不能查找替换的很多功能都可以用宏来解决,对于批量修改帮助极大</li>  	<li>其配套的gdb让你永远告别肉眼查错,进入二分查错的行列,复杂度直接从O(N)降到了O(logN)</li> </ol> <h3>用途广</h3> <ol>  	<li>基本上所有平台都有vim,而其他IDE只能在特定平台用</li>  	<li>vim的操作不依赖于具体语言,不需要每学一门语言都重新学习一个新的IDE</li>  	<li>有丰富的插件可以使用(但是插件方面Vim比起Emacs还是差远了)</li>  	<li>Vim模式在很多地方都有支持,比如Emacs和Sublime,所以你学了Vim还可以直接迁移到这些平台上</li> </ol> <h3>好玩</h3> <ol>  	<li>突然发现找到了除大括号换不换行(当然要换)之外新的战场:编辑器用Emacs还是Vim(当然是Vim),引战什么的最好玩了~</li>  	<li>我这人还是非常支持慈善事业的</li>  	<li><img class="alignnone size-medium wp-image-1062" src="https://mhy12345.xyz/wp-content/uploads/2018/07/小冰-169x300.png" alt="" width="169" height="300" /></li> </ol> <h2>结语</h2> 愿世界和平,乌干达儿童幸福快乐~     原文为《【和平向】一波vim安利》,计62班级公众号 <h2>配置文件</h2> 总结下来,一个简单的windows版vimrc如下(其中1-33行是自带的内容,34行之后是自定义内容),这个版本适合OI党使用,可以现场手敲vimrc。 <pre class="lang:vim decode:true" title="简单的window版vimrc">sourceVIMRUNTIME/vimrc_example.vim
    source VIMRUNTIME/mswin.vim behave mswin  set diffexpr=MyDiff() function MyDiff()   let opt = '-a --binary '   if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif   if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif   let arg1 = v:fname_in   if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif   let arg2 = v:fname_new   if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif   let arg3 = v:fname_out   if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif   ifVIMRUNTIME =~ ‘ ‘
    if &sh =~ ‘\<cmd’
    if empty(&shellxquote)
    let l:shxq_sav = ”
    set shellxquote&
    endif
    let cmd = ‘”‘ . VIMRUNTIME . '\diff"'     else       let cmd = substitute(VIMRUNTIME, ‘ ‘, ‘” ‘, ”) . ‘\diff”‘
    endif
    else
    let cmd = $VIMRUNTIME . ‘\diff’
    endif
    silent execute ‘!’ . cmd . ‘ ‘ . opt . arg1 . ‘ ‘ . arg2 . ‘ > ‘ . arg3
    if exists(‘l:shxq_sav’)
    let &shellxquote=l:shxq_sav
    endif
    endfunction

    set hlsearch
    set mouse=a
    set smartindent
    set fdm=marker
    set number
    set tabstop=4
    set softtabstop=4

    syntax on
    filetype plugin indent on
    imap jj <esc>
    map <F9> : ! g++ % -o %< -g -Wall -Wextra -Wconversion <CR>
    map <F5> : ! gdb %< <CR>
    map <F2> : ! python % <CR>
    colors evening
    MAC版的vimrc如下(支持了更多文件的运行快捷键)

    set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
    set termencoding=utf-8
    set encoding=utf-8
    
    function Compile()
    		if &filetype == 'cpp'
    				exec "!g++ % -o %< -g -Wall -Wextra -Wconversion -std=c++11"
    		elseif &filetype == 'c'
    				exec "!gcc % -o %< -g -Wall -Wextra -Wconversion"
    		elseif &filetype == 'pas'
    				exec "!fpc % -g"
    		elseif &filetype == 'tex'
    				exec "!xelatex '%'"
    		elseif &filetype == 'java'
    				exec "!javac %"
    		elseif &filetype == 'scss'
    				exec "!sass % > %<.css"
    		endif
    endfunction
    
    function Debug()
    		if &filetype == 'cpp' 
    				exec "!gdb ./%<"
    		elseif &filetype == 'tex'
    				exec "!okular './%<.pdf'"
    		elseif &filetype == 'java'
    				exec "!jdb %<"
    		endif
    endfunction
    
    function Run()
    		if &filetype == 'cpp'
    				exec "!time ./%<"
    		elseif &filetype == 'tex'
    				exec "!okular './%<.pdf'"
    		elseif &filetype == 'java'
    				exec "!java %<"
    		elseif &filetype == 'ruby'
    				exec "!ruby %"
    		elseif &filetype == 'html'
    				exec "!firefox %"
    		elseif &filetype == 'php'
    				exec "!php %"
    		elseif &filetype == 'sh'
    				exec "!bash %"
    		endif
    endfunction
    
    set hlsearch
    set smartindent
    set number
    set tabstop=4
    set softtabstop=4
    set shiftwidth=4
    set expandtab
    set mouse=a
    syntax on
    filetype plugin indent on
    imap jj <esc>
    map <F9> : call Compile() <CR>
    map <F5> : call Debug() <CR>
    map <F6> : call Run() <CR>
    map <F8> : ! g++ % -o %< -O2 <CR>
    map <F12> : ! subl ./% <CR>
    map <F2> : ! python % <CR>
    colors evening

    最后,可以在这里找到我的最新的vimrc

《vim简单教程及配置》有4个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据