1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-23 07:20:04 +08:00
SpaceVim/docs/development.md

325 lines
11 KiB
Markdown
Raw Permalink Normal View History

2017-02-12 16:36:17 +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
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.
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-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
- [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
- [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)
- [Contributing a keybinding](#contributing-a-keybinding)
- [Language specified key bindings](#language-specified-key-bindings)
- [Contributing a banner](#contributing-a-banner)
- [Bundle plugins](#bundle-plugins)
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 -->
2018-01-21 15:54:26 +08:00
## Contributing code
2017-03-02 20:17:13 +08:00
The source code of spacevim is hosted at [github](https://github.com/SpaceVim/SpaceVim).
Code and documentation contributions of any kind are welcome.
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
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.
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 not begin with a capital letter and do not end with a period.
2021-01-01 16:18:31 +08:00
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
**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
### 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
2023-03-26 13:44:47 +08:00
" Copyright (c) 2016-2023 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, dont 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
2022-06-12 15:37:35 +08:00
" Copyright (c) 2012-2022 Shidong Wang & Contributors
2022-03-27 13:38:54 +08:00
" Author: Shidong Wang < 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-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
### 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
2017-03-02 22:20:46 +08:00
Mappings are an important part of SpaceVim.
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
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
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
#### 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 |
| ----------- | ------------------------------------------------ |
| `g d` | jump to definition |
| `g D` | jump to type definition |
| `SPC l r` | start a runner for current file |
| `SPC l e` | rename symbol |
| `SPC l d` | show doc |
| `K` | 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
### Contributing a banner
2017-03-02 22:20:46 +08:00
The startup banner is the SpaceVim logo by default.
but there are also ASCII banners available in the [core/banner layer](../layers/core/banner/).
2017-03-02 22:20:46 +08:00
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-03-02 22:20:46 +08:00
## Bundle plugins
In `bundle/` directory, there are two kinds of plugins:
1. unmodified plugins, same as the upstream.
2. modified plugins based on specific commit.
checkout the [bundle plugins](../bundle-plugins/) page for more info.
2017-02-14 23:15:22 +08:00
## Build with SpaceVim
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>