diff --git a/autoload/SpaceVim/layers/lang/python.vim b/autoload/SpaceVim/layers/lang/python.vim index 8ade63180..b2dbbde28 100644 --- a/autoload/SpaceVim/layers/lang/python.vim +++ b/autoload/SpaceVim/layers/lang/python.vim @@ -15,6 +15,22 @@ " mode key function " < + +if exists('s:enabled_linters') + finish +endif + +let s:enabled_linters = ['python', 'flake8'] +let s:format_on_save = 0 +let s:python_file_head = [ + \ '#!/usr/bin/env python', + \ '# -*- coding: utf-8 -*-', + \ '', + \ '' + \ ] +let s:enable_typeinfo = 0 +let s:python_interpreter = 'python3' + function! SpaceVim#layers#lang#python#plugins() abort let plugins = [] " python @@ -73,6 +89,8 @@ function! SpaceVim#layers#lang#python#config() abort elseif executable('python') call SpaceVim#plugins#repl#reg('python', ['python', '-i']) endif + let g:neomake_python_enabled_makers = ['python'] + let g:neomake_python_python_exe = s:python_interpreter endfunction function! s:language_specified_mappings() abort @@ -158,7 +176,7 @@ func! s:getexe() abort if line =~# '^#!' return s:Shebang_to_cmd(line) endif - return ['python'] + return [s:python_interpreter] endf function! s:go_to_def() abort @@ -169,16 +187,7 @@ function! s:go_to_def() abort endif endfunction -let s:format_on_save = 0 -let s:python_file_head = [ - \ '#!/usr/bin/env python', - \ '# -*- coding: utf-8 -*-', - \ '', - \ '' - \ ] -let s:enable_typeinfo = 0 function! SpaceVim#layers#lang#python#set_variable(var) abort - let s:format_on_save = get(a:var, \ 'format_on_save', \ get(a:var, @@ -193,4 +202,12 @@ function! SpaceVim#layers#lang#python#set_variable(var) abort \ 'enable_typeinfo', \ s:enable_typeinfo \ ) + let s:enabled_linters = get(a:var, + \ 'enabled_linters', + \ s:enabled_linters + \ ) + let s:python_interpreter = get(a:var, + \ 'python_interpreter', + \ s:python_interpreter + \ ) endfunction diff --git a/docs/_posts/2018-09-27-use-vim-as-a-python-ide.md b/docs/_posts/2018-09-27-use-vim-as-a-python-ide.md index fcd824109..0c07a81cd 100644 --- a/docs/_posts/2018-09-27-use-vim-as-a-python-ide.md +++ b/docs/_posts/2018-09-27-use-vim-as-a-python-ide.md @@ -9,26 +9,35 @@ commentsID: "Use Vim as a Python IDE" # [Blogs](../blog/) >> Use Vim as a Python IDE -This is a general guide for using SpaceVim as a Python IDE, including layer configuration and usage. +This tutorial introduces you to SpaceVim as a Python environment, +by using the `lang#python` layer, you make SpaceVim into a great lightweight Python IDE. + Each of the following sections will be covered: - [Enable language layer](#enable-language-layer) +- [Select a Python interpreter](#select-a-python-interpreter) - [Code completion](#code-completion) - [Syntax linting](#syntax-linting) -- [Import packages](#import-packages) -- [Jump to test file](#jump-to-test-file) -- [running code](#running-code) - [Code formatting](#code-formatting) +- [Import packages](#import-packages) +- [Jump between alternate files](#jump-between-alternate-files) +- [Code running](#code-running) - [REPL](#repl) +This tutorial is not intended to teach you Python itself. + +If you have any problems, feel free to join the [SpaceVim gitter chatting room](https://gitter.im/SpaceVim/SpaceVim) for general discussion. + + ### Enable language layer -To add Python language support in SpaceVim, you need to enable the `lang#python` layer. Press `SPC f v d` to open -SpaceVim configuration file, and add the following snippet to your configuration: +The python language support in SpaceVim is provided by `lang#python` layer, and it is not enabled by default. +You need to enable it in SpaceVim configuration file. Press `SPC f v d` to open the SpaceVim configuration file, +and add following snippet to your configuration file. ```toml [[layers]] @@ -37,24 +46,50 @@ SpaceVim configuration file, and add the following snippet to your configuration For more info, you can read the [lang#python](../layers/lang/python/) layer documentation. +### Select a Python interpreter + +Python is an interpreted language, and in order to run Python code and get semantic information, +you need to tell SpaceVim which interpreter to use. This can be set with `python_interpreter` layer +option. For example: + +```toml +[[layers]] + name = 'lang#python' + python_interpreter = 'D:\scoop\shims\python.exe' +``` + +This option will be applied to neomake's python maker and python code runner. + ### Code completion -`lang#python` layer will load the jedi plugin automatically, unless overriden in your `init.toml`. -The completion menu will be opened as you type. +Code autocompletion is provided by `autocomplete` layer, which is loaded by default. +The language completion source is included in `lang#python` layer. +This layer includes `deoplete-jedi` for neovim. ![complete python code](https://user-images.githubusercontent.com/13142418/46339650-f5a49280-c665-11e8-86d4-20944ec23098.png) ### Syntax linting -The checkers layer is enabled by default. This layer provides asynchronous syntax linting via [neomake](https://github.com/neomake/neomake). -It will run flake asynchronously. +Code Linting is provided by [`checkers`](../layers/checkers/) layer, which is also enabled by default. +There are two syntax linters enabled by default, +python and [pylint](https://pylint.org/), both of them run asynchronously. -To install flake8, just run following command in terminal. +To install pylint, just run following command in terminal. ```sh -pip install --user flake8 +pip install --user pylint ``` +### Code formatting + +Code formatting is provided by [`format`](../layers/format/) layer, this layer is also enabled by default. +And the key binding to format current buffer is `SPC b f`. The default formatter for python code is [yapf](https://github.com/google/yapf). + +So, before using this feature, please install yapf. + +```sh +pip install --user yapf +``` ### Import packages When edit Python file, you can import the package automatically, remove unused package and format package list. @@ -63,10 +98,15 @@ When edit Python file, you can import the package automatically, remove unused p pip install --user isort ``` -### Jump to test file +### Jump between alternate files -SpaceVim use built-in plugin to manager the files in a project, -you can add a `.project_alt.json` to the root of your project with following content: +The alternate files manager provides a command `:A`, with this command, +you can jump between alternate files within a project. + +The alternate file structure can be definded in a `.project_alt.json` +file in the root of your project. + +For example: ```json { @@ -77,22 +117,15 @@ you can add a `.project_alt.json` to the root of your project with following con with this configuration, you can jump between the source code and test file via command `:A`. -### running code +### Code running -To run current script, you can press `SPC l r`, and a split window -will open, the output of the script will be shown in this window. +Code running is provided by builtin code runner. To run current script, +you can press `SPC l r`, and a split window will open, +the output of the script will be shown in this window. It is running asynchronously, and will not block your Vim. ![code runner](https://user-images.githubusercontent.com/13142418/46293837-1c5fbc00-c5c7-11e8-9f3c-c11504e2e04a.png) -### Code formatting - -The format layer is also enabled by default, with this layer you can use key binding `SPC b f` to format current buffer. -Before using this feature, please install yapf. - -```sh -pip install --user yapf -``` ### REPL diff --git a/docs/layers/lang/python.md b/docs/layers/lang/python.md index 96874424d..031951fb5 100644 --- a/docs/layers/lang/python.md +++ b/docs/layers/lang/python.md @@ -8,11 +8,10 @@ description: "This layer is for Python development, provide autocompletion, synt - [Description](#description) -- [Features](#features) -- [Install](#install) - - [enable layer](#enable-layer) - - [language tools](#language-tools) -- [Configuration](#configuration) +- [Installation](#installation) + - [Enable language layer](#enable-language-layer) + - [Language tools](#language-tools) +- [Layer options](#layer-options) - [Key bindings](#key-bindings) - [Jump to definition](#jump-to-definition) - [Code generation](#code-generation) @@ -29,116 +28,119 @@ description: "This layer is for Python development, provide autocompletion, synt This layer is for Python development. -## Features +## Installation -- Auto-completion using [deoplete-jedi](https://github.com/zchee/deoplete-jedi) or [jedi-vim](https://github.com/davidhalter/jedi-vim) -- Documentation Lookup using [jedi-vim](https://github.com/davidhalter/jedi-vim) +### Enable language layer -## Install - -### enable layer - -To use this configuration layer, add following snippet to your custom configuration file. +The `lang#python` layer is not loaded by default, to use this layer, +you need to add following snippet into your spacevim configuration file. ```toml [[layers]] name = "lang#python" ``` -### language tools +### Language tools -**syntax checking:** +- **syntax checking:** -`checker` layer provide syntax checking feature, and for Python it uses `flake8` package: + `checker` layer provide syntax checking feature, and for Python it uses `pylint` package: -```sh -pip install --user flake8 -``` + ```sh + pip install --user pylint + ``` -**code formatting:** +- **code formatting:** -The default key binding for formatting buffer is `SPC b f`, -and you need to install `yapf`. -To enable automatic buffer formatting on save, -load this layer with setting `format_on_save` to `1`. + The default key binding for formatting buffer is `SPC b f`, + and you need to install `yapf`. -```toml -[[layers]] - name = "lang#python" - format_on_save = 1 -``` + ```sh + pip install --user yapf + ``` -```sh -pip install --user yapf -``` + To use other tool as the format command, for example `black`, + change the neoformat option in bootstrap function. -To use other tool as the format command, for example `black`, change the neoformat option in bootstrap -function. + ```viml + let g:neoformat_python_black = { + \ 'exe': 'black', + \ 'stdin': 1, + \ 'args': ['-q', '-'], + \ } + let g:neoformat_enabled_python = ['black'] + ``` -```viml -let g:neoformat_python_black = { - \ 'exe': 'black', - \ 'stdin': 1, - \ 'args': ['-q', '-'], - \ } -let g:neoformat_enabled_python = ['black'] -``` +- **code formatting:** -**format imports:** + The default formatter for python is [yapf](https://github.com/google/yapf). -To be able to suppress unused imports easily, install [autoflake](https://github.com/myint/autoflake): + ``` + pip install --user yapf + ``` -```sh -pip install --user autoflake -``` + To be able to suppress unused imports easily, install [autoflake](https://github.com/myint/autoflake): -To be able to sort your imports, install [isort](https://github.com/timothycrosley/isort) + ``` + pip install --user autoflake + ``` -```sh -pip install --user isort -``` + To be able to sort your imports, install [isort](https://github.com/timothycrosley/isort) -**code coverage:** + ``` + pip install --user isort + ``` -To be able to show code coverage, install coverage.py +- **code coverage:** -```sh -pip install --user coverage -``` + To be able to show code coverage, install coverage.py -## Configuration + ``` + pip install --user coverage + ``` -By default, when create a new python file, SpaceVim will insert file head automatically. -to change the file head, use `python_file_head` option: +## Layer options -```toml -[[layers]] - name = "lang#python" - python_file_head = [ - '#!/usr/bin/env python', - '# -*- coding: utf-8 -*-', - '', - '' - ] -``` +- `python_file_head`: Default file head when create new python file. -When enable autocomplete layer, the symbol will be complete automatically. By default the type info -is disabled, because it is too slow. To enable type info: + By default, when create a new python file, SpaceVim will insert file head automatically. + to change the file head, use `python_file_head` option: -```toml -[[layers]] - name = "lang#python" - enable_typeinfo = true -``` + ```toml + [[layers]] + name = "lang#python" + python_file_head = [ + '#!/usr/bin/env python', + '# -*- coding: utf-8 -*-', + '', + '' + ] + ``` -By default, the python layer utilizes `neomake` for syntax checking, and the default python executable -is simply `python`. Note that the python version is up to your system configuration. If the system -(or environment) python version is 2, one can have the following configuration in the bootstrap function -for syntax checking on python3: + When enable autocomplete layer, the symbol will be complete automatically. By default the type info + is disabled, because it is too slow. To enable type info: -```vim -let g:neomake_python_python_exe = 'python3' -``` + ```toml + [[layers]] + name = "lang#python" + enable_typeinfo = true + ``` + +- `format_on_save`: Enable/disabled file formatting when saving current python file. By default, + it is disabled, to enable it: + ```toml + [[layers]] + name = 'lang#python' + format_on_save = true + ``` + +* `python_interpreter`: Set the python interpreter, by default, it is `python3`. The value of this option will + be apply to `g:neomake_python_python_exe` and code runner. + ```toml + [[layers]] + name = 'lang#python' + python_interpreter = 'D:\scoop\shims\python.exe' + ``` ## Key bindings @@ -165,11 +167,17 @@ let g:neomake_python_python_exe = 'python3' ### Text objects and motions -This layer contains vim-pythonsense which provides text objects and motions for Python classes, methods, functions, and doc strings. +This layer contains [vim-pythonsense](https://github.com/jeetsukumaran/vim-pythonsense) +which provides text objects and motions for Python classes, methods, functions, and doc strings. -| Text Objects | Descriptions | -| ------------ | ------------------------ | -| `ac` | Outer class text object. | +| Text Objects | Descriptions | +| ------------ | --------------------------- | +| `ac` | Outer class text object | +| `ic` | Inner class text object | +| `af` | Inner function text object | +| `if` | Inner function text object | +| `ad` | Inner docstring text object | +| `id` | Inner docstring text object | ### Inferior REPL process