2017-02-12 16:36:17 +08:00
---
2021-08-09 16:28:20 +08:00
title: "Development"
2018-01-21 15:54:26 +08:00
description: "General contributing guidelines and changelog of SpaceVim, including development information about SpaceVim"
2017-02-12 16:36:17 +08:00
---
2021-08-23 22:14:58 +08:00
# Development
2017-02-07 01:51:23 +08:00
2017-12-09 13:33:16 +08:00
<!-- vim - markdown - toc GFM -->
2017-03-02 20:17:13 +08:00
2018-01-21 15:54:26 +08:00
- [Asking for help ](#asking-for-help )
2021-08-09 16:28:20 +08:00
- [Reporting bugs ](#reporting-bugs )
- [Requesting new feature ](#requesting-new-feature )
2018-01-21 15:54:26 +08:00
- [Contributing code ](#contributing-code )
- [License ](#license )
- [Conventions ](#conventions )
2021-08-09 21:37:50 +08:00
- [Commit style guide ](#commit-style-guide )
2018-01-21 15:54:26 +08:00
- [Pull Request ](#pull-request )
2021-08-09 21:37:50 +08:00
- [Prefix of title ](#prefix-of-title )
- [Workflow ](#workflow )
- [Simple PRs ](#simple-prs )
- [Complex PRs ](#complex-prs )
2018-01-21 15:54:26 +08:00
- [Contributing a layer ](#contributing-a-layer )
- [File header ](#file-header )
- [Author of a new layer ](#author-of-a-new-layer )
- [Contributor to an existing layer ](#contributor-to-an-existing-layer )
2017-12-09 13:33:16 +08:00
- [Contributing a keybinding ](#contributing-a-keybinding )
2018-01-21 15:54:26 +08:00
- [Language specified key bindings ](#language-specified-key-bindings )
2017-12-09 13:33:16 +08:00
- [Contributing a banner ](#contributing-a-banner )
2017-03-02 22:20:46 +08:00
- [Build with SpaceVim ](#build-with-spacevim )
2020-12-13 17:49:11 +08:00
- [Newsletters ](#newsletters )
2017-03-02 22:20:46 +08:00
- [Changelog ](#changelog )
2017-03-02 20:17:13 +08:00
2017-12-09 13:33:16 +08:00
<!-- vim - markdown - toc -->
2021-08-09 16:28:20 +08:00
SpaceVim is a joint effort of all contributors.
We encourage you to participate in SpaceVim's development.
This page describes the entire development process of SpaceVim.
2018-01-21 15:54:26 +08:00
2021-08-09 16:28:20 +08:00
We have some guidelines that we need all contributors to follow.
You can only think about reading the part that is relevant to what you are going to do:
2017-03-02 20:17:13 +08:00
2021-08-09 16:28:20 +08:00
- [Asking for help ](#asking-for-help ): if you are about to open an issue to ask a question.
- [Requesting new feature ](#requesting-new-feature ): if you want a new feature.
- [Reporting bugs ](#reporting-bugs ): if you run into a bug.
- [Contributing code ](#contributing-code ): if you are about to send a pull-request.
2017-03-02 20:17:13 +08:00
2018-01-21 15:54:26 +08:00
## Asking for help
2017-03-02 20:17:13 +08:00
2021-08-09 16:28:20 +08:00
If you have any questions about using SpaceVim,
check out the following context first, which may contain the answers:
2017-12-09 13:33:16 +08:00
2021-08-09 16:28:20 +08:00
- `:h SpaceVim-faq` : Some of the most frequently asked questions are answered there.
2018-06-20 21:22:35 +08:00
- [SpaceVim documentation ](https://spacevim.org/documentation/ ): It is the general documentation of SpaceVim.
2017-03-02 20:17:13 +08:00
2021-08-09 16:28:20 +08:00
Besides, you can also [chat with us ](../community/#chat )
2017-03-02 20:17:13 +08:00
2021-08-09 16:28:20 +08:00
## Reporting bugs
2021-08-09 21:37:50 +08:00
If you run into a bug, please follow the guidelines below to give feedback.
2017-12-09 13:33:16 +08:00
2021-08-09 21:37:50 +08:00
- Check that no duplicate issue in [issue tracker ](https://github.com/SpaceVim/SpaceVim/issues )
2021-05-30 15:55:12 +08:00
- Check that the issue has not been fixed in latest version of SpaceVim,
please update your SpaceVim, and try to reproduce the bug here.
2021-08-09 21:37:50 +08:00
- Use a clear title with `bug reporting` issue template
```
<!-- bug reporting without issue template will be closed automatically -->
## Expected behavior, english is required
## The reproduce ways from Vim starting (Required!)
## Debug info
<!-- Please press SPC h I, debug info will be put into clipboard, -->
<!-- then paste all content below. -->
## Screenshots
<!-- If you have any screenshots for this issue, -->
<!-- please upload here. -->
<!-- BTW you can use https://asciinema.org/ for recording video in terminal. -->
```
2017-03-02 20:17:13 +08:00
2021-08-09 16:28:20 +08:00
## Requesting new feature
If you want a new feature, use the [github issue tracker ](https://github.com/SpaceVim/SpaceVim/issues ) to file a new issue.
You need to choose a concise title and refine the content in the issue template:
```
**Is your feature request related to a problem? Please describe.**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
**Describe the solution you'd like**
<!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered**
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->
```
2018-01-21 15:54:26 +08:00
## Contributing code
2017-03-02 20:17:13 +08:00
2021-08-09 21:37:50 +08:00
Code and documentation contributions of any kind are welcome.
Please read the following sections carefully.
In any case, feel free to [chat with us ](../community/#chat ) to ask questions about contributing!
2017-02-25 21:23:27 +08:00
2018-01-21 15:54:26 +08:00
### License
2017-02-07 01:51:23 +08:00
2019-01-22 07:50:55 +08:00
The license is GPLv3 for all the parts of SpaceVim. This includes:
2017-12-09 13:33:16 +08:00
2018-02-15 22:25:03 +08:00
- The initialization and core files.
2017-03-02 22:20:46 +08:00
- All the layer files.
2018-02-15 22:25:03 +08:00
- The documentation
2017-02-07 01:51:23 +08:00
2021-08-09 21:37:50 +08:00
For files not belonging to SpaceVim like bundle packages,
refer to the header file. Those files should not have an empty header,
we may not accept code without a proper header file.
2017-03-02 22:20:46 +08:00
2021-01-01 16:18:31 +08:00
### Conventions
2018-02-22 21:15:46 +08:00
2021-01-01 16:18:31 +08:00
SpaceVim is based on conventions, mainly for naming functions,
keybindings definition and writing documentation.
2021-08-09 21:37:50 +08:00
Please read these [conventions ](../conventions/ ) to make sure you
understand them before you contribute code or documentation for the first time.
2018-02-22 21:15:46 +08:00
2021-08-09 21:37:50 +08:00
### Commit style guide
2021-01-01 16:18:31 +08:00
2021-10-06 14:52:46 +08:00
Follow the [conventional commits guidelines ](https://www.conventionalcommits.org/ ) to _make reviews easier_ and to make the git logs more valuable.
The general structure of a commit message is:
2021-01-01 16:18:31 +08:00
```
2021-10-06 14:52:46 +08:00
< type > ([optional scope]): < description >
2021-01-01 16:18:31 +08:00
2021-10-06 14:52:46 +08:00
[optional body]
2021-01-01 16:18:31 +08:00
2021-10-06 14:52:46 +08:00
[optional footer(s)]
2021-01-01 16:18:31 +08:00
```
2021-08-09 21:37:50 +08:00
**types:**
2021-01-01 16:18:31 +08:00
2021-10-06 14:52:46 +08:00
- `feat` : A new feature
- `fix` : A bug fix
- `docs` : Documentation only changes
- `style` : Changes that do not affect the meaning of the code
- `refactor` : A code change that neither fixes a bug nor adds a feature
- `pref` : A code change that improves performance
- `test` : Adding missing tests or correcting existing tests
- `ci` : Changes to our CI configuration files and scripts
- `chore` : Other changes that don't modify src or test files
- `revert` : Reverts a previous commit
2021-01-01 16:18:31 +08:00
2021-08-09 21:37:50 +08:00
**scopes:**
2021-01-01 16:18:31 +08:00
2021-09-25 21:47:38 +08:00
- `api` : files in `autoload/SpaceVim/api/` and `docs/api/` directory
- `layer` : files in `autoload/SpaceVim/layers/` and `docs/layers/` directory
- `plugin` : files in `autoload/SpaceVim/plugins/` directory
2021-08-09 21:37:50 +08:00
- `bundle` : files in `bundle/` directory
2021-09-25 21:47:38 +08:00
- `core` : other files in this repository
2021-01-01 16:18:31 +08:00
2021-10-06 14:52:46 +08:00
In addition to these scopes above,
you can also use a specific layer name or plugin name as a scope.
2021-08-09 21:37:50 +08:00
**subject:**
2021-01-01 16:18:31 +08:00
Subjects should be no greater than 50 characters,
should begin with a capital letter and do not end with a period.
Use an imperative tone to describe what a commit does,
rather than what it did. For example, use change; not changed or changes.
2021-08-09 21:37:50 +08:00
**body:**
2021-01-01 16:18:31 +08:00
2021-05-22 18:28:00 +08:00
Not all commits are complex enough to warrant a body,
2021-06-21 20:39:29 +08:00
therefore it is optional and only used when a commit requires a bit of explanation and context.
2021-01-01 16:18:31 +08:00
2021-08-09 21:37:50 +08:00
**footer**
2021-01-01 16:18:31 +08:00
The footer is optional and is used to reference issue tracker IDs.
2017-03-02 22:20:46 +08:00
2021-10-14 23:52:14 +08:00
**Breaking change**
Breaking changes must be indicated by "!" after the type/scope, and
a "BREAKING CHANGE" footer describing the change. Example:
```
refactor(tools#mpv)!: change default musics_directory
BREAKING CHANGE: `~/Music` is standard on macOS and
also on FreeDesktop's XDG.
```
2018-01-21 15:54:26 +08:00
### Pull Request
2021-08-09 21:37:50 +08:00
#### Prefix of title
2018-06-20 21:22:35 +08:00
2021-08-09 21:37:50 +08:00
The title of a pull request should contain one of the following prefixes::
2018-06-20 21:22:35 +08:00
2019-02-23 08:18:06 +08:00
- `Add:` Adding new features.
2018-06-20 21:22:35 +08:00
- `Change:` Change default behaviors or the existing features.
2019-02-23 08:18:06 +08:00
- `Fix:` Fix some bugs.
- `Remove:` Remove some existing features.
- `Doc:` Update the help files.
2018-09-25 22:09:28 +08:00
- `Website:` Update the content of website.
2018-06-20 21:22:35 +08:00
2019-01-08 11:47:28 +08:00
Here is an example:
2018-06-20 21:22:35 +08:00
2019-01-22 07:50:55 +08:00
`Website: Update the lang#c layer page.`
2018-06-20 21:22:35 +08:00
2021-08-09 21:37:50 +08:00
#### Workflow
2017-03-02 22:20:46 +08:00
2019-01-22 07:50:55 +08:00
- Fork SpaceVim repository
- Clone your repository
2021-08-09 16:28:20 +08:00
2018-01-21 15:54:26 +08:00
```sh
git clone ${YOUR_OWN_REPOSITORY_URL}
```
2019-01-22 07:50:55 +08:00
- Add upstream remote
2021-08-09 16:28:20 +08:00
2018-01-21 15:54:26 +08:00
```sh
git remote add upstream https://github.com/SpaceVim/SpaceVim.git
```
2017-03-02 22:20:46 +08:00
2019-01-22 07:50:55 +08:00
- Fetch upstream and rebase on top of upstream master
2021-08-09 16:28:20 +08:00
2018-01-21 15:54:26 +08:00
```sh
git fetch upstream
2019-01-08 11:47:28 +08:00
git rebase upstream/master
2018-01-21 15:54:26 +08:00
```
2021-08-09 21:37:50 +08:00
#### Simple PRs
2017-03-02 22:20:46 +08:00
2018-01-20 16:39:54 +08:00
- Branch from `master`
2017-03-02 22:20:46 +08:00
- One topic per PR
- One commit per PR
- If you have several commits on different topics, close the PR and create one PR per topic
- If you still have several commits, squash them into only one commit
2021-08-09 21:37:50 +08:00
#### Complex PRs
2017-03-02 22:20:46 +08:00
2021-01-01 16:18:31 +08:00
Squash only the commits with uninteresting changes like typos, syntax fixes, etc.
And keep the important and isolated steps in different commits.
2017-03-02 22:20:46 +08:00
Those PRs are merged and explicitly not fast-forwarded.
2018-01-20 16:39:54 +08:00
2018-01-21 15:54:26 +08:00
### Contributing a layer
2017-03-02 22:20:46 +08:00
Please read the layers documentation first.
2019-01-22 07:50:55 +08:00
Layer with no associated configuration will be rejected. For instance a layer with just a package and a hook can be easily replaced by the usage of the variable `custom_plugins` .
2017-03-02 22:20:46 +08:00
2018-01-21 15:54:26 +08:00
#### File header
2017-03-02 22:20:46 +08:00
2019-01-22 07:50:55 +08:00
The file header for Vim script should look like the following template:
2017-03-02 22:20:46 +08:00
2019-01-22 07:50:55 +08:00
```vim
2017-03-02 22:20:46 +08:00
"=============================================================================
" FILENAME --- NAME layer file for SpaceVim
2022-02-03 17:24:51 +08:00
" Copyright (c) 2016-2022 Wang Shidong & Contributors
2019-06-09 14:11:17 +08:00
" Author: Wang Shidong < wsdjeg @ outlook . com >
2017-03-02 22:20:46 +08:00
" URL: https://spacevim.org
2018-02-15 22:25:03 +08:00
" License: GPLv3
2017-03-02 22:20:46 +08:00
"=============================================================================
```
2021-06-21 20:39:29 +08:00
You should replace FILENAME by the name of the file (e.g. foo.vim) and NAME by the name of the layer you are creating, don’ t forget to replace **YOUR NAME** and **YOUR EMAIL** too.
2017-03-02 22:20:46 +08:00
2018-01-21 15:54:26 +08:00
#### Author of a new layer
2017-03-02 22:20:46 +08:00
2021-06-21 20:39:29 +08:00
In the file's header, replace the default author name (Shidong Wang) with your name.
2017-03-02 22:20:46 +08:00
2021-06-21 20:39:29 +08:00
The following example shows how to create a new layer named `foo` :
2017-02-10 22:05:19 +08:00
2019-01-22 07:50:55 +08:00
1. Fork SpaceVim repo.
2. Add a layer file `autoload/SpaceVim/layers/foo.vim` for `foo` layer.
3. Edit layer file, check out the example below:
2017-02-10 22:05:19 +08:00
```vim
2017-03-02 22:20:46 +08:00
"=============================================================================
" foo.vim --- foo Layer file for SpaceVim
" Copyright (c) 2012-2016 Shidong Wang & Contributors
" Author: Shidong Wang < wsdjeg at 163 . com >
" URL: https://spacevim.org
2018-02-15 22:25:03 +08:00
" License: GPLv3
2017-03-02 22:20:46 +08:00
"=============================================================================
""
2021-09-20 22:16:14 +08:00
" @section foo, layers-foo
2017-03-02 22:20:46 +08:00
" @parentsection layers
2021-06-21 20:39:29 +08:00
" This is the doc for this layer:
2017-03-02 22:20:46 +08:00
"
2018-01-03 23:14:15 +08:00
" @subsection Key Bindings
2017-03-02 22:20:46 +08:00
" >
" Mode Key Function
" -------------------------------------------------------------
" normal < leader > jA generate accessors
" normal < leader > js generate setter accessor
" <
2018-01-03 23:14:15 +08:00
" @subsection Layer options
2017-03-02 22:20:46 +08:00
" >
" Name Description Default
" -------------------------------------------------------------
2018-01-03 23:14:15 +08:00
" option1 Set option1 for foo layer ''
" option2 Set option2 for foo layer []
" option3 Set option3 for foo layer {}
" <
" @subsection Global options
" >
" Name Description Default
" -------------------------------------------------------------
" g:pluginA_opt1 Set opt1 for plugin A ''
" g:pluginB_opt2 Set opt2 for plugin B []
2017-03-02 22:20:46 +08:00
" <
2017-02-10 22:05:19 +08:00
function! SpaceVim#layers#foo#plugins() abort
2017-03-02 22:20:46 +08:00
let plugins = []
call add(plugins, ['Shougo/foo.vim', {'option' : 'value'}])
call add(plugins, ['Shougo/foo_test.vim', {'option' : 'value'}])
return plugins
2017-02-10 22:05:19 +08:00
endfunction
function! SpaceVim#layers#foo#config() abort
2017-03-02 22:20:46 +08:00
let g:foo_option1 = get(g:, 'foo_option1', 1)
let g:foo_option2 = get(g:, 'foo_option2', 2)
let g:foo_option3 = get(g:, 'foo_option3', 3)
" ...
2017-02-10 22:05:19 +08:00
endfunction
2019-09-12 12:24:05 +08:00
" add layer options:
let s:layer_option = 'default var'
function! SpaceVim#layers#foo#set_variable(var) abort
let s:layer_option = get(a:var, 'layer_option', s:layer_option)
endfunction
" completion function for layer options:
function! SpaceVim#layers#foo#get_options() abort
return ['layer_option']
endfunction
2017-02-10 22:05:19 +08:00
```
2021-06-21 20:39:29 +08:00
4. Create the layer's documentation file `docs/layers/foo.md` for `foo` layer.
5. Open `docs/layers/index.md` , and run `:call SpaceVim#dev#layers#update()` to update the layers list.
6. Send a PR to SpaceVim.
2017-02-12 19:21:46 +08:00
2018-01-21 15:54:26 +08:00
#### Contributor to an existing layer
2017-03-02 22:20:46 +08:00
2019-01-22 07:50:55 +08:00
If you want to contribute to an already existing layer, you should not modify any header file.
2017-03-02 22:20:46 +08:00
#### Contributing a keybinding
Mappings are an important part of SpaceVim.
2019-01-22 07:50:55 +08:00
First if you want to have some personal mappings. This can be done in your bootstrap function.
2017-03-02 22:20:46 +08:00
2021-06-21 20:39:29 +08:00
If you think it is worth contributing new mappings, be sure to read the documentation to find the best mappings, then create a Pull-Request with your mappings.
2017-03-02 22:20:46 +08:00
2021-06-21 20:39:29 +08:00
ALWAYS document your new mappings or mapping changes inside the relevant documentation file.
2019-01-22 07:50:55 +08:00
It should be the layername.md and the [documentation ](../documentation/ ).
2017-03-02 22:20:46 +08:00
2018-01-21 15:54:26 +08:00
##### Language specified key bindings
2018-01-02 20:00:16 +08:00
2021-06-21 20:39:29 +08:00
All language specified key bindings have the prefix `SPC l` .
2018-01-02 20:00:16 +08:00
2021-06-21 20:39:29 +08:00
We recommend you to use the common language specified key bindings for the same purpose as the following:
2018-01-02 20:00:16 +08:00
| Key Binding | Description |
| ----------- | ------------------------------------------------ |
2018-05-12 19:01:00 +08:00
| `SPC l r` | start a runner for current file |
| `SPC l e` | rename symbol |
| `SPC l d` | show doc |
| `SPC l i r` | remove unused imports |
| `SPC l i s` | sort imports with isort |
| `SPC l s i` | Start a language specified inferior REPL process |
| `SPC l s b` | send buffer and keep code buffer focused |
| `SPC l s l` | send line and keep code buffer focused |
| `SPC l s s` | send selection text and keep code buffer focused |
2018-01-02 20:00:16 +08:00
2021-06-21 20:39:29 +08:00
All above key bindings are just recommended as default, but they are also based on the language layer itself.
2018-01-04 12:18:19 +08:00
2017-03-02 22:20:46 +08:00
#### Contributing a banner
The startup banner is by default the SpaceVim logo but there are also ASCII banners available in the core/banner layer.
If you have some ASCII skills you can submit your artwork!
You are free to choose a reasonable height size but the width size should be around 75 characters.
2017-02-14 23:15:22 +08:00
## Build with SpaceVim
2021-06-21 20:39:29 +08:00
SpaceVim provides a lot of public [APIs ](../api/ ), you can create plugins based on these APIs. Also you can add a badge to the README.md of your plugin.
2017-02-14 23:15:22 +08:00
![](https://img.shields.io/badge/build%20with-SpaceVim-ff69b4.svg)
markdown
2017-02-15 23:56:04 +08:00
2017-02-14 23:15:22 +08:00
```md
2017-02-15 23:56:04 +08:00
[![ ](https://spacevim.org/img/build-with-SpaceVim.svg )](https://spacevim.org)
2017-02-14 23:15:22 +08:00
```
2020-12-13 17:49:11 +08:00
## Newsletters
< ul >
{% for post in site.categories.newsletter %}
< li >
< h3 > < a href = "{{ post.url }}" > {{ post.title }}< / a > < / h3 >
< span class = "post-date" > {{ post.date | date_to_string }}< / span >
< p > {{ post.description | truncatewords: 100 }}< / p >
< / li >
{% endfor %}
< / ul >
2017-02-12 19:21:46 +08:00
## Changelog
< ul >
2017-02-12 19:36:33 +08:00
{% for post in site.categories.changelog %}
2017-02-12 19:21:46 +08:00
< li >
2018-05-27 20:54:33 +08:00
< h3 > < a href = "{{ post.url }}" > {{ post.title }}< / a > < / h3 >
< span class = "post-date" > {{ post.date | date_to_string }}< / span >
2020-05-10 14:05:04 +08:00
< p > {{ post.description | truncatewords: 100 }}< / p >
2017-02-12 19:21:46 +08:00
< / li >
{% endfor %}
< / ul >