vim基本认识

必要性

服务器上编写文件配置

后端和运维工程师必须掌握的编辑器,不然服务器上操作很不习惯

纯键盘操作,可以提高编辑效率

难点

vim难上手学习曲线陡峭

vim资料少,网上的博客资料都比较零散,学习困难

vim命令多,难以记忆

下载安装

linux 自带

初识vim

  • 输入vim命令进入vim
  • 进去之后似乎没法输入东西,起始默认进去是normal模式
  • 使用:q可以退出vim

开始编辑

进入编辑模式就可以像其他编辑模式一样编辑

  • 使用i(insert)进入编辑模式,开始输入文字
  • 或者输入 a(append), o(open a line below)
  • 使用Esc又可以回到normal模式, 输入:wq保存退出
  • a、i、o / A、I、O
1
2
3
4
5
6
7
a append        a 往后追加
i insert i往前追加
o open a line below o下一行写

A append after line A 在一行的结尾写
I insert before line I 在一行的前面写
O append a line above O 在上一行写

vim多种模式

vim和其他编辑器的区别在于多种模式

  • 进入vim默认是normal模式
  • 使用a、i 等进入编辑模式
  • :cmd模式和 v(visual)可视化模式

为什么vim进入之后不像其他编辑器一样直接插入

  • 进入vim模式是normal模式,使用 esc从插入进入普通模式
  • 普通模式下可以进行各种命令的操作和移动
  • 大部分情况下是在浏览而不是编辑,所以vim默认是normal模式

Insert插入模式

  • 使用a、i、o A、I、O进入插入模式

命令模式

normal模式输入:之后的命令,比如说保存退出命令:wq

  • w q命令
  • 分屏 : vs(vertical split) sp(split)
  • 比如说使用:%s/foo/bar
  • /g全局替换

visual(可视)模式

  • Normal模式下使用v进入visual选择
  • 使用 V选择整行
  • 使用ctrl+v进行方块选择

vim插入模式小技巧

快速纠错

  • 进入vim之后首先使用a/i/o之一进入插入模式
  • ctrl+h删除上一个字符,ctrl+w删除上一个单词,ctrl+u删除当前行

快速切换insert和normal模式

很多键盘的键位设置,Esc按起来不方便,不方便切换到normal

  • 使用ctrl+c代替Esc 或者 ctrl+[
  • 在normal模式下用 gi快速跳转到你最后一次编辑的地方并进入插入模式

vim快速移动

反人类的hjkl

众所周知,vim normal 模式使用了反人类的 hjkl 来移动

  • 据说编辑器的作者在编写vim的时候键盘还没有流行上下左右按键
  • 左(h) 右(l) 上(k) 下(j),移动也不会让手指脱离主键盘区

在单词之间移动

  • w/W移动到下一个word/WORD开头,e/E下一个word/WORD
  • b/B回到上一个word/WORD开头,可以理解成backword
  • word指的是以非空白符分割的单词,WORD以空白符分割的单词

行间搜索移动

同一行快速移动的方式其实是搜索一个字符并且移动到该字符

  • 使用f{char}可以移动到char字符上,t 移动到char的前一个字符
  • 如果第一次没搜到,可以用分号(;) / 逗号(,) 继续搜索该行下一个 / 上一个
  • 大写的F表示反过来搜前面的字符

vim水平移动

  • 0移动到行首第一个字符, ^移动到第一个非空白的字符
  • $移动到行尾,g_移动到行尾非空白字符
  • 记住常用的 0$ 就可以满足日常需求了

vim垂直移动

  • 使用括号()在句子间移动,你可以用:help (来查看帮助文档
  • 使用{}在段落之间移动

vim页面移动

  • gg/G移动到文件开头和结尾,你可以使用ctrl+o快速返回
  • H / M / L跳转到屏幕的开头(Head),中间(Middle)和结尾(Lower)
  • ctrl+uctrl+f上下翻页(upword / forward)。zz把屏幕置为中间

vim快速增删改查

vim增加字符

  • 进入插入模式编辑文本
  • 使用a / i/ o进入插入模式

vim快速删除

  • vim在normal模式下使用x快速删除一个字符
  • 使用d(delete)配合文本对象快速删除一个单词
  • dx可以搭配数字来执行多次,数字+命令表示多次执行命令

vim快速修改

  • 常用有三个,r(replace)c(change)s(substitute)
  • normal模式下使用r可以替换一个字符。s替换并进入插入模式
  • 使用c配合文本对象,我们可以快速进行修改

vim查询

  • 使用/或者?进行前向或者反向搜索
  • 使用n/N跳转到下一个或者上一个匹配
  • 使用*或者#进行当前单词的前向和后向匹配

vim如何搜索替换

vim替换命令

substitute命令允许我们查找并且替换文本,并且支持正则

  • :[range]s[ubstitute]/{pattern}/{string}/[flags]
  • range表示范围,比如:10,20表示10-20行,%表示全部
  • pattern是要替换的模式,string是替换后文本

替换标志位

flags有几个常用的标志

  • g(global)表示全局范围内执行
  • c(confirm)表示确认,可以确认或者拒绝修改
  • n(number)报告匹配到的次数而不替换,可以用来查询匹配次数

例子::% s/self/this/g 表示把所有的self 都替换成this

vim多文件操作

Buffer Window Tab

几个多文件操作相关的概念

  • Buffer是指打开的一个文件的内存缓冲区
  • 窗口是Buffer可视化的分割区域
  • Tab可以组织窗口为一个工作区

Buffer 缓冲区

  • vim 打开一个文件后会加载内容到缓冲区
  • 之后的修改都是针对内存中的缓冲过去,并不会直接保存到文件
  • 直到我们执行:w的时候才会把修改内容写入到文件里

Buffer 切换

  • 使用:ls会列举当前缓冲区,然后使用:b n跳转到第n个缓冲区
  • :bpre跳转到前一个,:bnext跳转到下一个,:bfirst跳转到第一个,:blast跳转到最后一个
  • 或者用:b buffer_name加上tab补全进行跳转

windows窗口

窗口是可视化的分割区域

  • 一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同的缓冲区
  • <ctrl+w>s水平分割,<ctrl+w>v垂直分割。或者:sp:vs
  • 每个窗口可以继续被无限分割

Tab(标签页)将窗口分组

Tab是可以容纳一系列窗口的容器 (:h tabpage)

  • vim的Tab和其他编辑器不太一样,可以想象成linux的虚拟桌面
  • 比如一个Tab全用来编辑python文件,一个Tab全是html文件
  • 相比窗口,Tab一般用的比较少,Tab太多管理起来比较麻烦

vim的文本对象

Text Object(文本对象)

  • vim里文本也有对象的概念,比如一个单词。一段句子,一个段落
  • 很多其他编辑器经常只能操作单个字符来修改文本,比较低效
  • 通过操作文本对象来修改要比只操作单个字符高效

文本对象操作方式

  • [number][text object]
  • number 表示次数,command是命令,d(elete), c(hange), y(yank)
  • text object是要操作的文本对象,比如单词w,句子s,段落p

vim复制粘贴与寄存器的使用

vim在normal模式复制粘贴

  • 在normal模式下复制粘贴分别使用y(yank)和p(put),剪切使用d和p
  • 使用v(visual)命令选中要复制的地方,然后使用p粘贴
  • 配合文本对象:比如使用yiw复制一个单词,yy复制一行
  • 注意:vim里的剪切(cut) ,复制(copy),粘贴(past)分别为 delete / yank / put

在insert模式下的复制粘贴

很多人会使用鼠标进行选中,然后使用ctrl+v或者cmd+v粘贴

  • 这个和其他的文本编辑器差不多,但是在粘贴代码有个坑
  • 很多人在vimrc中设置了autoindent,粘贴Python代码缩进错乱
  • 这时候需要使用:set paste:set nopaste解决

什么是vim的寄存器

  • vim里操作的是寄存器而不是系统剪贴板,这和其他编辑器不同
  • 默认我们使用d删除或者y复制的内容都放到了“无名寄存器”
  • 使用x删除一个字符放到无名寄存器,然后p粘贴,可以调换俩字符

深入寄存器(register)

vim不使用单一剪切板进行剪切、复制与粘贴,而是多组寄存器

  • 通过"{register}前缀可以指定寄存器,不指定默认用无名寄存器
  • 比如使用"ayiw复制一个单词到寄存器a中,"bdd删除当前行到寄存器b中

其他寄存器

除了有名寄存器a-z,vim中还有一些其他寄存器

  • 复制专用寄存器 "0使用y 复制文本同时会被拷到复制寄存器0
  • 系统剪切板 "+可以在复制前加上"+复制到系统剪切板
  • 其他一些寄存器比如 "%当前文件名,".上次插入的文本
  • 使用:set clipboard=unnamed可以让你直接复制粘贴系统剪切板内容

vim使用宏完成批量操作

从一个需求说起,给多行的url链接加上双引号

什么是vim宏

  • 宏可以看成是一些列命令的集合
  • 我们可以使用宏 录制 一些列操作,然后用于 回放
  • 宏可以非常方便的把一系列命令用在多行文本上

如何使用宏

宏的使用分为录制和回放

  • vim使用q来录制,同时也是q结束录制
  • 使用q{register}选择要保存的就存器,把录制的命令保存在其中
  • 使用@{register}回放寄存器中保存的一系列命令

用宏解决刚才的问题

  • 先给一行加上双引号,然后再回放到其他所有行
  • 我们先使用q开始录制,给一行加上双引号,之后使用q退出
  • 在剩下的所有行中回放录制的宏
  • 在剩下的行中,先按shift+v选中一行,再G选中剩下的所有,:normal @{register}

不使用宏解决刚才的问题

  • shift+v选中一行,G选中剩下的,:normal I",这样先在所有的url前面加上左双引号
  • shift+v选中一行,选中剩下的,:normal A",在后面插入双引号

vim补全大法

只要手速快,补全什么的都是浮云

  • 补全是根据当前环境上下文,由编辑器 猜 你想输入的东西
  • 比如补全一个单词、文件名,或者代码中的函数、变量名等
  • vim中提供了多种补全功能,还可以由插件拓展功能实现代码补全

常见的三种补全类型

  • 使用ctrl+nctrl+p补全单词
  • 使用ctrl+x ctrl+f补全文件名
  • 使用ctrl+xctrl+o补全代码,需要开启文件类型检查,安装插件

给vim换个配色

很多现代化的编辑器和IDE都支持更换主题,vim当然也可以

  • 使用:colorscheme显示当前的主题配色,默认是 default
  • 使用:colorscheme <ctrl+d>可以显示所有的配色
  • 使用:colorscheme 配色名 就可以修改配色

可以在网上下载主题配色

举个例子:https://github.com/w0ng/vim-hybrid

然后git clone https://github.com/w0ng/vim-hybrid.git

1
2
3
mkdir ~/.vim/colors

cp vim-hybrid/colors/hybrid.vim ~/.vim/colors

然后就可使用了

vim配色:http://www.easycolor.cc/vim/list.html

编写vim配置

什么是vim配置

  • vim里非常多常用的设置,比如set number设置行号
  • 之前的使用都是在vim里临时设置,没法持久化,每次设置都很麻烦
  • vimrc提供了一种持久化配置的方式,我们可以自定义配置

如何编写vim配置文件

  • Linux / Unix 下新建一个隐藏文件夹 vim ~/.vimrc
  • Windows系统 vim $MYVIMRC,通过环境变量编辑配置文件
  • 然后就可以编写配置文件了

vim配置都包含什么

  • 常用设置,比如:set nu 设置行号,colorscheme hybrid设置主题
  • 常用的vim映射,比如noremap <leader>w :w<cr>保存文件
  • 自定义的vimscript函数和插件的配置

vim中的映射基本设置

  • 设置一下leader键let mapleader = ","
  • 比如用inoremap <leader>w <Esc>:w<cr>在插入模式保存

输入:h option-list可以查看所有设置的选项

vim映射

什么是vim映射

vim映射就是把一个操作映射到另一个操作

  • 如果你不满现在的按键设置,比如说vim本来的命令
  • 或者你想映射一些方便的快捷键
  • 按照你自己的意愿定制vim

基本映射

基本映射就是指 normal模式下的映射,当然还有其他模式下的映射

  • 使用map就可以实现映射。比如 :map - x,然后按-就会删除字符
  • :map <space> viw告诉vim按下空格的时候选中整个单词
  • :map <c-d> dd可以使用ctrl+d执行dd命令删除一行

模式映射

  • nmap / vmap / imap定义映射只在normal / visual / insert分别有效
  • :vmap \ U把在visual模式下选中的文本大小(u/U转换大小写)
  • 使用:imap <c-d> <Esc>ddi,在insert模式下映射ctrl+d来删除一行

现有映射的问题

比如说映射:namp - dd, 再 :nmap \ -

当你按下\时,vim会解释成-。而我们有映射了-,vim会继续解析-dd,所以按下\会删除整行。

递归与非递归映射

*map系列命令有递归的风险

  • 如果你安装了一个插件,插件映射到了同一个按键的不同行为,用冲突 就会有一个失效
  • 想要保证映射没有冲突就会非常痛苦
  • 解决方案就是使用非递归映射

非递归映射

vim提供了非递归映射,这些命令不会递归解释

  • 使用*map对应的nnoremap / vnoremap / inoremap
  • 任何时候都应该使用非递归映射,拯救自己和插件作者

网上有免费的小书《笨方法学Vimscript》 学习vim脚本的书籍

vim安装插件

vim插件简介

和其他现代流行编辑器一样,vim同样支持插件扩展

  • vim插件是使用vimscript 或者其他语言编写的vim功能扩展
  • 编辑器自带的功能有限,有了插件之后几乎可以无限扩展其功能

安装插件介绍

原始的方式是直接clone插件代码,现如今vim有很多插件管理器

常见的有vim-plugVundlePathogenDein.Vimvolt

综合性能、易用性、文档等几个方面考虑,推荐使用vim-plug

使用vim-plug安装插件

https://github.com/junegunn/vim-plug

按照文档进行安装

1
2
3
4
5
6
# 终端输入
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim



安装第一个插件

安装vim-startify,一个好用的vim开屏插件

如何寻找需要的插件

先有需求,后有插件。大部分插件都托管在github上

  • 通过google搜索关键字寻找想要的插件
  • https://vimawesome.com/
  • 浏览网上开源的vim配置借鉴想要的插件

vim美化插件

更改vim的外观

vim配色方案

vim文件目录和搜索插件

文件目录树

使用nerdtree插件进行文件目录树管理

模糊搜索器

如果想快速查找并且打开一个文件可以用 ctrlp 插件

vim快速定位插件

vim移动命令

  • 比如w / e基于单词移动,gg / G文件首尾,0 / $行首尾,f{char} 查询字符
  • ctrl+fctrl+u前后翻屏

如何移动到任意位置

可以使用vim的搜索/加上n跳转,但是使用easymotion更加方便

vim-surround 成对编辑

如果快速更换一对单引号为双引号

vim-surround使用

normal模式下增加,删除,修改成对内容

  • ds(delete a surrounding)
  • cs(change a surrounding)
  • ys(you add a surrounding)

vim模糊搜索和替换插件

模糊搜索

  • vim自带的搜索/ 可以搜索当前文件,但是项目有很多文件
  • 需要一个插件来模糊搜索多个文件内容
  • 使用Ag.vim或者fzf.vim都可以很好地支持模糊搜索

fzf与fzf.vim

fzf是一个强大的命令行模糊搜索工具,fzf.vim集成到了vim里

搜索替换插件far.vim

如果想批量搜索替换,可以试试far.vim

golang之vim-go插件

IED一代又一代,经典的编辑器却长久不衰

  • 除了Java,很多人用vim编写shell / php / python / gplang
  • 前端很多人使用vscode,sublime / Atom 有没落之势
  • 很多后端和运维工程师使用vim

vim-go插件

功能强大的golang插件

python-mode 把vim打造成轻量级IDE

python-mode

python插件使用比较多的是 jedi-vimpython-mode

vim tagbar插件 浏览代码

tagbar 就是代码大纲

vim-interestingwords

可以高亮你感兴趣的单词

强大的vim代码补全插件

deoplete.nvim

一个强大的 neovim / vim8 异步补全插件

coc.vim

一个强大的 neovim / vim8 补全插件,支持LSP(Language Server Protocol)

vim代码格式化与静态检查

  • 把精力集中在代码逻辑本身,而不是整理格式这些浪费精力的事情
  • 静态检查是为了让编写的代码更规范。 golint/pylint/eslint

格式化插件

Neoformat和vim-autoformat是两种使用较多的格式化插件

静态检查

neomake和ale是两种常用的lint插件

  • http://github.com/w0rp/ale
  • 同样需要安装对应语言的lint库,比如eslint/pylint/golint
  • vim8、neovim支持异步检查,不会影响vim编辑,推荐使用

vim快速注释代码

vim-commentary

vim与git

fugitive

在vim里使用git

vim-gitgutter

在vim里显示文件变动

gv.vim

Vim和Tmux

tmux是一个强大的终端复用工具

  • 可以复用终端、分屏、托管进程等
  • 在服务器上即使退出服务器也不会被kill,托管进程也很方便
  • 可以方便地分割屏幕实现多个进程共用屏幕

让vim嵌入开发工具

几乎所有流行的编辑器和IDE都支持vim插件

  • 即使你不用vim作为主力编辑器,依然可以使用它的编辑方式
  • 几乎所有流行的编辑器和IDE都支持vim插件,以vim方式编辑
  • 比如vscode / atom / pycharm等都支持安装vim插件

neovim

一个新的vim版本,支持异步特性

  • https://neovim.io/
  • 开发更活跃,更丰富的特性和扩展,异步支持
  • neovim的设计可以嵌入到很多GUI里,外壳好看

使用开源配置

可以从网上直接使用一些开源配置