当前位置: 首页 > news >正文

Vim 折腾记

原文地址:http://www.ahonn.me/2017/02/1...

昨天在微信读书上面看到了池建强的《MacTalk 人生元编程》,然后花了差不多一天看完,其中有篇有关于 Vim 的文章提起了我对这个编辑器的再一次兴趣(对的,我对它感兴趣很多次了,每次都懒..)。

一直懒得去慢慢配置它,又不想用别人的配置。自己用的编辑器还是想自己折腾,然后今天就趁着我对这个还有点热度赶紧折腾起来。

MacVim

其实在命令行里面直接写代码还有有些不习惯的,所以选了 MacVim 这个 GUI 版本。这样又可以与其他编辑器一样单独打开,想小改代码的时候又可以直接打开命令行搞。

在 MacTalk 的文章里面有提到 Vim 中文版本的帮助文档,遂下载之。果然还是中文的比较浅显易懂。

以前看别人的 .vimrc 配置,里面有些编辑器的基本配置,也不知道是哪里查的。原来这些配置可以在编辑器中输入 :help options 进行查看。

缩进

关于缩进的配置,主要设置了 autoindent, smartindentexpandtab 这三个选项。

  • autoindent 选项根据上一行决定新行的缩进

  • smartindent 选项智能自动缩进

  • expandtab 选项将 tab 转换为空格

set autoindent
set smartindent
set expandtab

行号

显示行号是硬需求,但是与其他编辑器不同,在 vim 上还有相对行号。

set number
set relativenumber

插件

显而易见,手动安装 vim 插件是很麻烦很麻烦的。与 sublime text 之类的类似,vim 同样有类似的插件管理器 Vundle。

创建文件夹 ~/.vim 和配置文件 ~/.vimrc,并安装 Vundle:

$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

为了方便管理再新建一个 .vimrc.bundles 来单独存放插件列表:

set nocompatible    " be iMproved, required
filetype off        " requried
set rtp+=~/.vim/bundle/vundle/

call vundle#begin()

" Let Vundle manage Vundle
Bundle 'gmarik/vundle'

" .... 其他插件

call vundle#end()
" required
filetype plugin indent on

以后添加插件的时候只需要在这个文件里面添加一行:

Bundle 'xxx'

安装插件输入 :BundleInstall 命令即可,卸载插件时删除对应的配置并运行 :BundleClean 删除插件。

括号补全

第一次用的时候,输入 ( 居然没有自己蹦出来另外一个 )。这不科学,讲道理这个是一定要的。

发现很多人用的是 delimitMate ,添加 Bundle 'delimitMate'.vimrc.bundles,运行 BundleInstall

安装完直接就可以自动补全括号了。

Emmet

很多浏览器都支持 Emmet 插件,vim 同样也有。但这个 Emmet 是第三方的,叫 Emmet.vim。

安装完之后主要是设置一下出发的快捷键,默认的快捷键是 Ctrl + y
我把快捷键修改成 Ctrl + e 比较顺手。

" Emmet.vim
let g:user_emmet_expandabbr_key = '<c-e>'

目录树

目录树就基本上也就是使用 NERDTree。

开启目录树的快捷键修改为 Ctrl + b,然后当 vim 只剩目录树显示的时候自动退出。

" NERDTree 
map <c-b> :NERDTreeToggle<CR>
autocmd vimenter * NERDTree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") &&b:NERDTreeType == "primary") | q | endif

补全

补全用的就是大名鼎鼎的 YouCompleteMe 了。

关于这个插件网上有很多插件,我就不啰嗦了。这里主要是抄的百度 EFE 的配置:

" YouCompleteMe
" http://efe.baidu.com/blog/vim-javascript-completion/#youcompleteme
let g:ycm_min_num_of_chars_for_completion = 3 
let g:ycm_autoclose_preview_window_after_completion=1
let g:ycm_complete_in_comments = 1
let g:ycm_key_list_select_completion = ['<c-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<c-p>', '<Up>']
" Use tab
function! TabFunction ()
    let line = getline('.')
    let substr = strpart(line, -1, col('.')+1)
    let substr = matchstr(substr, "[^ \t]*$")
    if strlen(substr) == 0
        return "\<tab>"
    endif
    return pumvisible() ? "\<c-n>" : "\<c-x>\<c-o>"
endfunction
inoremap <tab> <c-r>=TabFunction()<cr>

let g:ycm_semantic_triggers = {
    \   'css': [ 're!^\s{2}', 're!:\s+'],
    \   'html': [ '</' ],
    \ }

总结

折腾了一下午,终于算是搞定了。其实过程还是蛮好玩的,有机会还想写写插件玩玩。

之后就抛弃 VS Code,开始 Vim 之旅感受一下双手不离键盘,效率爆棚的感觉。

相关文章:

  • $.ajax()
  • 用Zookeeper实现分布式锁和选主
  • 最近5年183个Java面试问题列表及答案[最全]
  • cloudbase-init 自动扩盘的副作用 - 每天5分钟玩转 OpenStack(154)
  • Android笔记--TCP Scoket(字符串收发)
  • HTML5 自定义属性 dataset
  • 一步一步学Python(2) 连接多台主机执行脚本
  • MySQL添加用户、删除用户与授权
  • C#中HttpWebRequest的用法详解
  • Curl命令使用解析大全
  • 【AUC】二分类模型的评价指标ROC Curve
  • 真是个信息爆炸的世界
  • Nginx 和 Apache 日志记录格式设置
  • sublime的使用技巧
  • 让技术不要成为“背锅侠”!
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【剑指offer】让抽象问题具体化
  • android 一些 utils
  • C++类中的特殊成员函数
  • conda常用的命令
  • crontab执行失败的多种原因
  • Git 使用集
  • gitlab-ci配置详解(一)
  • golang 发送GET和POST示例
  • oschina
  • React Native移动开发实战-3-实现页面间的数据传递
  • Vue2 SSR 的优化之旅
  • 初识MongoDB分片
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 聚类分析——Kmeans
  • 前端攻城师
  • 问题之ssh中Host key verification failed的解决
  • 一个项目push到多个远程Git仓库
  • AI算硅基生命吗,为什么?
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1)bark-ml
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (循环依赖问题)学习spring的第九天
  • .CSS-hover 的解释
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net 生成二级域名
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net打印*三角形
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET与 java通用的3DES加密解密方法
  • ??javascript里的变量问题
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @property括号内属性讲解
  • @SuppressWarnings注解
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ solr入门 ] - 利用solrJ进行检索
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现