01-vim学习
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 | a append a 往后追加 |
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
开头,可以理解成backwordword
指的是以非空白符分割的单词,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+u
与ctrl+f
上下翻页(upword / forward)。zz
把屏幕置为中间
vim快速增删改查
vim增加字符
- 进入插入模式编辑文本
- 使用
a / i/ o
进入插入模式
vim快速删除
- vim在normal模式下使用
x
快速删除一个字符 - 使用
d(delete)
配合文本对象快速删除一个单词 d
和x
可以搭配数字来执行多次,数字+命令表示多次执行命令
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+n
和ctrl+p
补全单词 - 使用
ctrl+x
ctrl+f
补全文件名 - 使用
ctrl+x
与ctrl+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 | mkdir ~/.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-plug
,Vundle
,Pathogen
,Dein.Vim
,volt
等
综合性能、易用性、文档等几个方面考虑,推荐使用vim-plug
使用vim-plug安装插件
https://github.com/junegunn/vim-plug
按照文档进行安装
1 | # 终端输入 |
安装第一个插件
安装vim-startify,一个好用的vim开屏插件
- https://github.com/mhinz/vim-startify
- 修改
.vimrc
文件,增加该插件名称Plug 'mhinz/vim-startify'
- 重新启动vim 或者source 一下
.vimrc
,执行:PlugInstall
如何寻找需要的插件
先有需求,后有插件。大部分插件都托管在github上
- 通过google搜索关键字寻找想要的插件
- https://vimawesome.com/
- 浏览网上开源的vim配置借鉴想要的插件
vim美化插件
更改vim的外观
- 修改启动界面:https://github.com/mhinz/vim-startify
- 状态栏美化:https://github.com/vim-airline/vim-airline
- 增加代码缩进线条:https://github.com/yggdroot/indentline
vim配色方案
- vim-hybird配色:https://github.com/w0ng/vim-hybird
- solarized配色:https://github.com/altercation/vim-colors-solarized
- gruvbox配色:https://github.com/morhetz/gruvbox
vim文件目录和搜索插件
文件目录树
使用nerdtree插件进行文件目录树管理
- 地址:http://github.com/scrooloose/nerdtree
autocmd vimenter * NERDTree
可以在启动vim的时候打开目录树nnoremap <leader>v :NERDTreeFind<cr>
查找文件位置
模糊搜索器
如果想快速查找并且打开一个文件可以用 ctrlp
插件
- http://github.com/ctrlpvim/ctrlp.vim
- 需要映射
let g:ctrlp_map = '<c-p>'
- 使用
ctrl+p
然后输入少量字符进行模糊搜索
vim快速定位插件
vim移动命令
- 比如
w / e
基于单词移动,gg / G
文件首尾,0 / $
行首尾,f{char}
查询字符 ctrl+f
和ctrl+u
前后翻屏
如何移动到任意位置
可以使用vim的搜索/加上n跳转,但是使用easymotion更加方便
- http://github.com/easymotion/vim-easymotion
- 使用递归映射
namp ss <Plug>(esaymotion-s2)
,按下ss
就可以使用了
vim-surround 成对编辑
如果快速更换一对单引号为双引号
- 一个一个查找然后替换,比较低效
- https://github.com/tpope/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里
- http://github.com/junegunn/fzf.vim
- 使用
:Ag [PATTERN]
模糊搜索字符串 - 使用
:Files [PATH]
模糊搜索目录
搜索替换插件far.vim
如果想批量搜索替换,可以试试far.vim
- http://github.com/brooth/far.vim
- 使用
:Far foo bar **/*.py
golang之vim-go插件
IED一代又一代,经典的编辑器却长久不衰
- 除了Java,很多人用vim编写shell / php / python / gplang
- 前端很多人使用vscode,sublime / Atom 有没落之势
- 很多后端和运维工程师使用vim
vim-go插件
功能强大的golang插件
- http://github.com/fatih/vim-go
- 代码补全,重构,跳转,自动个格式化,自动导入功能
- 基本满足golang日常开发
python-mode 把vim打造成轻量级IDE
python-mode
python插件使用比较多的是 jedi-vim
和python-mode
- http://github.com/python-mode/python-mode
- python-mode同样具备基本的补全、跳转、重构、格式化
vim tagbar插件 浏览代码
tagbar 就是代码大纲
- http://github.com/majutsushi/tagbar
- 需要安装Universal Ctags 生成对应的tag文件
- 快速浏览当前文件代码结构,并且搜索跳转到对应的代码块
vim-interestingwords
可以高亮你感兴趣的单词
- http://github.com/lfv89/vim-interestingwords
- 浏览代码的时候经常需要知道一个变量的使用方式
- 我们可以使用这个插件同时高亮多个单词
强大的vim代码补全插件
deoplete.nvim
一个强大的 neovim / vim8 异步补全插件
- http://github.com/shougo/deoplete.nvim
- 多编程语言的支持,支持模糊匹配
- 需要安装对饮编程语言的扩展
coc.vim
一个强大的 neovim / vim8 补全插件,支持LSP(Language Server Protocol)
vim代码格式化与静态检查
- 把精力集中在代码逻辑本身,而不是整理格式这些浪费精力的事情
- 静态检查是为了让编写的代码更规范。
golint/pylint/eslint
等
格式化插件
Neoformat和vim-autoformat是两种使用较多的格式化插件
- http://github.com/sbdchd/neoformat
- 需要安装对应语言的格式化库,python authorpep8 / js的prettier
静态检查
neomake和ale是两种常用的lint插件
- http://github.com/w0rp/ale
- 同样需要安装对应语言的lint库,比如
eslint/pylint/golint
等 - vim8、neovim支持异步检查,不会影响vim编辑,推荐使用
vim快速注释代码
vim-commentary
- https://github.com/tpope/vim-commentary
- 记住常用的命令gc注释和取消注释
- 插件会根据不同的文件类型使用不同注释
vim与git
fugitive
在vim里使用git
vim-gitgutter
在vim里显示文件变动
- https://github.com/airblade/vim-gitgutter
- 当我们修改文件之后可以显示当前文件的变动
gv.vim
- http://github.com/junegunn/gv.vim
- 使用
:GV
命令调用 - 可以浏览代码提交变更
Vim和Tmux
tmux是一个强大的终端复用工具
- 可以复用终端、分屏、托管进程等
- 在服务器上即使退出服务器也不会被kill,托管进程也很方便
- 可以方便地分割屏幕实现多个进程共用屏幕
让vim嵌入开发工具
几乎所有流行的编辑器和IDE都支持vim插件
- 即使你不用vim作为主力编辑器,依然可以使用它的编辑方式
- 几乎所有流行的编辑器和IDE都支持vim插件,以vim方式编辑
- 比如vscode / atom / pycharm等都支持安装vim插件
neovim
一个新的vim版本,支持异步特性
- https://neovim.io/
- 开发更活跃,更丰富的特性和扩展,异步支持
- neovim的设计可以嵌入到很多GUI里,外壳好看
使用开源配置
可以从网上直接使用一些开源配置