1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-23 10:30:05 +08:00
SpaceVim/docs/development.md

401 lines
13 KiB
Markdown
Raw 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
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)
- [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)
- [Contributing a keybinding](#contributing-a-keybinding)
- [Language specified key bindings](#language-specified-key-bindings)
- [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 -->
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
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
- [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
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
- `: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
Besides, you can also [chat with us](../community/#chat)
2017-03-02 20:17:13 +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
- Update the SpaceVim to the latest version. And make sure the can be reproduced in latest version of spacevim.
- [Open new issue on github](https://github.com/SpaceVim/SpaceVim/issues/new?assignees=&labels=&template=bug_report.md&title=), and follow the `bug reporting` template.
## Requesting new feature
If you want a new feature or have an idea to improve spacevim, feel free to [open new issue](https://github.com/SpaceVim/SpaceVim/issues/new?assignees=&labels=feature+request&template=feature_request.md&title=) for feature requesting.
2018-01-21 15:54:26 +08:00
## Contributing code
2017-03-02 20:17:13 +08:00
Code and documentation contributions of any kind are welcome.
2021-08-09 21:37:50 +08:00
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
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 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
**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
#### 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.
- `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
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
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
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, 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
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>