终极 vim 配置: space-vim

2016-12-03 18:32:12 +08:00
 simple26

Quick Install

初衷

spacemacs 可能已经成为 emacs 社区中 “唯我独尊”的配置,在 github 上有近万的 star , contributor 众多。它的 “社区驱动” (community-driven) 真的是很 “耐力持久”,贡献的人很多, UI 很漂亮,功能也很强大。作为 emacs 长久以来的对家 vim, 如果也能有一个这样一个社区驱动的配置,相信也会给大家带来很多便利。

正如 spacemacs 所称,“ The best editor is neither Emacs nor Vim, it's Emacs and Vim!”, 最好的编辑器既不是 Emacs 也不是 Vim, 而是 Emacs 和 Vim! 所以不管是从实用角度,还是从设计概念,操作哲学的角度,这两个都是非常值得学习的。此外,“编辑器”始终是编辑器,取代不了 IDE ,因为吸引我们的更多是深入其中的过程。

就我自身的使用而言, GUI 环境下我会选择 spacemacs, 但是终端环境下 vim 依然是我的首选。我希望尽量保持这两个环境下操作的一致性。此外, vim 社区中,虽有 spf13-vim, k-vim 等一些比较有名的 vim 配置,但始终整合的不够,散落着很多适用特定环境的很好的配置,比如针对 c-c++, python, ruby 等等不同语言环境。还有大多也不够漂亮(当然了,这个有点主观,但不管怎么说,年轻人就是要挑“好看”的-_-)。

随着 vim8 的升级,会有很多新的更好的插件诞生,比如我用来替代 syntasticale, ale 使用了异步特性,再也不用因为语法检查而拖慢速度了。还有asyncrun.vim 等等,都会成为我们新的选择。 spf13-vim 等的更新似乎不太跟得上步伐,希望集体智慧能够给我们带来一个更好用的 vim 配置。

愿景

集百家之长,惠千家万家。

概览

名词解释

space-vim 既然是从 spacemacs 启发而来,自然借鉴了非常多的东西,其中最重要的一个概念便是 “ Layer ”.

Layer

space-vim 目前实现了 Layer 的概念, 就像这样:


    call LayersBegin()
    
    Layer 'fzf'
    Layer 'emoji'
    Layer 'colors'
    Layer 'python'
    Layer 'markdown'
    Layer 'syntax-checking'
    
    call LayersEnd()

在 space-vim 中,所谓的一个 Layer ,其实很简单,就是集成了一些相关的 vim 插件及其配置,涉及到两个文件: config.vim 与 packages.vim. 不难理解, config.vim 为该 Layer 的相关配置信息, packages.vim 则为该 Layer 所需的一些 vim 插件。

比如 Layer better-defaults, packages.vim 中的插件有:


    Plug 'liuchengxu/vim-better-default'
    Plug 'SirVer/ultisnips'
    Plug 'honza/vim-snippets'
    Plug 'Raimondi/delimitMate'
    Plug 'tpope/vim-surround'
    Plug 'easymotion/vim-easymotion'
    Plug 'mhinz/vim-startify'
    Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
    Plug 'Xuyuanp/nerdtree-git-plugin', { 'on': 'NERDTreeToggle' }
    Plug 'tiagofumo/vim-nerdtree-syntax-highlight', { 'on': 'NERDTreeToggle' }
    Plug 'bronson/vim-trailing-whitespace', { 'on': 'FixWhitespace' }

调整,增加 Layer 都非常方便, 这也为 “集百家之长” 提供了土壤。

.spacevim

这个对应的是 .spacemacs, 用户可以自己决定启用哪些 Layer, 可以加载 space-vim 中没有的插件. 首次安装 space-vim 时,.spacevim 会在当前用户目录默认生成,其中主要有两个函数:


    " Put layers you want to enable as well as extra private plugins
    function! UserInit()
    
        " Space has been set as the default leader key,
        " if you want to change it, uncomment and set it here.
        " let g:spacevim_leader = "<\Space>"
        " let g:spacevim_localleader = ','
    
        " Put the layers you want to enable
        Layer 'fzf'
    
        " Put private plugins
        Plug 'junegunn/vim-github-dashboard'
    
    endfunction
    
    " Customize configuration
    function! UserConfig()
    
        color space-vim-dark
    
    endfunction

LayerStatus 可以查看启用了哪些 Layer.

如何使用

个人配置文件为 .spacevim, 如果没有 .spacevim, 那么 space-vim 仅会加载默认的 Layer. .space-vim 中定义了两个函数分别用于加载 Layer 与个人配置信息。


    function! UserInit()
    
        Layer 'fzf'
        Layer 'ycmd'
        Layer 'syntax-checking'
    
        Layer 'emoji'
        Layer 'goyo'
    
        Layer 'html'
        Layer 'python'
        Layer 'markdown'
        Layer 'c-c++'
    
        " 加载 space-vim Layer 中没有的插件
        Plug 'tpope/vim-fugitive'
        Plug 'junegunn/vim-github-dashboard'
        
    endfunction
        
    function! UserConfig()
        
        color gruvbox
        
    endfunction

此外, private 可以看做是一个 Layer ,如果个人配置比较多,可以放在这里, private 目录可以有 Layer 的两个 "标准" 文件, space-vim 也会进行加载:

如何贡献

展望

一个人的精力始终是有限的,非常欢迎大家分享自己的使用经验。三个臭皮匠还赛过诸葛亮呢,还不行? 那就四个:p 。

当然啦,可能很多人觉得 vimscript 没有 lisp 那么有表现力,稍显蹩脚。 Anyway, 都是工具,乐趣而已。如果能够集思广益,也是利己利人。

初期阶段,可做的事情还很多,欢迎大家分享与贡献. :space-vim

致谢


15389 次点击
所在节点    Vim
104 条回复
neo1218
2016-12-03 18:48:50 +08:00
赞一个!
neo1218
2016-12-03 18:54:33 +08:00
layer 能按需加载吗?比如有一个 Layer python, Layer js , 启动时能不能指定只加载某个 layer, 这样既可以方便写 Python ,又可以方便写 js, 且避免加载过多插件.
simple26
2016-12-03 19:12:02 +08:00
@neo1218 额,目前的话,实际在 .spacevim 中启用的 Layer 都会 “ Source ” 相关的配置文件, 但是涉及到的插件真正什么时候加载还取决于 vim-plug 的 lazy-loading ,目前还不是很清晰,我只是尽量将能够 lazy-loading 的插件都设置 lazy-loading....

此外关于 lazy-laoding, 我之前遇到过一个问题,然后 github 上有人稍微解释了一下, https://github.com/vim-airline/vim-airline/issues/1313 , 按照他的说法其实 lazy-loading 并不十分必要,可能会有影响的插件大都会自己解决(使用 autoload).

在 space-vim 中,区分 Layer ,除了使用不同的插件,我觉得主要是根据文件类型绑定一些快捷键,比如最简单的 <F5> 可以针对 python, c, cpp 等直接编译运行, python 的话 使用 <LocalLeader>= 调用 yapf 对代码进行格式化。

当然了,有更好的方案,肯定还会不断改进~~~ ,欢迎分享贡献哈
wgjak47
2016-12-03 19:24:24 +08:00
有支持 neovim 吗?
simple26
2016-12-03 19:34:34 +08:00
@wgjak47 目前还没有时间兼容 neovim.

不过虽然没有测试过,但是直接对应过去,修改一些文件位置,应该也是可以用的,我本地也有 neovim , 使用的是 space-vim 之前的旧版本 (在调整 space-vim 崩溃时使用....),理论上是可以的。
Numbcoder
2016-12-03 20:02:49 +08:00
spacemacs 的快捷键太不方便了,一个命令要敲好几个键,效率太低
simple26
2016-12-03 20:11:52 +08:00
@Numbcoder 而且 vim 没有 helm....., 所以快捷键一般控制在两个,不会有很长的快捷键,比如保存文件 <Leader>fs --> file save, 两个应该能够接受...., 关键是觉得它的 Mnemonics 这个概念非常好。其它要敲比较多键的, vim 中希望能够通过类似 unite.vim 这样的方式解决。
wsdjeg
2016-12-03 20:14:18 +08:00
@simple26 何不看看我的 Dotfiles 呢
https://github.com/wsdjeg/Dotfiles

都说 vim 是编辑器之神, emacs 是神的编辑器,这句话我理解是, vim 本身就是神,而 emacs 是神才可以用的,太晦涩难用。
vim 之所以为神,是在于配置的多样化,如果你希望像 emacs 那样一个配置一统天下,那么 vim 不再是神了。
simple26
2016-12-03 20:42:23 +08:00
@wsdjeg 或许应该应该加些限定语,比如 “开箱即用” ? 自己调教当然是上上选择了。

看过您的配置,但是如果我只想要学习其中的某一部分,恐怕还是没那么直观。最初我希望 space-vim 能做的事情就是集百家之长,最好像吸星大法那样拿过来,完了最好还有完善的文档教你怎么用,用于什么样的场景。当你发现了新大陆还能及时分享,简直是进入 “共产主义” 社会 :p 。

神不神,其实无关精要。我都墙头草了(emacs 与 vim 都涉及),谁还在乎这个.....
wikinee
2016-12-03 21:16:46 +08:00
Sublime 发来贺电
gfexfizv
2016-12-03 21:27:50 +08:00
比上次某人的 space-vim 有诚意
simple26
2016-12-03 21:33:32 +08:00
@gfexfizv 没错,就是那个人,过分,要批评。(要批评才能进步啊😀)
zhangmms
2016-12-03 21:59:46 +08:00
赞一个
fuxpro
2016-12-03 22:01:28 +08:00
我从 99 年开始用 Slackware, 当进用 nano 作为编辑器,因为那个时候不会用 vi, 就这样一用就用来现在,现在 vim 也会用,但是不习惯像别人那样整很多的插件,作成一个 IDE 的样子,我就是用 Nano 编文本的代码,也没有什么特别漂亮的地方,就是习惯吧。有时候看到有人作很多的工作,我都觉得很佩服,觉得他们好有心。。。而我就是这样用 nano 走过来了,一定错过了不少风景吧。。。

nano ,一路相伴
simple26
2016-12-03 22:05:29 +08:00
@fuxpro 说明你没有我这么肤浅,我就是喜欢漂亮的哈哈哈😀
fuxpro
2016-12-03 22:43:16 +08:00
@simple26 不能随便说任何人肤浅,其实是一种选择吧。很多事情都是随着缘分去发展的。就像我最开始接触 Slackware ,之后就一直用它,到现在自己定制构建它的脚本,这样就完全有一个属于自己的环境,用了 10 几年了,不过也少了很多的精彩啊,现在 Ubuntu , Archlinux 之类的都被别人用的漂亮,我由于是习惯了,看了看也终久是提不起兴趣,有时间多是看看历史,人文类的书
zhidian
2016-12-03 22:55:42 +08:00
我就是不愿意再配置来配置去才入坑 vim 的。所以,嗯,我的 vimrc 只有 expandtab, tw=4 这几个简单的 😌
simple26
2016-12-04 07:04:53 +08:00
@zhidian 坦然接受也是态度 👍
ashfinal
2016-12-04 09:05:07 +08:00
楼主 截图中的颜色主题是啥?感觉挺像 space-emacs 的,能否分享下?
simple26
2016-12-04 09:14:07 +08:00
@ashfinal 哈哈 ,我自己改的, https://github.com/liuchengxu/space-vim-dark ,只是适用于 terminal, GUI 我用的不多,目前还没有怎么调整~~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/325062

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX