终极 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

致谢


16746 次点击
所在节点    Vim
104 条回复
simple26
2016-12-19 22:08:35 +08:00
@macrosea 好像是我孤陋寡闻了.... :h Ag 真的有内容.... , 这是 vim 自己提供的?
simple26
2016-12-19 22:14:15 +08:00
@macrosea 这个功能还真没用过,期待. ps: 你的配置里有些基本内容其实是不必的, https://github.com/liuchengxu/vim-better-default/blob/master/plugin/default.vim 已经设置了~
macrosea
2016-12-19 22:21:28 +08:00
@simple26 我知道的,有些是定义为自己习惯的快捷键。 h: Ag 是正确的,有安装 ag.vim
simple26
2016-12-19 22:25:05 +08:00
@macrosea 爬坑结束后,欢迎到 wiki 分享,想学习一下, 这个东西今天真是第一次见 :p
macrosea
2016-12-19 22:51:43 +08:00
@simple26 Ag.vim 作者已经停止维护了, 换 ack.vim + ag, 非常完美。 建议增加 vim-rooter 插件, javascript 增加 tern-for-vim; 私聊 QQ: 1662253118 :-)
simple26
2016-12-20 07:37:22 +08:00
@macrosea 😅 QQ 基本处于弃用的状态, 有兴趣的话可以发邮件或是在 issue ,也都很方便~
KentY
2016-12-21 18:26:22 +08:00
网上的确很多这种"vim-distribution". 很多新用户, 初学者也会选择一个, 两个比较下, 觉得很多功能都可以 works out of box, 很好很方便 .但是我个人不觉得这是好方法 ,也不是个省事的方法.

简单说几个:

- 如果你仅仅用很基本的 vim 操作, 你不需要那么多插件,配置
- 如果用的很多, 势必要自己配置自己习惯的, 别人弄的, 不一定适合自己, 不管是插件还是什么, 很多还可以在原有插件基础上做自己的修改
- 这种大集成, 一旦有点小问题, 找原因, 解决问题的 effort 往往大很多, 因为你要把整个人家的项目弄明白.

我 10 来年前也是这样, 网上找个特长的 vim 配置, 弄过来用, 自己也不看, 说实话, 那时候也看不太懂. 但是往往总有惊奇 /喜. "咦, 原来我按这些组合键, 会有这个效果. 真好!" "啊! 为什么我按这个会这样!!" ... 后来开始慢慢去读去理解抄来的配置, 发现很多和自己个人意愿不符合. 索性自己从头写, 只写自己需要的, 有新需要往里加, 定期整理. 到今天也将近 1k 行的配置. 这个过程看起来会投入经历, 但是学了东西, 而且有了问题知道去哪找. 我觉得这种大集成, 可以试试, 真要作为每天工作的家伙, 还得自己弄明白是怎么回事..

在 SO 上的很多 vim 大牛也持此观点.
simple26
2016-12-21 19:01:31 +08:00
@KentY 岂止是 vim, 道理都是一样的。开始时大都会选择一些不错的开箱即用的工具。有一定了解以后,很多人便开始想要跃跃欲试自己造一个“轮子”,这无可厚非。

所谓 distribution 只是多了一些选择而已,如果不感兴趣,瞥一眼不 care 就好。像 spacemacs, 我想有非常多的人受益其中,这必然是功德一件。对于一个有判断力的人自然会懂得如何合理地对待这些 “ distribution ”。

学习从模仿开始,从模仿最好的开始。 distribution 除了提供一些 out-of-box 的选择,也提供了供他人择优摘选的资源。至少我个人来讲,学习了很多的 distribution 中的内容。
KentY
2016-12-21 19:40:52 +08:00
@simple26 只是对各种 vim distribution 的一个个人观点讨论. 没有针对你或者针对你的 git 项目的意思. 只是看到这里类似的帖子层出不穷才说了几句.
simple26
2016-12-21 19:52:42 +08:00
@KentY 抛开 vim 的范畴,从更大的范围来讲,各种 “ distribution ” 从来是层出不穷。 显然这种观点的抛出营养不大,道理过于浅显。
KentY
2016-12-21 20:07:07 +08:00
@simple26 怎么还较真了呢 . 我前面写的 vim-distribution 加了引号,因为这不是正式意义的 distribution, 比如 linux distributions. vim 的这些只是一些配置文件, 集成了别人的插件, 然后用了自己的一种方式来 source 各种配置.

当然, 你通过做这些工作, 的确会学到东西, 别人如果仔细研究你的成果也会学到, 但是可能你自己也清楚, 你的 用户大都是所谓的想"开箱就用"的. 但是从长期使用角度来说, 盲目拿来而不了解就使用, 是不明智的. 除非这个东西(vim)对他不重要.

再重复一次, 我没瞧不起你所做的工作. 有种说法是存在即合理. 这些 vim 的集成配置在 github 上能有那么多人 star, 也说明了人们的需求.
simple26
2016-12-21 20:20:23 +08:00
@KentY 不讨论了,大家的关注点不同,对于事物的理解与感知也不同。
ryanking8215
2016-12-23 22:13:01 +08:00
@simple26 请教一下, space-vim 里的“下划线显示当前单词”是哪个插件实现的额?
simple26
2016-12-24 03:12:21 +08:00
@ryanking8215 vim-cursorword
simple26
2016-12-24 03:16:41 +08:00
@ryanking8215 itchyny/vim-cursorword
macrosea
2016-12-24 16:46:55 +08:00
@KentY @simple26 我很赞同楼主的无私奉献, space-vim 是很有意义的, 1. space-vim 使 Layer 去组织各种 plugin, 条理清晰; 2. 楼主很多快捷键 设计的很合理; 3. 楼主引入了很多优秀的 plugin. 所有这些都有利于其他人学习和使用 VIM 。 KentY 的是从另一个角度建议 VIMer 不要简单的去做拿来主义者, VIM 这东西必需自己亲自动手去配置才能熟悉 VIM 的使用,别人的配置再好,如果不自己亲力亲为是很难适应别人的配置风格的
ossphil
2017-01-13 15:44:21 +08:00
比较奇怪的问题:有时打开 vim 的时候 leader 键并不是 space ,比如按 space+?会进入命令模式;还有,我启用了 programming layer ,安装了 nerdcommenter 插件,但很多时候其中的快捷键并不起作用,这时候如果 space+?可用就会发现没有 nerdcommenter 的快捷键设置。偶尔的时候可以正常注释
simple26
2017-01-13 16:04:03 +08:00
@ossphil 这样的话,我建议通过来 vim 自己提供的 `map`, `nmap` 的来看一下到底是否存在这样的快捷键映射。

>有时打开 vim 的时候 leader 键并不是 space ,比如按 space+?会进入命令模式
额,这个我没有遇到过。下次如果你遇到的话,`:echo g:mapleader`, `:echo g:maplocalleader` 或者 `:verbose g:mapleader`, `:echo g:maplocalleader` 看看 leader 到底是什么。

nerdcommenter 这个插件是延迟加载的,在你使用 `SPC ;;` 才会加载,所以即使你进入 vim, 如果你不按 `SPC ;;`, 差个插件是不会加载的。 可以通过 `:PlugStatus` 查看当前插件的加载情况,是否载入。

nmap <Leader>;; <Plug>NERDCommenterToggle
omap <Leader>;; <Plug>NERDCommenterToggle
vmap <Leader>;; <Plug>NERDCommenterToggle

MP 'scrooloose/nerdcommenter', { 'on': '<Plug>NERDCommenterToggle' }

SPC ;; 空格加两个分号,这几个键操作不要停顿太久,否则 vim 将不会识别出 `SPC ;;`.

建议有问题还是到 github ,你看我在这里回应都不太方便....
ossphil
2017-01-13 16:12:48 +08:00
@simple26 ok, 多谢
macrosea
2017-01-19 16:00:21 +08:00
能支持 Java 么 ?

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

https://ex.noerr.eu.org/t/325062

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

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

© 2021 V2EX