惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
C
Cybersecurity and Infrastructure Security Agency CISA
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
T
Threat Research - Cisco Blogs
C
Cisco Blogs
Recent Announcements
Recent Announcements
S
Securelist
N
Netflix TechBlog - Medium
The Register - Security
The Register - Security
P
Privacy & Cybersecurity Law Blog
宝玉的分享
宝玉的分享
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LINUX DO - 热门话题
T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
月光博客
月光博客
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
博客园 - 司徒正美
L
LINUX DO - 最新话题
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
H
Help Net Security
Spread Privacy
Spread Privacy
PCI Perspectives
PCI Perspectives
Project Zero
Project Zero
I
Intezer
T
The Blog of Author Tim Ferriss
有赞技术团队
有赞技术团队
The Last Watchdog
The Last Watchdog
C
Check Point Blog
Blog — PlanetScale
Blog — PlanetScale
B
Blog RSS Feed
MyScale Blog
MyScale Blog
V
Vulnerabilities – Threatpost
Recorded Future
Recorded Future
T
Tenable Blog
Jina AI
Jina AI
D
DataBreaches.Net
阮一峰的网络日志
阮一峰的网络日志

Posts on WKLKEN THINKING

apisix 中的 lrucache apisix 中的服务发现机制 apisix 中的负载均衡 apisix etcd机制 聊聊框架 关于 k8s 的 zero downtime deployment 一些建议 apisix 遇到的一些问题 关于在除夕前一天换了一个洗衣机的故事 Django DRF 性能优化 DRF 的一些实践 Part1: Serializer DRF继承关系图 Better Code: 关于接口的灵活性 新的仓库: wklken/naming 缓存使用的一些经验 Better Code: 抽象: 可扩展性与可维护性的抉择 Better Code: 异常时, 该提示用户哪些信息? Better Code: 更好的异常日志打印 Go: some libs Go: go-redis/cache升级的坑 Go: logrus性能提升 Go: gin validation 远程办公的一点总结 Go: 开发过程中的一些bug 项目管理实践: 风险驱动开发 Go: 一种error wrap调用链处理方式 漫谈技术选型 Go: 基于 apitest 做handler层单元测试 Go: go-sql-driver interpolateparams参数优化 [分享]深度工作 你需要更多的思考时间 Django项目重构小结 工作七年小结: 学习,生活及其他 [分享]bash日常: bash-utils 极客时间推广海报 2017总结: 予时光以意义 k8s APIServer源码: api注册详细细节 k8s APIServer源码: api注册主体流程 k8s APIServer源码: 服务启动 k8s APIServer源码: go-restful框架 重构 - 读书笔记(Python示例) 写给新人的沟通建议 vim 杂谈 - 关于移动 读书笔记-重构: 章11 处理概括关系 读书笔记-重构: 章10 简化函数调用 读书笔记-重构: 章9 简化表达式 读书笔记-重构: 章8 重新组织数据 读书笔记-重构: 章7 在对象之间搬移特性 读书笔记-重构: 章6 重新组织函数 Python 代码规范小结 [分享]关于vim ElasticSearch集群部署文档 Logstash+ElasticSearch处理mysql慢查询日志 [分享]关于代码调试DE那些事 Logstash+ElasticSearch+Kibana- 实现相对通用的数据收集分析 ELK维护的一些点(二) [分享]Python源码剖析-数据结构 一些Centos Python生产环境的部署命令 摘录<<6个月学会任何一种外语>> ELK 维护的一些点 也许是一个新的开始 一些vim的个性化配置 读书笔记-调试九法 这段时间的一些想法 Python 源码阅读 - 垃圾回收机制 我为什么要写博客 APUE笔记-第一章 UNIX基础知识 Python源码阅读-闭包的实现 Python源码阅读-内存管理机制(二) Python源码阅读-内存管理机制(一) Python-基础-数据结构小结 '活动'设计的一些trick 一些简单的Python测试题 我的tmux配置及说明【k-tmux】 Review and Restart 工作四周年小结 vim插件: surround & repeat[成对符号编辑] vim插件: gundo[时光机] vim插件: expand-region[区域选中] vim插件: quickrun[快速执行] vim插件: trailing-whitespace[行尾空格处理] vim插件: closetag[成对标签补全] vim插件: ctrlp[文件搜索] vim插件: airline[状态栏增强] vim插件: theme[主题] vim插件: tagbar[大纲式导航] vim插件: nerdcommenter[快速注释] vim插件: rainbow_parentheses[括号高亮] vim插件: syntastic[语法检查] vim插件: delimitmate[符号自动补全] vim插件: matchit[成对标签跳转] vim插件: easy-align[快速对齐] vim插件: multiple-cursors[多光标操作] vim插件: vim-signature[快速标记跳转] vim插件: easymotion[快速跳转] vim插件: vundle[管理插件] Elasticsearch几个问题的解决 分享一份 Vim 简介PPT k-vim 更新9.0版本 关于知识管理工具的思考 Logstash+ElasticSearch+Kibana处理nginx访问日志
vim 杂谈 - 关于快速编辑
2017-03-25 · via Posts on WKLKEN THINKING

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'

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