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>, 这类都是成对出现的,

当我们输入一半, 自动补全另一半字符. 这里用到的插件是 delimitMateclosetag.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-vjk上下选中多行, <或者>可以进行整体缩进, 但是遇到个问题, 有时候需要多次缩进, 而默认, 缩进一次后, 选中消失, 要操作, 得再次选中…..(>_<#)

增加如下配置, 缩进完自动选中, 可以再次缩进

" 调整缩进后自动选中,方便再次操作
vnoremap < <gv
vnoremap > >gv

快速替换/删除最近插入的内容

当我们插入一段内容, 然后切换到普通模式后, 相对插入的内容进行快速选中, 然后删除或者替换, 可以

" 选中并高亮最后一次插入的内容
nnoremap gv `[v`]

python开发

两个插件推荐

" 改变编辑时缩进行为, 更友好的缩进
Plug 'hynek/vim-python-pep8-indent'

" import 排序, 强迫症福音
Plug 'fisadev/vim-isort'

预告: 下一篇, 将快速导航, 如何在项目维度导航跳转


vim,linux

2503 Words

2017-03-25 00:00 +0000