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

致谢


15892 次点击
所在节点    Vim
104 条回复
simple26
2016-12-04 17:18:26 +08:00
@lzhCoooder 明智,没时间折腾先别入~
linyin
2016-12-04 21:56:50 +08:00
总想在 VIM 下做开发,感觉还不错,先留意起来。
simple26
2016-12-04 22:08:06 +08:00
@linyin 欢迎围观~
WendellSun
2016-12-05 08:40:25 +08:00
楼主棒棒哒。
nilai
2016-12-06 09:35:36 +08:00
怎么鼠标右键没用了?
simple26
2016-12-06 10:45:21 +08:00
@nilai 额,因为我 mac 下没有鼠标,所以没有办法测试....。不过,默认应该是启用的: https://github.com/liuchengxu/vim-better-default/blob/master/plugin/default.vim 34 行 set mouse=a, 你有测试过以前的配置下可用吗?
SharkIng
2016-12-06 12:00:12 +08:00
看样子可以换坑了
simple26
2016-12-06 12:51:53 +08:00
@SharkIng 欢迎入坑与填坑~~~
nilai
2016-12-06 13:45:14 +08:00
@simple26 我后来查找了下,的确是这里设置的鼠标 , 不过我这里没修改, 直接按 shift + 右键, 接管原有的 X 。
nouh
2016-12-06 16:44:39 +08:00
@simple26 很棒,最好能再兼容 neovim 就更好了
simple26
2016-12-06 16:58:07 +08:00
@nouh 实际上将 vim 的相关文件对应到 neovim 也是可用的,只是还没有真正整合,欢迎关注(要是能帮助兼容 neovim 就更棒啦)哈~~
simple26
2016-12-09 09:01:46 +08:00
@nouh 安装完成后建立一个软链接就可以了: ln -s ~/.space-vim/init.vim ~/.config/nvim/init.vim
sohunjug
2016-12-12 15:05:34 +08:00
mark 一下
macrosea
2016-12-19 20:50:14 +08:00
很好的 已经 fork 了,但是突然发现 Ag! -Q xyz 不好用了
simple26
2016-12-19 21:13:52 +08:00
@macrosea 额..., 这个具体是什么?我没太用过....
macrosea
2016-12-19 21:44:40 +08:00
@simple26 Ag 搜索的 比 Ack 好。 ps: 多谢楼主,这是用的最好的 VIM 配置
simple26
2016-12-19 21:55:56 +08:00
@macrosea Ag! -Q xyz 具体指的啥还是不太懂,是在 vim 中使用 ag 命令?配置里只有在 ctrlp 里面搜索时优先使用 ag 。 我不常用到搜索,虽然也用 ag~. vim 配置总免不了会出问题的,欢迎共同改进哈~
macrosea
2016-12-19 22:00:49 +08:00
@simple26 在 VIM 中执行, :Ag! -Q "word", 比如搜索函数名,这个是非常有用的,貌似昨天还可以,今天执行命令是出现错误: ag: invalid option --
simple26
2016-12-19 22:03:16 +08:00
@macrosea 哈哈 那估计应该不是 vim 的锅~~~
macrosea
2016-12-19 22:08:30 +08:00
@simple26 我正在 debug , 下面是我自己的配置
==============
function! UserConfig()

:nnoremap <leader>sv :source $MYVIMRC<cr>

" basic {
set wildignore=*.dll,*.o,*.obj,*.bak,*.exe,*.pyc,*.jpg,*.gif,*.png,*.so,*.a
set ignorecase " case insensitive by default
set infercase " case inferred by default
set nowrap " do not wrap line
set shiftround " when at 3 spaces, and I hit > ... go to 4, not 5
set smartcase " if there are caps, go case-sensitive
set shiftwidth=2 " auto-indent amount when using cindent, >>, << and stuff like that
set softtabstop=2 " when hitting tab or backspace, how many spaces should a tab be
set tabstop=2
"set smarttab " ????
set expandtab " no real tabs please!
autocmd filetype Makefile set noexpandtab
set iskeyword+=_,$,@,%,# " none of these are word dividers
set formatoptions+=mM
set nofoldenable
set clipboard+=unnamed
set cpoptions=aABceFsmq
" |||||||||
" ||||||||+-- When joining lines, leave the cursor
" ||||||| between joined lines
" |||||||+-- When a new match is created (showmatch)
" |||||| pause for .5
" ||||||+-- Set buffer options when entering the
" ||||| buffer
" |||||+-- :write command updates current file name
" ||||+-- Automatically add <CR> to the last line
" ||| when using :@r
" |||+-- Searching continues at the end of the match
" || at the cursor position
" ||+-- A backslash has no special meaning in mappings
" |+-- :write updates alternative file name
" +-- :read updates alternative file name
"
set tags=.c.tags,.js.tags
:noremap <silent> <leader><cr> :noh<cr>
set pastetoggle=<F2>
:noremap <leader>cp :let &mouse=(&mouse == 'a' ? '' : 'a')<CR>:set paste!<CR>:set nu!<CR>:set rnu!<CR>

" Remove the Windows ^M - when the encodings gets messed up
noremap <Leader>M mmHmt:%s/<C-V><cr>//ge<cr>'tzt'm

"""""""""""""""""""""""""""""""""""""""""
" Move a line of text using Ctrl+[jk] or Comamnd+[jk] on mac
"""""""""""""""""""""""""""""""""""'''
nmap <C-j> mz:m+<cr>`z
nmap <C-k> mz:m-2<cr>`z
vmap <C-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <C-k> :m'<-2<cr>`>my`<mzgv`yo`z
" }

endfunction

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

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

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

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

© 2021 V2EX