From b0fd3f8c1ca8e7921f0984fd0b70160e40282248 Mon Sep 17 00:00:00 2001 From: Wang Shidong Date: Tue, 1 Sep 2020 17:34:49 +0800 Subject: [PATCH] Add format_on_save options (#3746) --- autoload/SpaceVim/layers/format.vim | 62 +++++++++++++++---- .../SpaceVim/layers/lang/actionscript.vim | 2 +- autoload/SpaceVim/layers/lang/python.vim | 8 +-- autoload/SpaceVim/layers/lang/ruby.vim | 36 ++++++++--- autoload/SpaceVim/layers/lang/rust.vim | 13 ++-- doc/SpaceVim.txt | 32 +++++++--- docs/_posts/2018-09-27-use-vim-as-ide.md | 13 ++-- docs/cn/layers/format.md | 51 +++++++++++++-- docs/layers/format.md | 47 +++++++++++++- 9 files changed, 211 insertions(+), 53 deletions(-) diff --git a/autoload/SpaceVim/layers/format.vim b/autoload/SpaceVim/layers/format.vim index 28b9b5f68..002181832 100644 --- a/autoload/SpaceVim/layers/format.vim +++ b/autoload/SpaceVim/layers/format.vim @@ -9,23 +9,59 @@ "" " @section format, layer-format " @parentsection layers -" SpaceVim uses neoformat as the default code format tools. Neoformat uses a -" variety of formatters for many filetypes. for more info see |neoformat| -" if you want to run a formatter on save, just put this config into bootstrap -" function. -" > -" augroup fmt -" autocmd! -" autocmd BufWritePre * undojoin | Neoformat -" augroup END -" < +" format layer provides code formation for SpaceVim, the default formatting +" plugin is |neoformat|. +" @subsection options +" format_on_save: disabled by default. +" +" + +if exists('s:format_on_save') + finish +else + let s:format_on_save = 0 + let s:format_ft = [] +endif function! SpaceVim#layers#format#plugins() abort - return [ - \ [g:_spacevim_root_dir . 'bundle/neoformat', {'merged' : 0, 'loadconf' : 1 , 'loadconf_before' : 1}], - \ ] + return [ + \ [g:_spacevim_root_dir . 'bundle/neoformat', {'merged' : 0, 'loadconf' : 1 , 'loadconf_before' : 1}], + \ ] endfunction function! SpaceVim#layers#format#config() abort call SpaceVim#mapping#space#def('nnoremap', ['b', 'f'], 'Neoformat', 'format-code', 1) + augroup spacevim_layer_format + autocmd! + autocmd BufWritePre * call s:format() + augroup END +endfunction + +function! SpaceVim#layers#format#set_variable(var) abort + let s:format_on_save = get(a:var, 'format_on_save', s:format_on_save) +endfunction + +function! SpaceVim#layers#format#get_options() abort + + return ['format_on_save'] + +endfunction + +function! SpaceVim#layers#format#add_filetype(ft) abort + if get(a:ft, 'enable', 0) + if index(s:format_ft, a:ft.filetype) ==# -1 + call add(s:format_ft, a:ft.filetype) + endif + else + if index(s:format_ft, a:ft.filetype) !=# -1 + call remove(s:format_ft, a:ft.filetype) + endif + endif +endfunction + +function! s:format() abort + if !empty(&ft) && + \ ( index(s:format_ft, &ft) !=# -1 || s:format_on_save ==# 1) + undojoin | Neoformat + endif endfunction diff --git a/autoload/SpaceVim/layers/lang/actionscript.vim b/autoload/SpaceVim/layers/lang/actionscript.vim index b7cc2b5d5..1d9d7fe0b 100644 --- a/autoload/SpaceVim/layers/lang/actionscript.vim +++ b/autoload/SpaceVim/layers/lang/actionscript.vim @@ -12,7 +12,7 @@ " This layer provides syntax highlighting for actionscript. To enable this " layer: " > -" [layers] +" [[layers]] " name = "lang#actionscript" " < diff --git a/autoload/SpaceVim/layers/lang/python.vim b/autoload/SpaceVim/layers/lang/python.vim index 844b0b577..8ade63180 100644 --- a/autoload/SpaceVim/layers/lang/python.vim +++ b/autoload/SpaceVim/layers/lang/python.vim @@ -138,10 +138,10 @@ function! s:language_specified_mappings() abort " Format on save if s:format_on_save - augroup SpaceVim_layer_lang_python - autocmd! - autocmd BufWritePre *.py undojoin | Neoformat - augroup end + call SpaceVim#layers#format#add_filetype({ + \ 'filetype' : 'python', + \ 'enable' : 1, + \ }) endif endfunction diff --git a/autoload/SpaceVim/layers/lang/ruby.vim b/autoload/SpaceVim/layers/lang/ruby.vim index 1e2cfef31..13e18d072 100644 --- a/autoload/SpaceVim/layers/lang/ruby.vim +++ b/autoload/SpaceVim/layers/lang/ruby.vim @@ -28,6 +28,20 @@ " '' " ] " < +" 2. ruby_repl_command: the REPL command for ruby +" > +" [[layers]] +" name = 'lang#ruby' +" ruby_repl_command = '~/download/bin/ruby_repl' +" < +" 3. format_on_save: enable/disable code formation when save ruby file. This +" options is disabled by default, to enable it: +" > +" [[layers]] +" name = 'lang#ruby' +" ruby_repl_command = '~/download/bin/ruby_repl' +" format_on_save = true +" < " @subsection Key bindings " " > @@ -47,13 +61,26 @@ " < " + +if exists('s:ruby_file_head') + finish +else + let s:ruby_repl_command = '' + let s:ruby_file_head = [ + \ '#!/usr/bin/ruby -w', + \ '# -*- coding : utf-8 -*-', + \ '' + \ ] + let s:format_on_save = 0 + +endif + function! SpaceVim#layers#lang#ruby#plugins() abort return [ \ ['vim-ruby/vim-ruby', { 'on_ft' : 'ruby' }] \ ] endfunction -let s:ruby_repl_command = '' function! SpaceVim#layers#lang#ruby#config() abort call SpaceVim#plugins#runner#reg_runner('ruby', { @@ -70,15 +97,10 @@ function! SpaceVim#layers#lang#ruby#config() abort endif endfunction -let s:ruby_file_head = [ - \ '#!/usr/bin/ruby -w', - \ '# -*- coding : utf-8 -*-', - \ '' - \ ] - function! SpaceVim#layers#lang#ruby#set_variable(var) abort let s:ruby_repl_command = get(a:var, 'repl_command', '') let s:ruby_file_head = get(a:var, 'ruby-file-head', s:ruby_file_head) + let s:format_on_save = get(a:var, 'format_on_save', s:format_on_save) endfunction function! s:language_specified_mappings() abort diff --git a/autoload/SpaceVim/layers/lang/rust.vim b/autoload/SpaceVim/layers/lang/rust.vim index 9ac6d660b..256b5f7bd 100644 --- a/autoload/SpaceVim/layers/lang/rust.vim +++ b/autoload/SpaceVim/layers/lang/rust.vim @@ -100,12 +100,13 @@ function! SpaceVim#layers#lang#rust#config() abort " Disable racer format, use Neoformat instead! let g:rustfmt_autosave = 0 if s:format_on_save - augroup SpaceVim_layer_lang_rust - autocmd! - autocmd BufWritePre *.rs undojoin | Neoformat - augroup end + call SpaceVim#layers#format#add_filetype({ + \ 'filetype' : 'rust', + \ 'enable' : 1, + \ }) endif + call SpaceVim#mapping#space#regesit_lang_mappings('rust', function('s:language_specified_mappings')) call add(g:spacevim_project_rooter_patterns, 'Cargo.toml') @@ -207,11 +208,11 @@ function! s:execCMD(cmd) abort endfunction " -"#用于更新 toolchain +" toolchain " " set RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static " -" #用于更新 rustup +" rustup " " set RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup " diff --git a/doc/SpaceVim.txt b/doc/SpaceVim.txt index 45c890ca4..4ca921f65 100644 --- a/doc/SpaceVim.txt +++ b/doc/SpaceVim.txt @@ -1388,15 +1388,12 @@ Mappings: ============================================================================== FORMAT *SpaceVim-layer-format* -SpaceVim uses neoformat as the default code format tools. Neoformat uses a -variety of formatters for many filetypes. for more info see |neoformat| if you -want to run a formatter on save, just put this config into bootstrap function. -> - augroup fmt - autocmd! - autocmd BufWritePre * undojoin | Neoformat - augroup END -< +format layer provides code formation for SpaceVim, the default formatting +plugin is |neoformat|. +OPTIONS +format_on_save: disabled by default. + + ============================================================================== GITHUB *SpaceVim-layer-github* @@ -1468,7 +1465,7 @@ LANG#ACTIONSCRIPT *SpaceVim-layer-lang-actionscript* This layer provides syntax highlighting for actionscript. To enable this layer: > - [layers] + [[layers]] name = "lang#actionscript" < @@ -2855,6 +2852,21 @@ OPTIONS '# -*- coding : utf-8 -*-' '' ] +< + 2. ruby_repl_command: the REPL command for ruby + +> + [[layers]] + name = 'lang#ruby' + ruby_repl_command = '~/download/bin/ruby_repl' +< + 3. format_on_save: enable/disable code formation when save ruby file. This +options is disabled by default, to enable it: +> + [[layers]] + name = 'lang#ruby' + ruby_repl_command = '~/download/bin/ruby_repl' + format_on_save = true < KEY BINDINGS diff --git a/docs/_posts/2018-09-27-use-vim-as-ide.md b/docs/_posts/2018-09-27-use-vim-as-ide.md index d2bfbdcf7..28f3f497f 100644 --- a/docs/_posts/2018-09-27-use-vim-as-ide.md +++ b/docs/_posts/2018-09-27-use-vim-as-ide.md @@ -18,11 +18,12 @@ commentsID: "使用 Vim 搭建基本开发环境" - [安装](#安装) - [基本配置](#基本配置) - [基本使用](#基本使用) -- [文件及窗口操作](#文件及窗口操作) + - [文件及窗口操作](#文件及窗口操作) + - [代码格式化](#代码格式化) -### 安装 +## 安装 在入门指南里,介绍了不同系统安装 SpaceVim 的步骤。在安装过程中还是存在一些问题,比如颜色主题看上去和官网不一致,出现各种字体乱码。 安装 SpaceVim 最理想的环境是 neovim + nerdfont + 一个支持真色的终端模拟器。 @@ -38,7 +39,7 @@ commentsID: "使用 Vim 搭建基本开发环境" {% include bilibilivedio.html id="aid=51967466&cid=90976280&page=1" %} -### 基本配置 +## 基本配置 SpaceVim 的配置文件有两种,一种是全局配置文件(`~/.SpaceVim.d/init.toml`), 另外一种是项目专属配置文件,即为项目根目录的配置(`.SpaceVim.d/init.toml`)。 @@ -51,7 +52,7 @@ SpaceVim 的配置文件有两种,一种是全局配置文件(`~/.SpaceVim.d/i {% include bilibilivedio.html id="aid=71915741&cid=124611019&page=1" %} -### 基本使用 +## 基本使用 首先,需要了解下 SpaceVim 启动后几个界面元素:顶部标签栏、底部状态栏。 可以看到,顶部标签栏通常只有一个,主要用来列出已经打开的文件或者是标签页,并以序号标记。 @@ -64,4 +65,6 @@ SpaceVim 的配置文件有两种,一种是全局配置文件(`~/.SpaceVim.d/i SpaceVim 会在状态栏展示各个窗口的编号,可以使用快捷键 `SPC + 数字` 快速跳到对应的窗口,在顶部标签栏,会列出当前已经打开的文件或者标签裂变, 可以使用快捷键 `Leader + 数字` 快速跳到对应的文件。在这里默认的 Leader 是 `\` 键。 - +### 代码格式化 + +代码格式化这一功能由 `format` 模块提供,默认该模块已启用,手动格式化快捷键为 `SPC b f`。 diff --git a/docs/cn/layers/format.md b/docs/cn/layers/format.md index 9ede79b72..2cbad67ca 100644 --- a/docs/cn/layers/format.md +++ b/docs/cn/layers/format.md @@ -12,23 +12,66 @@ lang: zh - [模块简介](#模块简介) - [启用模块](#启用模块) - [模块设置](#模块设置) + - [模块选项](#模块选项) + - [全局选项](#全局选项) ## 模块简介 -该模块为 SpaceVim 提供代码格式化的功能,使用了 Vim8/neovim 的异步特性。引入了插件 [neoformat](https://github.com/sbdchd/neoformat) +`format` 模块为 SpaceVim 提供代码格式化的功能,使用了 Vim8/neovim 的异步特性。引入了插件 [neoformat](https://github.com/sbdchd/neoformat)。 ## 启用模块 -可通过在配置文件内加入如下配置来启用该模块: +`format` 模块默认已经启用,如果需要禁用该模块,可以在配置文件中添加如下配置: ```toml [[layers]] name = "format" + enable = false ``` ## 模块设置 -neoformat 这一插件为不同语言做了很好的默认配置,只需要安装对应的格式化命令即可。当然,neoformat 也支持自定义配置。 -可以在 SpaceVim 启动函数里设置相关插件选项。 +### 模块选项 + +- **`format_on_save`**: 这一模块选项是用于设置是否在保存文件时自动进行格式化,默认是禁用的, + 如果需要启用该功能,可以在设置文件中加入以下内容: + + ```toml + [[layers]] + name = "format" + format_on_save = true + ``` + + 这一选项可以被语言模块中的 `format_on_save` 选项所覆盖。比如,为所有文件类型启用自动格式化,但是 Python + 除外: + + ```toml + # 启用 format 模块 + [[layers]] + name = 'format' + format_on_save = true + # 启用 lang#java 模块 + [[layers]] + name = 'lang#python' + format_on_save = false + ``` + +### 全局选项 + +neoformat 是一个格式化框架插件,该插件的所有自身选项可以在启动函数中进行设置,可以预读 `:help neoformat` +获取完整帮助。 + + + +以下是一个为 Java 文件设置格式化命令的配置,以下配置已经包含在 `lang#java` 模块内了: + +```viml +let g:neoformat_enabled_java = ['googlefmt'] +let g:neoformat_java_googlefmt = { + \ 'exe': 'java', + \ 'args': ['-jar', '~/Downloads/google-java-format-1.5-all-deps.jar', '-'], + \ 'stdin': 1, + \ } +``` diff --git a/docs/layers/format.md b/docs/layers/format.md index 8e1455069..c8d92315c 100644 --- a/docs/layers/format.md +++ b/docs/layers/format.md @@ -5,18 +5,20 @@ description: "Code formatting support for SpaceVim" # [Available Layers](../) >> format - - [Description](#description) - [Install](#install) - [Configuration](#configuration) + - [Layer options](#layer-options) + - [Global options](#global-options) ## Description -This layer provides code format feature SpaceVim, and neoformat is included in this layer. +`format` layer provides code formation feature for SpaceVim, this layer includes `neoformat` +as default code formation plugin. ## Install @@ -30,4 +32,43 @@ This layer is enabled by default. If you want to disable this layer, add followi ## Configuration -neoformat provide better default for different languages, but you can also config it in bootstrap function. +### Layer options + +- **`format_on_save`**: This layer option is to enable/disable code formatting when save current buffer, + and it is disabled by default. To enable it: + + ```toml + [[layers]] + name = "format" + format_on_save = true + ``` + + This option can be overrided by `format_on_save` in language layer. For example, enable `format_on_save` + for all filetypes expect python. + + ```toml + # enable format layer + [[layers]] + name = 'format' + format_on_save = true + # enable lang#java layer + [[layers]] + name = 'lang#python' + format_on_save = false + ``` + +### Global options + +neoformat is a format framework, all of it's options can be used in bootstrap function. You can read +`:help neoformat` for more info. + +here is an example for add formater for java file, and it has been included into `lang#java` layer: + +```viml +let g:neoformat_enabled_java = ['googlefmt'] +let g:neoformat_java_googlefmt = { + \ 'exe': 'java', + \ 'args': ['-jar', '~/Downloads/google-java-format-1.5-all-deps.jar', '-'], + \ 'stdin': 1, + \ } +```