vim 杂谈 - 关于快速编辑
在vim
中写代码, 并不是, 我们所见到的代码都要一个个字符输进去, 一定不是这样的.
这篇, 让我们来谈谈如何进行快速编辑.
当然, 一篇文章只能概述, 给大家一些参考, 具体每项都可以自行找相关资料. 很多外链, 莫跳丢了
注意, 其中会涉及到比较多的插件, 而 k-vim 用的是 vim-plug, 如果你用得是其他的插件管理工具, 自行转换.
textobject
文本对象, 是进行快速编辑的基础秘诀. 将一个单词, 句子, 段落当成一个对象看待, 可以进行快速选中/替换/删除等操作
有一篇文章解释得很清楚 Vim Text Objects: The Definitive Guide
简单说明
命令格式: 操作+范围+对象
对象
w - word单词
s - sentence句子
p - paragraph段落
' " ) ] } > 等成对的
t - Tag标签
范围
i - 在里面
a - 所有, 包括成对的引号等
操作
d - 删除
v - 选中
c - 替换
例子, |
代表光标位置
123(a|bc)456
di) 删除引号内的内容 => 123()456
da) 删除引号内容, 包括引号 => 123456
vi) 选中引号内内容 abc
....
textobject增强
vim自带了很多文本对象, 但是还可以进一步增强, 例如, 以行l
(line
)/以文件e
(entire file
)/以缩进i
(indent
)
在 k-vim 中, 加了如下的几个文本对象, 这样, 在写python
代码时, 你可以很方便的批量选中同一个缩进里面的所有代码块, 即使代码之间有空行.
" text object
" 支持自定义文本对象
Plug 'kana/vim-textobj-user'
" 增加行文本对象: l dal yal cil
Plug 'kana/vim-textobj-line'
" 增加文件文本对象: e dae yae cie
Plug 'kana/vim-textobj-entire'
" 增加缩进文本对象: i dai yai cii - 相同缩进属于同一块
Plug 'kana/vim-textobj-indent'
还有很多插件, 提供了更加丰富的文本对象, 例如, 函数中的参数等. 可以根据需要自行加入
代码补全
代码补全, 是必需品, 也是提升效率的大杀器.
对比试用过非常多的补全插件之后, 最终选定了 YouCompleteMe. 快速提示/模糊匹配/跳转到函数定义等等, 总之, 非常流畅, 体验很好.
这个插件唯一缺点是: 太难装
. 没错, 就是太难装, 对vim
版本有要求, 然后在天朝这种网络环境下要拉接近300M
的文件下来不是一件很容易的事情, 下完之后还得编译>_<#
但是, 历经千辛万苦之后, 你会发现这是值得的, 有了 YCM
, 写代码的速度和质量能提升非常非常非常非常多.
Plug 'Valloric/YouCompleteMe'
相关配置: k-vim vimrc.bundles#L368
几个常用快捷键,jd
/,gd
跳转到定义处, ctrl+空格
主动触发补全(默认输入2个字符以上自动补, 可以什么都没输入触发补全), ctrl+j/k
或者ctrl+p/n
进行补全上下选中
如果是golang
, 使用 vim-go
代码片段
代码片段, 是代码补全的互补. 当你预先定义一些常用的片段, 就能输入关键字后, 触发补全整个代码片段
这里推荐的插件是 ultisnips(代码片段补全工具) 配合 vim-snippets(常用代码片段, 包含各类预研)
" Group dependencies, vim-snippets depends on ultisnips
" 代码片段快速插入 (snippets中,是代码片段资源,需要学习)
" Snippets are separated from the engine. Add this if you want them:
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
相关配置: k-vim vimrc.bundles#L410
注意, ultisnips
快捷键和YCM
冲突, 所以配置两个插件时需注意
举个栗子: 输入class
然后 Tab
触发补全, 就能进行类似完形填空的流程, 一路输入, 然后Tab
到下一个框, 几下就能完成一段代码
当然, 可以自己添加补充代码片段.
let g:UltiSnipsSnippetsDir = '~/.vim/UltiSnips'
以python
为例, 除了vim-snippets
中带的那些补全关键字, 我还配置了很多单字符直接补全python
关键字(github python.snippets)
t -> True
f -> False
n -> None
r -> return
p -> print
....
引号括号等及 html 标签不全
另一个必须品, 当我们输入引号('' ""
), 括号(() [] {}
) 以及 html
的标签<a>
, 这类都是成对出现的,
当我们输入一半, 自动补全另一半字符. 这里用到的插件是 delimitMate 和 closetag.vim
" 自动补全单引号,双引号等
Plug 'Raimondi/delimitMate'
" 自动补全html/xml标签
Plug 'docunext/closetag.vim', { 'for': ['html', 'xml'] }
然后, 针对Python做了个优化, 可以快速补全docstring
"""
"""
相关配置: k-vim vimrc.bundles#L442
之前一篇博客: VIM插件: DELIMITMATE(符号自动补全)
多光标编辑
在编辑一段代码时, 例如, 想修改函数体内某个变量名, 除了用替换(查找+替换相对复杂), 还可以用 vim-multiple-cursors, 之前写的一篇博客 VIM插件: MULTIPLE-CURSORS(多光标操作)
" 多光标选中编辑
" multiplecursors
Plug 'terryma/vim-multiple-cursors'
相关配置: k-vim vimrc.bundles#L518
配合 ctrlsf 插件, 搜索后多光标直接编辑保存, 简直是重构神器, 后面细说
快速注释
很多时候要注释多行的代码, 或者解开注释. 你需要 nerdcommenter
你只需要 选中
(shift+v+j/k
) 然后 ,cc
. 如果仅注释当前行的话, 可以省了选中
这一步, 直接,cc
解开注释 ,cu
(注意, 这里的,
等于<leader>
键)
" quick edit
" 快速注释
Plug 'scrooloose/nerdcommenter'
演示博客: VIM插件: NERDCOMMENTER(快速注释)
修改环绕字符
场景: 给单词加引号, 给十个单词加引号, 删除某一对引号/括号, 加<h1></h1>
将字符串括起来
用到两个插件 vim-surround(负责环绕字符编辑) 和 vim-repeat(负责重复)
" 快速加入修改环绕字符
" for repeat -> enhance surround.vim, . to repeat command
Plug 'tpope/vim-repeat' | Plug 'tpope/vim-surround'
吐槽下, vim-surround
快捷键特别感人…..
博客说明: VIM插件: SURROUND & REPEAT(成对符号编辑)
对齐
偶尔的需求, 需要根据=
或,
或者空格, 将多行数据对齐, 之前的一篇博客说明 VIM插件: EASY-ALIGN(快速对齐)
" easyalign
" 快速赋值语句对齐
Plug 'junegunn/vim-easy-align'
相关配置: k-vim vimrc.bundles#L466
去行尾空格
轻微强迫症, 忍不了每行代码行尾没用的空格
" trailingwhitespace
" 快速去行尾空格 [, + <Space>]
Plug 'bronson/vim-trailing-whitespace'
配了 ,+空格
, 一键去除当前文件所有的行尾空格
" trailingwhitespace {{{
map <leader><space> :FixWhitespace<cr>
" }}}
后面文章会提及vim中那些被动技能
, 会提到如何配置保存时自动去除行尾空格
缩进
写代码时, 有时候要进行缩进, 选中后, 例如shift-v
加jk
上下选中多行, <
或者>
可以进行整体缩进, 但是遇到个问题, 有时候需要多次缩进, 而默认, 缩进一次后, 选中消失, 要操作, 得再次选中…..(>_<#
)
增加如下配置, 缩进完自动选中, 可以再次缩进
" 调整缩进后自动选中,方便再次操作
vnoremap < <gv
vnoremap > >gv
快速替换/删除最近插入的内容
当我们插入一段内容, 然后切换到普通模式后, 相对插入的内容进行快速选中, 然后删除或者替换, 可以
" 选中并高亮最后一次插入的内容
nnoremap gv `[v`]
python开发
两个插件推荐
" 改变编辑时缩进行为, 更友好的缩进
Plug 'hynek/vim-python-pep8-indent'
" import 排序, 强迫症福音
Plug 'fisadev/vim-isort'
预告: 下一篇, 将快速导航, 如何在项目维度导航跳转