forked from VimPlug/jedi-vim
Compare commits
346 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48af2afd3e | ||
|
|
7b7e6b5859 | ||
|
|
37bd03c3d5 | ||
|
|
79ced22a37 | ||
|
|
510b1c94e4 | ||
|
|
6d05c25873 | ||
|
|
0b9bbc3495 | ||
|
|
31ebd30c31 | ||
|
|
3be8833913 | ||
|
|
77924398bd | ||
|
|
8e0cefc371 | ||
|
|
bbd456c016 | ||
|
|
41507bab99 | ||
|
|
8b7c4cbad5 | ||
|
|
65190a1856 | ||
|
|
fb52e32238 | ||
|
|
109ceeb2f8 | ||
|
|
d189d8aab7 | ||
|
|
7e6811cb4b | ||
|
|
24496c1416 | ||
|
|
8d547695e2 | ||
|
|
d42f56bc82 | ||
|
|
192e03b335 | ||
|
|
1c7c9064b7 | ||
|
|
85020495ef | ||
|
|
edde267f6b | ||
|
|
641c88111d | ||
|
|
5c6531ffae | ||
|
|
516189c7e3 | ||
|
|
ce6b60063d | ||
|
|
72c1a332d2 | ||
|
|
c8164fdfda | ||
|
|
0c6a2b7737 | ||
|
|
60bdff8eea | ||
|
|
ddaec5652b | ||
|
|
163a0b5db1 | ||
|
|
cfadac7f22 | ||
|
|
82661d515b | ||
|
|
a46ea1a1eb | ||
|
|
a2cf2291da | ||
|
|
dc7b6228b2 | ||
|
|
20312dcca8 | ||
|
|
c11b38cb48 | ||
|
|
f1d9708f7c | ||
|
|
6394614017 | ||
|
|
6411de0cd1 | ||
|
|
0ee2ed0bc6 | ||
|
|
e2d79c6434 | ||
|
|
53358dc0fa | ||
|
|
18af876d6b | ||
|
|
40a02a7fd1 | ||
|
|
eef60e056a | ||
|
|
8e34a59045 | ||
|
|
c1e279cab7 | ||
|
|
2ee9ec64d3 | ||
|
|
682f37792d | ||
|
|
0844b14866 | ||
|
|
ac6756a466 | ||
|
|
b885e10e0d | ||
|
|
0dea756fd9 | ||
|
|
8cf616b088 | ||
|
|
63ecc1dbd7 | ||
|
|
52772e171f | ||
|
|
eba90e615d | ||
|
|
f100ffad4d | ||
|
|
702da51cbe | ||
|
|
fe30fa485b | ||
|
|
3582fa6bc2 | ||
|
|
4a3dc9da84 | ||
|
|
f99d86073b | ||
|
|
636d393114 | ||
|
|
4baf4b27f7 | ||
|
|
3dc61513af | ||
|
|
80378d857b | ||
|
|
671f9f5780 | ||
|
|
b96dad9d50 | ||
|
|
a69e6b8cc0 | ||
|
|
f191ccd6fb | ||
|
|
8243015479 | ||
|
|
01787a9988 | ||
|
|
4ed33a8600 | ||
|
|
e66c2e12e6 | ||
|
|
d0c3ddb9ff | ||
|
|
12db7ad364 | ||
|
|
9384d464ec | ||
|
|
d86039ea89 | ||
|
|
b32b731767 | ||
|
|
6a6595f5c5 | ||
|
|
026ae6be03 | ||
|
|
b7163d615c | ||
|
|
443e7fe555 | ||
|
|
b3f7f3c0b5 | ||
|
|
8753bf2e16 | ||
|
|
f95ac1e8e0 | ||
|
|
f0c63f1172 | ||
|
|
02c2de1c51 | ||
|
|
99132ec545 | ||
|
|
5ea9ee7a63 | ||
|
|
ba0b44b65d | ||
|
|
369284a6bc | ||
|
|
3882c5dd32 | ||
|
|
c94a143bfb | ||
|
|
b7e42e6ad5 | ||
|
|
2eabe57616 | ||
|
|
d9f92d5b24 | ||
|
|
6b7dfe1c1a | ||
|
|
70360437cd | ||
|
|
19ad3063d9 | ||
|
|
8334e505b3 | ||
|
|
e8b88f0161 | ||
|
|
a0c3269420 | ||
|
|
75e9141111 | ||
|
|
5ccdd11282 | ||
|
|
5bcb17a8ad | ||
|
|
0f7b743b4e | ||
|
|
48ad42de86 | ||
|
|
0d613b5cf9 | ||
|
|
794af5b90a | ||
|
|
221d7dbee4 | ||
|
|
e7193b5e5f | ||
|
|
9ae6da6467 | ||
|
|
f08abefa31 | ||
|
|
cdfb7a5b4f | ||
|
|
de793216f5 | ||
|
|
6b8d900b05 | ||
|
|
df39189578 | ||
|
|
625c568b12 | ||
|
|
8215b220f9 | ||
|
|
dc23f0b859 | ||
|
|
217e56d9bd | ||
|
|
0c2831d9a6 | ||
|
|
b3e91e8de2 | ||
|
|
13a4a0c0c4 | ||
|
|
2cf1d42fff | ||
|
|
84f5cd92c7 | ||
|
|
9af06424fb | ||
|
|
4b32847110 | ||
|
|
a5be01fb0b | ||
|
|
267df8b3da | ||
|
|
005cb5225f | ||
|
|
95d8eb1b08 | ||
|
|
431a0b11e5 | ||
|
|
9a258c74f5 | ||
|
|
5c868b9a1f | ||
|
|
62c423bf29 | ||
|
|
7abc3ad8d4 | ||
|
|
9633044332 | ||
|
|
067ab1ea4b | ||
|
|
e38981fc4f | ||
|
|
8ee4e12d3e | ||
|
|
b38ec94646 | ||
|
|
9c235c79ac | ||
|
|
8cfa121b4d | ||
|
|
c94fe6fcee | ||
|
|
5041224c13 | ||
|
|
4867831ad0 | ||
|
|
610cbcacb7 | ||
|
|
b5ec9ac3ed | ||
|
|
253eb5102c | ||
|
|
9ec2fb44b0 | ||
|
|
e241cf87fd | ||
|
|
525524b5cf | ||
|
|
267f66755d | ||
|
|
6b96313930 | ||
|
|
afc02a3621 | ||
|
|
bcf24529fa | ||
|
|
676b37812b | ||
|
|
0d52b56a72 | ||
|
|
45c0b91c5e | ||
|
|
261261af3d | ||
|
|
3f259c2a9e | ||
|
|
83e62d56ba | ||
|
|
ed09c7c1af | ||
|
|
2fbcc5b991 | ||
|
|
7890339ca8 | ||
|
|
91c2a031df | ||
|
|
0703494188 | ||
|
|
6dedbf339e | ||
|
|
889feae117 | ||
|
|
ac1615c647 | ||
|
|
d3484afe20 | ||
|
|
dc9688602c | ||
|
|
ed4a8be12e | ||
|
|
924b4db962 | ||
|
|
95b8dd77ba | ||
|
|
2e0be9069a | ||
|
|
b3978bc4aa | ||
|
|
91b4332774 | ||
|
|
133281a021 | ||
|
|
439e50e9d1 | ||
|
|
56b2268df3 | ||
|
|
a135f3b75b | ||
|
|
bce599fc9c | ||
|
|
0dd1b9fd44 | ||
|
|
6c1719a68a | ||
|
|
d79f41149f | ||
|
|
651eac91ff | ||
|
|
abc0c07d0f | ||
|
|
0747189516 | ||
|
|
dd33e38631 | ||
|
|
9a13f143a8 | ||
|
|
6025f59945 | ||
|
|
1bf69c5844 | ||
|
|
054285e2b7 | ||
|
|
fb77981040 | ||
|
|
de410d9347 | ||
|
|
299c9b26d3 | ||
|
|
4d67c1a6e3 | ||
|
|
154e2dbae3 | ||
|
|
b9ba141069 | ||
|
|
bf281dabda | ||
|
|
afb84a837c | ||
|
|
7539614f09 | ||
|
|
fc95545378 | ||
|
|
676c558110 | ||
|
|
65c06553fd | ||
|
|
4095d0efef | ||
|
|
527562208c | ||
|
|
baa2969427 | ||
|
|
dd4cb80911 | ||
|
|
e5038cc9fa | ||
|
|
2f06d90f95 | ||
|
|
03805f87f5 | ||
|
|
c38b549a95 | ||
|
|
83d398bc5d | ||
|
|
0f203c12b9 | ||
|
|
cfb76259f1 | ||
|
|
78ac52a26e | ||
|
|
3b26cf376b | ||
|
|
d76c00eff4 | ||
|
|
3c79979c50 | ||
|
|
1837cdee1f | ||
|
|
e43012afc8 | ||
|
|
2d74fe6c51 | ||
|
|
9779628322 | ||
|
|
3497a9644e | ||
|
|
0cd664d8f7 | ||
|
|
7784c29a59 | ||
|
|
8f7f07fb58 | ||
|
|
63dc0badac | ||
|
|
cc254432b6 | ||
|
|
ae8a2505bc | ||
|
|
839e1b5b85 | ||
|
|
27df21c7bf | ||
|
|
acdd711d84 | ||
|
|
9b11e70afe | ||
|
|
ab04982d63 | ||
|
|
a0bb09e891 | ||
|
|
2611ea3c27 | ||
|
|
fe517fae74 | ||
|
|
401731c98b | ||
|
|
b78f1d74c5 | ||
|
|
2bfae0acfa | ||
|
|
b7bdb5a06e | ||
|
|
a233d603e3 | ||
|
|
1005d1ad64 | ||
|
|
c22e2bcdf5 | ||
|
|
bf96f7d611 | ||
|
|
a120f428ff | ||
|
|
d3fadd54c7 | ||
|
|
d65c35a69d | ||
|
|
f714b58300 | ||
|
|
e87e7db0e9 | ||
|
|
cc9837dc23 | ||
|
|
43dcc4809f | ||
|
|
620b538f34 | ||
|
|
2ee17b3be6 | ||
|
|
69160c329a | ||
|
|
3071700635 | ||
|
|
075cd9ce69 | ||
|
|
2ba5656606 | ||
|
|
d82df60392 | ||
|
|
c9c0198467 | ||
|
|
6dcebb4644 | ||
|
|
28497ec3a9 | ||
|
|
78fc26456a | ||
|
|
55929b2713 | ||
|
|
b6bef9a056 | ||
|
|
59c98d61cf | ||
|
|
733ba775b0 | ||
|
|
b71ef1176c | ||
|
|
8016665639 | ||
|
|
bf4a8bfd5a | ||
|
|
789d06b573 | ||
|
|
9eaede84b2 | ||
|
|
18b9f08336 | ||
|
|
e3f4474dd7 | ||
|
|
c5c69f0ee1 | ||
|
|
74d51815a5 | ||
|
|
43d16b9966 | ||
|
|
2bccea9b5d | ||
|
|
05f2565dac | ||
|
|
57e476c214 | ||
|
|
48c9420136 | ||
|
|
a3210ce7b6 | ||
|
|
409da304b4 | ||
|
|
8ce612e3a6 | ||
|
|
f44ae4efe0 | ||
|
|
9ea98e2e81 | ||
|
|
fb1eaa611e | ||
|
|
e1a49790cb | ||
|
|
048b9dc286 | ||
|
|
cfd71a6b54 | ||
|
|
0ce1af78b2 | ||
|
|
3a8560ac58 | ||
|
|
6cc1d8c34a | ||
|
|
10cd4c6cfb | ||
|
|
2a6f35a91e | ||
|
|
d477ee6557 | ||
|
|
4ec0edafd8 | ||
|
|
2192f41442 | ||
|
|
8fded9837e | ||
|
|
6fabdd2fab | ||
|
|
997220d3a5 | ||
|
|
21efb8a0e8 | ||
|
|
1e0ae6bd35 | ||
|
|
b25db7ff5d | ||
|
|
a6f711fbbc | ||
|
|
12e9235bfd | ||
|
|
43eaec0aee | ||
|
|
089f9b0027 | ||
|
|
671b12da9a | ||
|
|
e620b5bf50 | ||
|
|
1792fb9e1b | ||
|
|
c32844dfec | ||
|
|
4e9aa671a7 | ||
|
|
61e1f46626 | ||
|
|
f8e5b8dbec | ||
|
|
503fe3da67 | ||
|
|
0f591e1283 | ||
|
|
21192f55f4 | ||
|
|
aa1d83cf68 | ||
|
|
feb7688d07 | ||
|
|
5e0bf55972 | ||
|
|
c9bede82b6 | ||
|
|
fa08586a94 | ||
|
|
bbe2861fa1 | ||
|
|
bb5c473633 | ||
|
|
4724e18b63 | ||
|
|
d9a43db019 | ||
|
|
ce7ba53224 | ||
|
|
154d9b8295 | ||
|
|
8f1e8f62fb | ||
|
|
ee46c28669 | ||
|
|
38f966092e | ||
|
|
99a9445acb |
44
.github/ISSUE_TEMPLATE.md
vendored
Normal file
44
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
### Issue
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Please describe the issue here.
|
||||||
|
|
||||||
|
If you are not using jedi-vim from Git (but e.g. from a distribution's package,
|
||||||
|
please try it with jedi-vim's Git master, too).
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Steps to reproduce
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Include if relevant.
|
||||||
|
|
||||||
|
Please provide steps to reproduce it here, preferably based on a minimal Vim
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
You can use the following template (save it as `minimal.vimrc` in the directory
|
||||||
|
where jedi-vim is installed, `cd` into that directory, and run Vim with
|
||||||
|
`vim -u minimal.vimrc`):
|
||||||
|
|
||||||
|
```
|
||||||
|
set nocompatible
|
||||||
|
|
||||||
|
let script_dir = fnamemodify(expand('<sfile>'), ':h')
|
||||||
|
let &runtimepath .= ','.script_dir.','.script_dir.'/after'
|
||||||
|
|
||||||
|
" Put your config changes here.
|
||||||
|
" let g:jedi#show_call_signatures=1
|
||||||
|
|
||||||
|
syntax on
|
||||||
|
filetype plugin indent on
|
||||||
|
```
|
||||||
|
|
||||||
|
Please provide the `minimal.vimrc` you have used here, too.
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Output of “:verbose JediDebugInfo”
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Please execute `:redir @+> | silent verb JediDebugInfo | redir END` in a
|
||||||
|
Python buffer to copy debug information into your clipboard.
|
||||||
|
Then paste it here.
|
||||||
|
-->
|
||||||
5
.gitmodules
vendored
5
.gitmodules
vendored
@@ -1,3 +1,6 @@
|
|||||||
[submodule "jedi"]
|
[submodule "jedi"]
|
||||||
path = jedi
|
path = pythonx/jedi
|
||||||
url = https://github.com/davidhalter/jedi.git
|
url = https://github.com/davidhalter/jedi.git
|
||||||
|
[submodule "pythonx/parso"]
|
||||||
|
path = pythonx/parso
|
||||||
|
url = https://github.com/davidhalter/parso.git
|
||||||
|
|||||||
15
.travis.yml
15
.travis.yml
@@ -1,6 +1,15 @@
|
|||||||
|
sudo: false
|
||||||
language: python
|
language: python
|
||||||
|
python: 3.6
|
||||||
|
env:
|
||||||
|
matrix:
|
||||||
|
- ENV=test
|
||||||
|
- ENV=check
|
||||||
install:
|
install:
|
||||||
- pip install --quiet --use-mirrors pytest
|
- |
|
||||||
|
if [ "$ENV" = "test" ]; then
|
||||||
|
python3.6 -m pip install pytest
|
||||||
|
fi
|
||||||
script:
|
script:
|
||||||
- vim --version
|
- vim --version
|
||||||
- py.test
|
- make "$ENV"
|
||||||
|
|||||||
12
AUTHORS.txt
12
AUTHORS.txt
@@ -40,6 +40,16 @@ Justin M. Keyes (@justinmk)
|
|||||||
nagev (@np1)
|
nagev (@np1)
|
||||||
Chris Lasher (@gotgenes) <chris.lasher@gmail.com>
|
Chris Lasher (@gotgenes) <chris.lasher@gmail.com>
|
||||||
Doan Thanh Nam (@tndoan)
|
Doan Thanh Nam (@tndoan)
|
||||||
|
Markus Koller (@toupeira)
|
||||||
|
Justin Cheevers @justincheevers
|
||||||
|
Talha Ahmed (@talha81) <talha.ahmed@gmail.com>
|
||||||
|
Matthew Tylee Atkinson (@matatk)
|
||||||
|
Pedro Ferrari (@petobens)
|
||||||
|
Daniel Hahler (@blueyed)
|
||||||
|
Dave Honneffer (@pearofducks)
|
||||||
|
Bagrat Aznauryan (@n9code)
|
||||||
|
Tomoyuki Kashiro (@kashiro)
|
||||||
|
Tommy Allen (@tweekmonster)
|
||||||
|
Mingliang (@Aulddays)
|
||||||
|
|
||||||
@something are github user names.
|
@something are github user names.
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
Pull Requests are great (on the **dev** branch)!
|
# We <3 pull requests!
|
||||||
|
|
||||||
1. Fork the Repo on github.
|
1. Fork the Repo on github.
|
||||||
2. Add yourself to AUTHORS.txt
|
2. Add yourself to AUTHORS.txt
|
||||||
3. Add a test if possible.
|
3. Add a test if possible.
|
||||||
4. Push to your fork and submit a **pull request to the dev branch**.
|
4. Push to your fork and submit a pull request.
|
||||||
|
|
||||||
My **master** branch is a 100% stable (should be). I only push to it after I am
|
Please use PEP8 as a Python code style. For VIM, just try to style your
|
||||||
certain that things are working out. Many people are using Jedi directly from
|
code similar to the jedi-vim code that is already there.
|
||||||
the github master branch.
|
|
||||||
|
|
||||||
Please use Pep8 to style your code.
|
# Bug reports
|
||||||
|
Please include the output of `:version` and `:JediDebugInfo`.
|
||||||
|
|||||||
16
Makefile
Normal file
16
Makefile
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
test:
|
||||||
|
py.test
|
||||||
|
|
||||||
|
build:
|
||||||
|
mkdir $@
|
||||||
|
build/vint: | build
|
||||||
|
virtualenv $@
|
||||||
|
$@/bin/pip install vim-vint
|
||||||
|
check: LINT_FILES:=after autoload ftplugin plugin
|
||||||
|
check: build/vint
|
||||||
|
build/vint/bin/vint $(LINT_FILES)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf .cache build
|
||||||
|
|
||||||
|
.PHONY: test check clean
|
||||||
128
README.rst
128
README.rst
@@ -2,11 +2,11 @@
|
|||||||
jedi-vim - awesome Python autocompletion with VIM
|
jedi-vim - awesome Python autocompletion with VIM
|
||||||
#################################################
|
#################################################
|
||||||
|
|
||||||
.. image:: https://travis-ci.org/davidhalter/jedi-vim.png?branch=master
|
.. image:: https://travis-ci.org/davidhalter/jedi-vim.svg?branch=master
|
||||||
:target: https://travis-ci.org/davidhalter/jedi-vim
|
:target: https://travis-ci.org/davidhalter/jedi-vim
|
||||||
:alt: Travis-CI build status
|
:alt: Travis-CI build status
|
||||||
|
|
||||||
jedi-vim is a is a VIM binding to the autocompletion library
|
jedi-vim is a VIM binding to the autocompletion library
|
||||||
`Jedi <http://github.com/davidhalter/jedi>`_.
|
`Jedi <http://github.com/davidhalter/jedi>`_.
|
||||||
|
|
||||||
Here are some pictures:
|
Here are some pictures:
|
||||||
@@ -32,9 +32,13 @@ Documentation
|
|||||||
=============
|
=============
|
||||||
|
|
||||||
Documentation is available in your vim: ``:help jedi-vim``. You can also look
|
Documentation is available in your vim: ``:help jedi-vim``. You can also look
|
||||||
it up `on github <http://github.com/davidhalter/jedi-vim>`_.
|
it up `on github <http://github.com/davidhalter/jedi-vim/blob/master/doc/jedi-vim.txt>`_.
|
||||||
|
|
||||||
You can read the Jedi library documentation `here <http://jedi.jedidjah.ch>`_.
|
You can read the Jedi library documentation `here <http://jedi.readthedocs.io/en/latest/>`_.
|
||||||
|
|
||||||
|
If you want to report issues, just use the github issue tracker. In case of
|
||||||
|
questions about the software, please use `stackoverflow
|
||||||
|
<https://stackoverflow.com/questions/tagged/jedi-vim>`_ and tag your question with ``jedi-vim``.
|
||||||
|
|
||||||
|
|
||||||
Contributing
|
Contributing
|
||||||
@@ -64,25 +68,66 @@ Apart from that, jedi-vim supports the following commands
|
|||||||
Installation
|
Installation
|
||||||
============
|
============
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
You need a VIM version that was compiled with Python 2.6 or later
|
||||||
|
(``+python`` or ``+python3``), which is typical for most distributions on
|
||||||
|
Linux. You can check this from within VIM using
|
||||||
|
``:python3 import sys; print(sys.version)`` (use ``:python`` for Python 2).
|
||||||
|
|
||||||
|
Manual installation
|
||||||
|
-------------------
|
||||||
|
|
||||||
You might want to use `pathogen <https://github.com/tpope/vim-pathogen>`_ or
|
You might want to use `pathogen <https://github.com/tpope/vim-pathogen>`_ or
|
||||||
`vundle <https://github.com/gmarik/vundle>`_ to install jedi in VIM. Also you
|
`Vundle <https://github.com/gmarik/vundle>`_ to install jedi-vim.
|
||||||
need a VIM version that was compiled with ``+python``, which is typical for most
|
|
||||||
distributions on Linux.
|
|
||||||
|
|
||||||
The first thing you need after that is an up-to-date version of Jedi. You can
|
The first thing you need after that is an up-to-date version of Jedi. You can
|
||||||
either get it via ``pip install jedi`` or with ``git submodule update --init``
|
either install it via ``pip install jedi`` or with
|
||||||
in your jedi-vim repository.
|
``git submodule update --init`` in your jedi-vim repository.
|
||||||
|
|
||||||
On Arch Linux, you can also install jedi-vim from AUR: `vim-jedi
|
Example installation command using Pathogen:
|
||||||
<https://aur.archlinux.org/packages/vim-jedi/>`__.
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
git clone --recursive https://github.com/davidhalter/jedi-vim.git ~/.vim/bundle/jedi-vim
|
||||||
|
|
||||||
|
Example installation using Vundle:
|
||||||
|
|
||||||
|
Add the following line in your `~/.vimrc`
|
||||||
|
|
||||||
|
.. code-block:: vim
|
||||||
|
|
||||||
|
Plugin 'davidhalter/jedi-vim'
|
||||||
|
|
||||||
|
|
||||||
|
Installation with your distribution
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
On Arch Linux, you can also install jedi-vim from official repositories as
|
||||||
|
`vim-jedi <https://www.archlinux.org/packages/community/any/vim-jedi/>`__.
|
||||||
|
It is also available on
|
||||||
|
`Debian (≥8) <https://packages.debian.org/vim-python-jedi>`__ and
|
||||||
|
`Ubuntu (≥14.04) <http://packages.ubuntu.com/vim-python-jedi>`__ as
|
||||||
|
vim-python-jedi.
|
||||||
|
On Fedora Linux, it is available as
|
||||||
|
`vim-jedi <https://apps.fedoraproject.org/packages/vim-jedi>`__.
|
||||||
|
|
||||||
|
Please note that this version might be quite old compared to using jedi-vim
|
||||||
|
from Git.
|
||||||
|
|
||||||
|
Caveats
|
||||||
|
-------
|
||||||
|
|
||||||
Note that the `python-mode <https://github.com/klen/python-mode>`_ VIM plugin seems
|
Note that the `python-mode <https://github.com/klen/python-mode>`_ VIM plugin seems
|
||||||
to conflict with jedi-vim, therefore you should disable it before enabling
|
to conflict with jedi-vim, therefore you should disable it before enabling
|
||||||
jedi-vim.
|
jedi-vim.
|
||||||
|
|
||||||
To enjoy the full features of Jedi-Vim, you should have VIM >= 7.3. For older
|
To enjoy the full features of jedi-vim, you should have VIM >= 7.3, compiled with
|
||||||
version of VIM, the parameter recommendation list maybe not appeared when you type
|
``+conceal`` (which is not the case on some platforms, including OS X). If your VIM
|
||||||
open bracket after the function name.
|
does not meet these requirements, the parameter recommendation list may not appear
|
||||||
|
when you type an open bracket after a function name. Please read
|
||||||
|
`the documentation <http://github.com/davidhalter/jedi-vim/blob/master/doc/jedi-vim.txt>`_
|
||||||
|
for details.
|
||||||
|
|
||||||
|
|
||||||
Settings
|
Settings
|
||||||
@@ -96,19 +141,18 @@ you disable the auto-initialization in your ``.vimrc``:
|
|||||||
let g:jedi#auto_initialization = 0
|
let g:jedi#auto_initialization = 0
|
||||||
|
|
||||||
There are also some VIM options (like ``completeopt`` and key defaults) which
|
There are also some VIM options (like ``completeopt`` and key defaults) which
|
||||||
are automatically initialized, but you can change all of them:
|
are automatically initialized, but you can skip this:
|
||||||
|
|
||||||
.. code-block:: vim
|
.. code-block:: vim
|
||||||
|
|
||||||
let g:jedi#auto_vim_configuration = 0
|
let g:jedi#auto_vim_configuration = 0
|
||||||
|
|
||||||
|
|
||||||
If you are a person who likes to use VIM-buffers not tabs, you might want to
|
You can make jedi-vim use tabs when going to a definition etc:
|
||||||
put that in your ``.vimrc``:
|
|
||||||
|
|
||||||
.. code-block:: vim
|
.. code-block:: vim
|
||||||
|
|
||||||
let g:jedi#use_tabs_not_buffers = 0
|
let g:jedi#use_tabs_not_buffers = 1
|
||||||
|
|
||||||
If you are a person who likes to use VIM-splits, you might want to put this in your ``.vimrc``:
|
If you are a person who likes to use VIM-splits, you might want to put this in your ``.vimrc``:
|
||||||
|
|
||||||
@@ -116,7 +160,7 @@ If you are a person who likes to use VIM-splits, you might want to put this in y
|
|||||||
|
|
||||||
let g:jedi#use_splits_not_buffers = "left"
|
let g:jedi#use_splits_not_buffers = "left"
|
||||||
|
|
||||||
This options could be "left", "right", "top" or "bottom". It will decide the direction where the split open.
|
This options could be "left", "right", "top", "bottom" or "winwidth". It will decide the direction where the split open.
|
||||||
|
|
||||||
Jedi automatically starts the completion, if you type a dot, e.g. ``str.``, if
|
Jedi automatically starts the completion, if you type a dot, e.g. ``str.``, if
|
||||||
you don't want this:
|
you don't want this:
|
||||||
@@ -132,18 +176,30 @@ and usually saves one keypress.
|
|||||||
|
|
||||||
let g:jedi#popup_select_first = 0
|
let g:jedi#popup_select_first = 0
|
||||||
|
|
||||||
|
Jedi displays function call signatures in insert mode in real-time, highlighting
|
||||||
|
the current argument. The call signatures can be displayed as a pop-up in the
|
||||||
|
buffer (set to 1, the default), which has the advantage of being easier to refer
|
||||||
|
to, or in Vim's command line aligned with the function call (set to 2), which
|
||||||
|
can improve the integrity of Vim's undo history.
|
||||||
|
|
||||||
|
.. code-block:: vim
|
||||||
|
|
||||||
|
let g:jedi#show_call_signatures = "1"
|
||||||
|
|
||||||
Here are a few more defaults for actions, read the docs (``:help jedi-vim``) to
|
Here are a few more defaults for actions, read the docs (``:help jedi-vim``) to
|
||||||
get more information. If you set them to ``""``, they are not assigned.
|
get more information. If you set them to ``""``, they are not assigned.
|
||||||
|
|
||||||
.. code-block:: vim
|
.. code-block:: vim
|
||||||
|
|
||||||
|
NOTE: subject to change!
|
||||||
|
|
||||||
|
let g:jedi#goto_command = "<leader>d"
|
||||||
let g:jedi#goto_assignments_command = "<leader>g"
|
let g:jedi#goto_assignments_command = "<leader>g"
|
||||||
let g:jedi#goto_definitions_command = "<leader>d"
|
let g:jedi#goto_definitions_command = ""
|
||||||
let g:jedi#documentation_command = "K"
|
let g:jedi#documentation_command = "K"
|
||||||
let g:jedi#usages_command = "<leader>n"
|
let g:jedi#usages_command = "<leader>n"
|
||||||
let g:jedi#completions_command = "<C-Space>"
|
let g:jedi#completions_command = "<C-Space>"
|
||||||
let g:jedi#rename_command = "<leader>r"
|
let g:jedi#rename_command = "<leader>r"
|
||||||
let g:jedi#show_call_signatures = "1"
|
|
||||||
|
|
||||||
|
|
||||||
Finally, if you don't want completion, but all the other features, use:
|
Finally, if you don't want completion, but all the other features, use:
|
||||||
@@ -169,20 +225,34 @@ This depends on the ``completeopt`` option. Jedi initializes it in its
|
|||||||
I want <Tab> to do autocompletion
|
I want <Tab> to do autocompletion
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
Don't even think about changing the Jedi command to ``<Tab>``,
|
Don't even think about changing the Jedi command to ``<Tab>``,
|
||||||
use `supertab <https://github.com/ervandew/supertab>`_!
|
use `supertab <https://github.com/ervandew/supertab>`_!
|
||||||
|
|
||||||
|
|
||||||
The completion is waaay too slow!
|
The completion is too slow!
|
||||||
---------------------------------
|
---------------------------
|
||||||
|
|
||||||
Completion of complex libraries (like Numpy) should only be slow the first time
|
1. Completion of complex libraries (like Numpy) should only be slow the first
|
||||||
you complete it. After that, the results should be cached and very fast.
|
time you complete them. After that the results should be cached and very fast.
|
||||||
|
|
||||||
If it's still slow, in case you've installed the python-mode VIM plugin, disable
|
2. If it is still slow after the initial completion and you have installed the
|
||||||
it. It seems to conflict with jedi-vim. See issue `#163
|
python-mode Vim plugin, try disabling its rope mode:
|
||||||
<https://github.com/davidhalter/jedi-vim/issues/163>`__.
|
|
||||||
|
|
||||||
|
.. code-block:: vim
|
||||||
|
|
||||||
|
let g:pymode_rope = 0
|
||||||
|
|
||||||
|
See issue `#163 <https://github.com/davidhalter/jedi-vim/issues/163>`__.
|
||||||
|
|
||||||
|
3. You can also use `deoplete-jedi <https://github.com/zchee/deoplete-jedi>`__
|
||||||
|
for completions, which uses Jedi, but does completions asynchronously
|
||||||
|
(requires Neovim).
|
||||||
|
It makes sense to use both jedi-vim and deoplete-jedi, but you should disable
|
||||||
|
jedi-vim's completions then:
|
||||||
|
|
||||||
|
.. code-block:: vim
|
||||||
|
|
||||||
|
let g:jedi#completions_enabled = 0
|
||||||
|
|
||||||
Testing
|
Testing
|
||||||
=======
|
=======
|
||||||
|
|||||||
@@ -1,16 +1,3 @@
|
|||||||
if g:jedi#auto_initialization
|
if jedi#init_python() && g:jedi#auto_initialization && g:jedi#completions_enabled
|
||||||
if g:jedi#completions_enabled
|
call jedi#setup_completion()
|
||||||
" We need our own omnifunc, so this overrides the omnifunc set by
|
|
||||||
" $VIMRUNTIME/ftplugin/python.vim.
|
|
||||||
setlocal omnifunc=jedi#completions
|
|
||||||
|
|
||||||
" map ctrl+space for autocompletion
|
|
||||||
if g:jedi#completions_command == "<C-Space>"
|
|
||||||
" in terminals, <C-Space> sometimes equals <Nul>
|
|
||||||
inoremap <expr> <Nul> jedi#complete_string(0)
|
|
||||||
endif
|
|
||||||
if g:jedi#completions_command != ""
|
|
||||||
execute "inoremap <expr> <buffer> ".g:jedi#completions_command." jedi#complete_string(0)"
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -1,40 +1,32 @@
|
|||||||
if g:jedi#show_call_signatures == 1 && has('conceal')
|
if !jedi#init_python()
|
||||||
" conceal is normal for vim >= 7.3
|
finish
|
||||||
|
endif
|
||||||
let e = g:jedi#call_signature_escape
|
|
||||||
let l1 = e.'jedi=[^'.e.']*'.e.'[^'.e.']*'.e.'jedi'.e
|
if g:jedi#show_call_signatures > 0 && has('conceal')
|
||||||
let l2 = e.'jedi=\?[^'.e.']*'.e
|
" +conceal is the default for vim >= 7.3
|
||||||
exe 'syn match jediIgnore "'.l2.'" contained conceal'
|
|
||||||
|
let s:e = g:jedi#call_signature_escape
|
||||||
|
let s:full = s:e.'jedi=.\{-}'.s:e.'.\{-}'.s:e.'jedi'.s:e
|
||||||
|
let s:ignore = s:e.'jedi.\{-}'.s:e
|
||||||
|
exe 'syn match jediIgnore "'.s:ignore.'" contained conceal'
|
||||||
setlocal conceallevel=2
|
setlocal conceallevel=2
|
||||||
syn match jediFatSymbol "*" contained conceal
|
syn match jediFatSymbol "\*_\*" contained conceal
|
||||||
syn match jediFat "\*[^*]\+\*" contained contains=jediFatSymbol
|
syn match jediFat "\*_\*.\{-}\*_\*" contained contains=jediFatSymbol
|
||||||
syn match jediSpace "\v[ ]+( )@=" contained
|
syn match jediSpace "\v[ ]+( )@=" contained
|
||||||
exe 'syn match jediFunction "'.l1.'" keepend extend contains=jediIgnore,jediFat,jediSpace'
|
exe 'syn match jediFunction "'.s:full.'" keepend extend '
|
||||||
|
\ .' contains=jediIgnore,jediFat,jediSpace'
|
||||||
|
\ .' containedin=pythonComment,pythonString,pythonRawString'
|
||||||
|
unlet! s:e s:full s:ignore
|
||||||
|
|
||||||
hi def link jediIgnore Ignore
|
hi def link jediIgnore Ignore
|
||||||
hi def link jediFatSymbol Ignore
|
hi def link jediFatSymbol Ignore
|
||||||
hi def link jediSpace Normal
|
hi def link jediSpace Normal
|
||||||
|
|
||||||
if exists('g:colors_name')
|
if exists('g:colors_name')
|
||||||
hi def link jediFunction CursorLine
|
hi def link jediFunction CursorLine
|
||||||
hi def link jediFat TabLine
|
hi def link jediFat TabLine
|
||||||
else
|
else
|
||||||
hi jediFunction term=NONE cterm=NONE ctermfg=6 guifg=Black gui=NONE ctermbg=0 guibg=Grey
|
hi jediFunction term=NONE cterm=NONE ctermfg=6 guifg=Black gui=NONE ctermbg=0 guibg=Grey
|
||||||
hi jediFat term=bold,underline cterm=bold,underline gui=bold,underline ctermbg=0 guibg=#555555
|
hi jediFat term=bold,underline cterm=bold,underline gui=bold,underline ctermbg=0 guibg=#555555
|
||||||
end
|
endif
|
||||||
|
|
||||||
" override defaults (add jediFunction to contains)
|
|
||||||
syn match pythonComment "#.*$" contains=pythonTodo,@Spell,jediFunction
|
|
||||||
syn region pythonString
|
|
||||||
\ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
|
|
||||||
\ contains=pythonEscape,@Spell,jediFunction
|
|
||||||
syn region pythonString
|
|
||||||
\ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
|
|
||||||
\ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell,jediFunction
|
|
||||||
syn region pythonRawString
|
|
||||||
\ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
|
|
||||||
\ contains=@Spell,jediFunction
|
|
||||||
syn region pythonRawString
|
|
||||||
\ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend
|
|
||||||
\ contains=pythonSpaceError,pythonDoctest,@Spell,jediFunction
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
4
autoload/health/jedi.vim
Normal file
4
autoload/health/jedi.vim
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
function! health#jedi#check() abort
|
||||||
|
call health#report_start('jedi')
|
||||||
|
silent call jedi#debug_info()
|
||||||
|
endfunction
|
||||||
@@ -1,159 +1,277 @@
|
|||||||
|
scriptencoding utf-8
|
||||||
|
|
||||||
" ------------------------------------------------------------------------
|
" ------------------------------------------------------------------------
|
||||||
" functions that call python code
|
" Settings initialization
|
||||||
" ------------------------------------------------------------------------
|
" ------------------------------------------------------------------------
|
||||||
function! jedi#goto_assignments()
|
let s:deprecations = {
|
||||||
Python jedi_vim.goto()
|
\ 'get_definition_command': 'goto_definitions_command',
|
||||||
endfunction
|
\ 'pydoc': 'documentation_command',
|
||||||
|
\ 'related_names_command': 'usages_command',
|
||||||
|
\ 'autocompletion_command': 'completions_command',
|
||||||
|
\ 'show_function_definition': 'show_call_signatures',
|
||||||
|
\ }
|
||||||
|
|
||||||
function! jedi#goto_definitions()
|
let s:default_settings = {
|
||||||
Python jedi_vim.goto(is_definition=True)
|
\ 'use_tabs_not_buffers': 0,
|
||||||
endfunction
|
\ 'use_splits_not_buffers': 1,
|
||||||
|
\ 'auto_initialization': 1,
|
||||||
|
\ 'auto_vim_configuration': 1,
|
||||||
|
\ 'goto_command': "'<leader>d'",
|
||||||
|
\ 'goto_assignments_command': "'<leader>g'",
|
||||||
|
\ 'goto_definitions_command': "''",
|
||||||
|
\ 'completions_command': "'<C-Space>'",
|
||||||
|
\ 'call_signatures_command': "'<leader>n'",
|
||||||
|
\ 'usages_command': "'<leader>n'",
|
||||||
|
\ 'rename_command': "'<leader>r'",
|
||||||
|
\ 'completions_enabled': 1,
|
||||||
|
\ 'popup_on_dot': 'g:jedi#completions_enabled',
|
||||||
|
\ 'documentation_command': "'K'",
|
||||||
|
\ 'show_call_signatures': 1,
|
||||||
|
\ 'show_call_signatures_delay': 500,
|
||||||
|
\ 'call_signature_escape': "'?!?'",
|
||||||
|
\ 'auto_close_doc': 1,
|
||||||
|
\ 'max_doc_height': 30,
|
||||||
|
\ 'popup_select_first': 1,
|
||||||
|
\ 'quickfix_window_height': 10,
|
||||||
|
\ 'force_py_version': "'auto'",
|
||||||
|
\ 'smart_auto_mappings': 1,
|
||||||
|
\ 'use_tag_stack': 1
|
||||||
|
\ }
|
||||||
|
|
||||||
function! jedi#usages()
|
for [s:key, s:val] in items(s:deprecations)
|
||||||
Python jedi_vim.goto(is_related_name=True)
|
if exists('g:jedi#'.s:key)
|
||||||
endfunction
|
echom "'g:jedi#".s:key."' is deprecated. Please use 'g:jedi#".s:val."' instead. Sorry for the inconvenience."
|
||||||
|
exe 'let g:jedi#'.s:val.' = g:jedi#'.s:key
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
function! jedi#rename(...)
|
for [s:key, s:val] in items(s:default_settings)
|
||||||
Python jedi_vim.rename()
|
if !exists('g:jedi#'.s:key)
|
||||||
endfunction
|
exe 'let g:jedi#'.s:key.' = '.s:val
|
||||||
|
endif
|
||||||
function! jedi#completions(findstart, base)
|
endfor
|
||||||
Python jedi_vim.completions()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! jedi#enable_speed_debugging()
|
|
||||||
Python jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout, speed=True, warnings=False, notices=False)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! jedi#enable_debugging()
|
|
||||||
Python jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! jedi#disable_debugging()
|
|
||||||
Python jedi_vim.jedi.set_debug_function(None)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! jedi#py_import(args)
|
|
||||||
Python jedi_vim.py_import()
|
|
||||||
endfun
|
|
||||||
|
|
||||||
function! jedi#py_import_completions(argl, cmdl, pos)
|
|
||||||
Python jedi_vim.py_import_completions()
|
|
||||||
endfun
|
|
||||||
|
|
||||||
|
|
||||||
" ------------------------------------------------------------------------
|
" ------------------------------------------------------------------------
|
||||||
" show_documentation
|
" Python initialization
|
||||||
" ------------------------------------------------------------------------
|
" ------------------------------------------------------------------------
|
||||||
function! jedi#show_documentation()
|
let s:script_path = fnameescape(expand('<sfile>:p:h:h'))
|
||||||
Python jedi_vim.show_documentation()
|
|
||||||
|
|
||||||
if bufnr("__doc__") > 0
|
function! s:init_python() abort
|
||||||
" If the __doc__ buffer is open in the current window, jump to it
|
if g:jedi#force_py_version !=# 'auto'
|
||||||
silent execute "sbuffer ".bufnr("__doc__")
|
" Always use the user supplied version.
|
||||||
else
|
try
|
||||||
split '__doc__'
|
return jedi#setup_py_version(g:jedi#force_py_version)
|
||||||
|
catch
|
||||||
|
throw 'Could not setup g:jedi#force_py_version: '.v:exception
|
||||||
|
endtry
|
||||||
endif
|
endif
|
||||||
|
|
||||||
setlocal modifiable
|
" Handle "auto" version.
|
||||||
setlocal noswapfile
|
if has('nvim') || (has('python') && has('python3'))
|
||||||
setlocal buftype=nofile
|
" Neovim usually has both python providers. Skipping the `has` check
|
||||||
silent normal! ggdG
|
" avoids starting both of them.
|
||||||
silent $put=l:doc
|
|
||||||
silent normal! 1Gdd
|
|
||||||
setlocal nomodifiable
|
|
||||||
setlocal nomodified
|
|
||||||
setlocal filetype=rst
|
|
||||||
|
|
||||||
if l:doc_lines > 30 " max lines for plugin
|
" Get default python version from interpreter in $PATH.
|
||||||
let l:doc_lines = 30
|
let s:def_py = system('python -c '.shellescape('import sys; sys.stdout.write(str(sys.version_info[0]))'))
|
||||||
endif
|
if v:shell_error != 0 || !len(s:def_py)
|
||||||
execute "resize ".l:doc_lines
|
if !exists('g:jedi#squelch_py_warning')
|
||||||
|
echohl WarningMsg
|
||||||
" quit comands
|
echom 'Warning: jedi-vim failed to get Python version from sys.version_info: ' . s:def_py
|
||||||
nnoremap <buffer> q ZQ
|
echom 'Falling back to version 2.'
|
||||||
nnoremap <buffer> K ZQ
|
echohl None
|
||||||
|
|
||||||
" highlight python code within rst
|
|
||||||
unlet! b:current_syntax
|
|
||||||
syn include @rstPythonScript syntax/python.vim
|
|
||||||
" 4 spaces
|
|
||||||
syn region rstPythonRegion start=/^\v {4}/ end=/\v^( {4}|\n)@!/ contains=@rstPythonScript
|
|
||||||
" >>> python code -> (doctests)
|
|
||||||
syn region rstPythonRegion matchgroup=pythonDoctest start=/^>>>\s*/ end=/\n/ contains=@rstPythonScript
|
|
||||||
let b:current_syntax = "rst"
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" ------------------------------------------------------------------------
|
|
||||||
" helper functions
|
|
||||||
" ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
function! jedi#add_goto_window()
|
|
||||||
set lazyredraw
|
|
||||||
cclose
|
|
||||||
execute 'belowright copen '.g:jedi#quickfix_window_height
|
|
||||||
set nolazyredraw
|
|
||||||
if g:jedi#use_tabs_not_buffers == 1
|
|
||||||
map <buffer> <CR> :call jedi#goto_window_on_enter()<CR>
|
|
||||||
endif
|
|
||||||
au WinLeave <buffer> q " automatically leave, if an option is chosen
|
|
||||||
redraw!
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
function! jedi#goto_window_on_enter()
|
|
||||||
let l:list = getqflist()
|
|
||||||
let l:data = l:list[line('.') - 1]
|
|
||||||
if l:data.bufnr
|
|
||||||
" close goto_window buffer
|
|
||||||
normal ZQ
|
|
||||||
Python jedi_vim.new_buffer(vim.eval('bufname(l:data.bufnr)'))
|
|
||||||
call cursor(l:data.lnum, l:data.col)
|
|
||||||
else
|
|
||||||
echohl WarningMsg | echo "Builtin module cannot be opened." | echohl None
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
function! s:syn_stack()
|
|
||||||
if !exists("*synstack")
|
|
||||||
return []
|
|
||||||
endif
|
|
||||||
return map(synstack(line('.'), col('.') - 1), 'synIDattr(v:val, "name")')
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
|
|
||||||
function! jedi#do_popup_on_dot_in_highlight()
|
|
||||||
let highlight_groups = s:syn_stack()
|
|
||||||
for a in highlight_groups
|
|
||||||
if a == 'pythonDoctest'
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
for a in highlight_groups
|
|
||||||
for b in ['pythonString', 'pythonComment', 'pythonNumber']
|
|
||||||
if a == b
|
|
||||||
return 0
|
|
||||||
endif
|
endif
|
||||||
endfor
|
let s:def_py = 2
|
||||||
endfor
|
elseif &verbose
|
||||||
|
echom 'jedi-vim: auto-detected Python: '.s:def_py
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Make sure that the auto-detected version is available in Vim.
|
||||||
|
if !has('nvim') || has('python'.(s:def_py == 2 ? '' : s:def_py))
|
||||||
|
return jedi#setup_py_version(s:def_py)
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Add a warning in case the auto-detected version is not available,
|
||||||
|
" usually because of a missing neovim module in a VIRTUAL_ENV.
|
||||||
|
if has('nvim')
|
||||||
|
echohl WarningMsg
|
||||||
|
echom 'jedi-vim: the detected Python version ('.s:def_py.')'
|
||||||
|
\ 'is not functional.'
|
||||||
|
\ 'Is the "neovim" module installed?'
|
||||||
|
\ 'While jedi-vim will work, it might not use the'
|
||||||
|
\ 'expected Python path.'
|
||||||
|
echohl None
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has('python')
|
||||||
|
call jedi#setup_py_version(2)
|
||||||
|
elseif has('python3')
|
||||||
|
call jedi#setup_py_version(3)
|
||||||
|
else
|
||||||
|
throw 'jedi-vim requires Vim with support for Python 2 or 3.'
|
||||||
|
endif
|
||||||
return 1
|
return 1
|
||||||
endfunc
|
|
||||||
|
|
||||||
|
|
||||||
function! jedi#popup_on_dot_string()
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! jedi#configure_call_signatures()
|
function! jedi#reinit_python() abort
|
||||||
autocmd InsertLeave <buffer> Python jedi_vim.clear_call_signatures()
|
unlet! s:_init_python
|
||||||
autocmd CursorMovedI <buffer> Python jedi_vim.show_call_signatures()
|
call jedi#init_python()
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
let s:_init_python = -1
|
||||||
|
function! jedi#init_python() abort
|
||||||
|
if s:_init_python == -1
|
||||||
|
try
|
||||||
|
let s:_init_python = s:init_python()
|
||||||
|
catch
|
||||||
|
let s:_init_python = 0
|
||||||
|
if !exists('g:jedi#squelch_py_warning')
|
||||||
|
echoerr 'Error: jedi-vim failed to initialize Python: '
|
||||||
|
\ .v:exception.' (in '.v:throwpoint.')'
|
||||||
|
endif
|
||||||
|
endtry
|
||||||
|
endif
|
||||||
|
return s:_init_python
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
let s:python_version = 'null'
|
||||||
|
function! jedi#setup_py_version(py_version) abort
|
||||||
|
if a:py_version == 2
|
||||||
|
let cmd_exec = 'python'
|
||||||
|
let s:python_version = 2
|
||||||
|
elseif a:py_version == 3
|
||||||
|
let cmd_exec = 'python3'
|
||||||
|
let s:python_version = 3
|
||||||
|
else
|
||||||
|
throw 'jedi#setup_py_version: invalid py_version: '.a:py_version
|
||||||
|
endif
|
||||||
|
|
||||||
|
execute 'command! -nargs=1 PythonJedi '.cmd_exec.' <args>'
|
||||||
|
|
||||||
|
let s:init_outcome = 0
|
||||||
|
let init_lines = [
|
||||||
|
\ 'import vim',
|
||||||
|
\ 'try:',
|
||||||
|
\ ' import jedi_vim',
|
||||||
|
\ 'except Exception as exc:',
|
||||||
|
\ ' vim.command(''let s:init_outcome = "could not import jedi_vim: {0}: {1}"''.format(exc.__class__.__name__, exc))',
|
||||||
|
\ 'else:',
|
||||||
|
\ ' vim.command(''let s:init_outcome = 1'')']
|
||||||
|
try
|
||||||
|
exe 'PythonJedi exec('''.escape(join(init_lines, '\n'), "'").''')'
|
||||||
|
catch
|
||||||
|
throw printf('jedi#setup_py_version: failed to run Python for initialization: %s.', v:exception)
|
||||||
|
endtry
|
||||||
|
if s:init_outcome is 0
|
||||||
|
throw 'jedi#setup_py_version: failed to run Python for initialization.'
|
||||||
|
elseif s:init_outcome isnot 1
|
||||||
|
throw printf('jedi#setup_py_version: %s.', s:init_outcome)
|
||||||
|
endif
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! jedi#debug_info() abort
|
||||||
|
if s:python_version ==# 'null'
|
||||||
|
try
|
||||||
|
call s:init_python()
|
||||||
|
catch
|
||||||
|
echohl WarningMsg | echom v:exception | echohl None
|
||||||
|
return
|
||||||
|
endtry
|
||||||
|
endif
|
||||||
|
if &verbose
|
||||||
|
if &filetype !=# 'python'
|
||||||
|
echohl WarningMsg | echo 'You should run this in a buffer with filetype "python".' | echohl None
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
echo '#### Jedi-vim debug information'
|
||||||
|
echo 'Using Python version:' s:python_version
|
||||||
|
let pyeval = s:python_version == 3 ? 'py3eval' : 'pyeval'
|
||||||
|
let s:pythonjedi_called = 0
|
||||||
|
PythonJedi import vim; vim.command('let s:pythonjedi_called = 1')
|
||||||
|
if !s:pythonjedi_called
|
||||||
|
echohl WarningMsg
|
||||||
|
echom 'PythonJedi failed to run, likely a Python config issue.'
|
||||||
|
if exists(':CheckHealth') == 2
|
||||||
|
echom 'Try :CheckHealth for more information.'
|
||||||
|
endif
|
||||||
|
echohl None
|
||||||
|
else
|
||||||
|
PythonJedi from jedi_vim_debug import display_debug_info
|
||||||
|
PythonJedi display_debug_info()
|
||||||
|
endif
|
||||||
|
echo ' - jedi-vim git version: '
|
||||||
|
echon substitute(system('git -C '.s:script_path.' describe --tags --always --dirty'), '\v\n$', '', '')
|
||||||
|
echo ' - jedi git submodule status: '
|
||||||
|
echon substitute(system('git -C '.s:script_path.' submodule status'), '\v\n$', '', '')
|
||||||
|
echo "\n"
|
||||||
|
echo '##### Settings'
|
||||||
|
echo '```'
|
||||||
|
let jedi_settings = items(filter(copy(g:), "v:key =~# '\\v^jedi#'"))
|
||||||
|
let has_nondefault_settings = 0
|
||||||
|
for [k, V] in jedi_settings
|
||||||
|
exe 'let default = '.get(s:default_settings,
|
||||||
|
\ substitute(k, '\v^jedi#', '', ''), "'-'")
|
||||||
|
" vint: -ProhibitUsingUndeclaredVariable
|
||||||
|
if default !=# V
|
||||||
|
echo printf('g:%s = %s (default: %s)', k, string(V), string(default))
|
||||||
|
unlet! V " Fix variable type mismatch with Vim 7.3.
|
||||||
|
let has_nondefault_settings = 1
|
||||||
|
endif
|
||||||
|
" vint: +ProhibitUsingUndeclaredVariable
|
||||||
|
endfor
|
||||||
|
if has_nondefault_settings
|
||||||
|
echo "\n"
|
||||||
|
endif
|
||||||
|
verb set omnifunc? completeopt?
|
||||||
|
echo '```'
|
||||||
|
|
||||||
|
if &verbose
|
||||||
|
echo "\n"
|
||||||
|
echo '#### :version'
|
||||||
|
echo '```'
|
||||||
|
version
|
||||||
|
echo '```'
|
||||||
|
echo "\n"
|
||||||
|
echo '#### :messages'
|
||||||
|
echo '```'
|
||||||
|
messages
|
||||||
|
echo '```'
|
||||||
|
echo "\n"
|
||||||
|
echo '<details><summary>:scriptnames</summary>'
|
||||||
|
echo "\n"
|
||||||
|
echo '```'
|
||||||
|
scriptnames
|
||||||
|
echo '```'
|
||||||
|
echo '</details>'
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! jedi#force_py_version(py_version) abort
|
||||||
|
let g:jedi#force_py_version = a:py_version
|
||||||
|
return jedi#setup_py_version(a:py_version)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! jedi#force_py_version_switch() abort
|
||||||
|
if g:jedi#force_py_version == 2
|
||||||
|
call jedi#force_py_version(3)
|
||||||
|
elseif g:jedi#force_py_version == 3
|
||||||
|
call jedi#force_py_version(2)
|
||||||
|
else
|
||||||
|
throw "Don't know how to switch from ".g:jedi#force_py_version.'!'
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
" Helper function instead of `python vim.eval()`, and `.command()` because
|
" Helper function instead of `python vim.eval()`, and `.command()` because
|
||||||
" these also return error definitions.
|
" these also return error definitions.
|
||||||
function! jedi#_vim_exceptions(str, is_eval)
|
function! jedi#_vim_exceptions(str, is_eval) abort
|
||||||
let l:result = {}
|
let l:result = {}
|
||||||
try
|
try
|
||||||
if a:is_eval
|
if a:is_eval
|
||||||
@@ -169,130 +287,352 @@ function! jedi#_vim_exceptions(str, is_eval)
|
|||||||
return l:result
|
return l:result
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
call jedi#init_python() " Might throw an error.
|
||||||
|
|
||||||
function! jedi#complete_string(is_popup_on_dot)
|
" ------------------------------------------------------------------------
|
||||||
|
" functions that call python code
|
||||||
|
" ------------------------------------------------------------------------
|
||||||
|
function! jedi#goto() abort
|
||||||
|
PythonJedi jedi_vim.goto(mode="goto")
|
||||||
|
endfunction
|
||||||
|
|
||||||
if a:is_popup_on_dot && !(g:jedi#popup_on_dot && jedi#do_popup_on_dot_in_highlight())
|
function! jedi#goto_assignments() abort
|
||||||
return ''
|
PythonJedi jedi_vim.goto(mode="assignment")
|
||||||
|
endfunction
|
||||||
|
|
||||||
end
|
function! jedi#goto_definitions() abort
|
||||||
if pumvisible() && !a:is_popup_on_dot
|
PythonJedi jedi_vim.goto(mode="definition")
|
||||||
return "\<C-n>"
|
endfunction
|
||||||
|
|
||||||
|
function! jedi#usages() abort
|
||||||
|
PythonJedi jedi_vim.goto(mode="related_name")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! jedi#rename(...) abort
|
||||||
|
PythonJedi jedi_vim.rename()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! jedi#rename_visual(...) abort
|
||||||
|
PythonJedi jedi_vim.rename_visual()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! jedi#completions(findstart, base) abort
|
||||||
|
PythonJedi jedi_vim.completions()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! jedi#enable_speed_debugging() abort
|
||||||
|
PythonJedi jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout, speed=True, warnings=False, notices=False)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! jedi#enable_debugging() abort
|
||||||
|
PythonJedi jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! jedi#disable_debugging() abort
|
||||||
|
PythonJedi jedi_vim.jedi.set_debug_function(None)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! jedi#py_import(args) abort
|
||||||
|
PythonJedi jedi_vim.py_import()
|
||||||
|
endfun
|
||||||
|
|
||||||
|
function! jedi#py_import_completions(argl, cmdl, pos) abort
|
||||||
|
PythonJedi jedi_vim.py_import_completions()
|
||||||
|
endfun
|
||||||
|
|
||||||
|
function! jedi#clear_cache(bang) abort
|
||||||
|
PythonJedi jedi_vim.jedi.cache.clear_time_caches(True)
|
||||||
|
if a:bang
|
||||||
|
PythonJedi jedi_vim.jedi.parser.utils.ParserPickling.clear_cache()
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" ------------------------------------------------------------------------
|
||||||
|
" show_documentation
|
||||||
|
" ------------------------------------------------------------------------
|
||||||
|
function! jedi#show_documentation() abort
|
||||||
|
PythonJedi if jedi_vim.show_documentation() is None: vim.command('return')
|
||||||
|
|
||||||
|
let bn = bufnr('__doc__')
|
||||||
|
if bn > 0
|
||||||
|
let wi=index(tabpagebuflist(tabpagenr()), bn)
|
||||||
|
if wi >= 0
|
||||||
|
" If the __doc__ buffer is open in the current tab, jump to it
|
||||||
|
silent execute (wi+1).'wincmd w'
|
||||||
|
else
|
||||||
|
silent execute 'sbuffer '.bn
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
return "\<C-x>\<C-o>\<C-r>=jedi#complete_opened()\<CR>"
|
split __doc__
|
||||||
end
|
endif
|
||||||
|
|
||||||
|
setlocal modifiable
|
||||||
|
setlocal noswapfile
|
||||||
|
setlocal buftype=nofile
|
||||||
|
silent normal! ggdG
|
||||||
|
silent $put=l:doc
|
||||||
|
silent normal! 1Gdd
|
||||||
|
setlocal nomodifiable
|
||||||
|
setlocal nomodified
|
||||||
|
setlocal filetype=rst
|
||||||
|
setlocal foldlevel=200 " do not fold in __doc__
|
||||||
|
|
||||||
|
if l:doc_lines > g:jedi#max_doc_height " max lines for plugin
|
||||||
|
let l:doc_lines = g:jedi#max_doc_height
|
||||||
|
endif
|
||||||
|
execute 'resize '.l:doc_lines
|
||||||
|
|
||||||
|
" quit comands
|
||||||
|
nnoremap <buffer> q ZQ
|
||||||
|
execute 'nnoremap <buffer> '.g:jedi#documentation_command.' ZQ'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" ------------------------------------------------------------------------
|
||||||
|
" helper functions
|
||||||
|
" ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
function! jedi#add_goto_window(len) abort
|
||||||
|
set lazyredraw
|
||||||
|
cclose
|
||||||
|
let height = min([a:len, g:jedi#quickfix_window_height])
|
||||||
|
execute 'belowright copen '.height
|
||||||
|
set nolazyredraw
|
||||||
|
if g:jedi#use_tabs_not_buffers == 1
|
||||||
|
noremap <buffer> <CR> :call jedi#goto_window_on_enter()<CR>
|
||||||
|
endif
|
||||||
|
augroup jedi_goto_window
|
||||||
|
au!
|
||||||
|
au WinLeave <buffer> q " automatically leave, if an option is chosen
|
||||||
|
augroup END
|
||||||
|
redraw!
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! jedi#complete_opened()
|
function! jedi#goto_window_on_enter() abort
|
||||||
if pumvisible() && g:jedi#popup_select_first && stridx(&completeopt, 'longest') > -1
|
let l:list = getqflist()
|
||||||
" only go down if it is visible, user-enabled and the longest option is set
|
let l:data = l:list[line('.') - 1]
|
||||||
|
if l:data.bufnr
|
||||||
|
" close goto_window buffer
|
||||||
|
normal! ZQ
|
||||||
|
PythonJedi jedi_vim.new_buffer(vim.eval('bufname(l:data.bufnr)'))
|
||||||
|
call cursor(l:data.lnum, l:data.col)
|
||||||
|
else
|
||||||
|
echohl WarningMsg | echo 'Builtin module cannot be opened.' | echohl None
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! s:syn_stack() abort
|
||||||
|
if !exists('*synstack')
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
return map(synstack(line('.'), col('.') - 1), "synIDattr(v:val, 'name')")
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
|
function! jedi#do_popup_on_dot_in_highlight() abort
|
||||||
|
let highlight_groups = s:syn_stack()
|
||||||
|
for a in highlight_groups
|
||||||
|
if a ==# 'pythonDoctest'
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
for a in highlight_groups
|
||||||
|
for b in ['pythonString', 'pythonComment', 'pythonNumber']
|
||||||
|
if a == b
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
return 1
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
|
let s:show_call_signatures_last = [0, 0, '']
|
||||||
|
function! jedi#show_call_signatures() abort
|
||||||
|
if s:_init_python == 0
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
let [line, col] = [line('.'), col('.')]
|
||||||
|
let curline = getline(line)
|
||||||
|
let reload_signatures = 1
|
||||||
|
|
||||||
|
" Caching. On the same line only.
|
||||||
|
if line == s:show_call_signatures_last[0]
|
||||||
|
" Check if the number of commas and parenthesis before or after the
|
||||||
|
" cursor has not changed since the last call, which means that the
|
||||||
|
" argument position was not changed and we can skip repainting.
|
||||||
|
let prevcol = s:show_call_signatures_last[1]
|
||||||
|
let prevline = s:show_call_signatures_last[2]
|
||||||
|
if substitute(curline[:col-2], '[^,()]', '', 'g')
|
||||||
|
\ == substitute(prevline[:prevcol-2], '[^,()]', '', 'g')
|
||||||
|
\ && substitute(curline[(col-2):], '[^,()]', '', 'g')
|
||||||
|
\ == substitute(prevline[(prevcol-2):], '[^,()]', '', 'g')
|
||||||
|
let reload_signatures = 0
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
let s:show_call_signatures_last = [line, col, curline]
|
||||||
|
|
||||||
|
if reload_signatures
|
||||||
|
PythonJedi jedi_vim.show_call_signatures()
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! jedi#clear_call_signatures() abort
|
||||||
|
if s:_init_python == 0
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:show_call_signatures_last = [0, 0, '']
|
||||||
|
PythonJedi jedi_vim.clear_call_signatures()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! jedi#configure_call_signatures() abort
|
||||||
|
augroup jedi_call_signatures
|
||||||
|
autocmd! * <buffer>
|
||||||
|
if g:jedi#show_call_signatures == 2 " Command line call signatures
|
||||||
|
autocmd InsertEnter <buffer> let g:jedi#first_col = s:save_first_col()
|
||||||
|
endif
|
||||||
|
autocmd InsertEnter <buffer> let s:show_call_signatures_last = [0, 0, '']
|
||||||
|
autocmd InsertLeave <buffer> call jedi#clear_call_signatures()
|
||||||
|
if g:jedi#show_call_signatures_delay > 0
|
||||||
|
autocmd InsertEnter <buffer> let b:_jedi_orig_updatetime = &updatetime
|
||||||
|
\ | let &updatetime = g:jedi#show_call_signatures_delay
|
||||||
|
autocmd InsertLeave <buffer> if exists('b:_jedi_orig_updatetime')
|
||||||
|
\ | let &updatetime = b:_jedi_orig_updatetime
|
||||||
|
\ | unlet b:_jedi_orig_updatetime
|
||||||
|
\ | endif
|
||||||
|
autocmd CursorHoldI <buffer> call jedi#show_call_signatures()
|
||||||
|
else
|
||||||
|
autocmd CursorMovedI <buffer> call jedi#show_call_signatures()
|
||||||
|
endif
|
||||||
|
augroup END
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" Determine where the current window is on the screen for displaying call
|
||||||
|
" signatures in the correct column.
|
||||||
|
function! s:save_first_col() abort
|
||||||
|
if bufname('%') ==# '[Command Line]' || winnr('$') == 1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let startwin = winnr()
|
||||||
|
let winwidth = winwidth(0)
|
||||||
|
if winwidth == &columns
|
||||||
|
return 0
|
||||||
|
elseif winnr('$') == 2
|
||||||
|
return startwin == 1 ? 0 : (winwidth(1) + 1)
|
||||||
|
elseif winnr('$') == 3
|
||||||
|
if startwin == 1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let ww1 = winwidth(1)
|
||||||
|
let ww2 = winwidth(2)
|
||||||
|
let ww3 = winwidth(3)
|
||||||
|
if ww1 + ww2 + ww3 + 2 == &columns
|
||||||
|
if startwin == 2
|
||||||
|
return ww1 + 1
|
||||||
|
else
|
||||||
|
return ww1 + ww2 + 2
|
||||||
|
endif
|
||||||
|
elseif startwin == 2
|
||||||
|
if ww2 + ww3 + 1 == &columns
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return ww1 + 1
|
||||||
|
endif
|
||||||
|
else " startwin == 3
|
||||||
|
if ww2 + ww3 + 1 == &columns
|
||||||
|
return ww2 + 1
|
||||||
|
else
|
||||||
|
return ww1 + 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! jedi#complete_string(autocomplete) abort
|
||||||
|
if a:autocomplete
|
||||||
|
if !(g:jedi#popup_on_dot && jedi#do_popup_on_dot_in_highlight())
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:saved_completeopt = &completeopt
|
||||||
|
set completeopt-=longest
|
||||||
|
set completeopt+=menuone
|
||||||
|
set completeopt-=menu
|
||||||
|
if &completeopt !~# 'noinsert\|noselect'
|
||||||
|
" Patch 775 introduced noinsert and noselect, previously these
|
||||||
|
" options didn't exist. Setting them in earlier versions results in
|
||||||
|
" errors (E474).
|
||||||
|
if has('patch-7.4-775')
|
||||||
|
if g:jedi#popup_select_first
|
||||||
|
set completeopt+=noinsert
|
||||||
|
else
|
||||||
|
set completeopt+=noselect
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
" To pass the tests we use this, it seems to get the closest to
|
||||||
|
" the other options. I'm really not sure if this properly
|
||||||
|
" works, but VIM 7.4-775 is already pretty old, so it might not
|
||||||
|
" be a problem anymore in a few years.
|
||||||
|
set completeopt+=longest
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
elseif pumvisible()
|
||||||
|
return "\<C-n>"
|
||||||
|
endif
|
||||||
|
return "\<C-x>\<C-o>\<C-r>=jedi#complete_opened(".a:autocomplete.")\<CR>"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! jedi#complete_opened(autocomplete) abort
|
||||||
|
if a:autocomplete
|
||||||
|
let &completeopt = s:saved_completeopt
|
||||||
|
unlet s:saved_completeopt
|
||||||
|
elseif pumvisible() && g:jedi#popup_select_first && stridx(&completeopt, 'longest') > -1
|
||||||
return "\<Down>"
|
return "\<Down>"
|
||||||
end
|
endif
|
||||||
return ""
|
return ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! jedi#force_py_version(py_version)
|
function! jedi#smart_auto_mappings() abort
|
||||||
let g:jedi#force_py_version = a:py_version
|
" Auto put import statement after from module.name<space> and complete
|
||||||
if g:jedi#force_py_version == 2
|
if search('\m^\s*from\s\+[A-Za-z0-9._]\{1,50}\%#\s*$', 'bcn', line('.'))
|
||||||
command! -nargs=1 Python python <args>
|
" Enter character and start completion.
|
||||||
execute 'pyfile '.s:script_path.'/initialize.py'
|
return "\<space>import \<C-r>=jedi#complete_string(1)\<CR>"
|
||||||
elseif g:jedi#force_py_version == 3
|
endif
|
||||||
command! -nargs=1 Python python3 <args>
|
return "\<space>"
|
||||||
execute 'py3file '.s:script_path.'/initialize.py'
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! jedi#setup_completion() abort
|
||||||
|
" We need our own omnifunc, so this overrides the omnifunc set by
|
||||||
|
" $VIMRUNTIME/ftplugin/python.vim.
|
||||||
|
setlocal omnifunc=jedi#completions
|
||||||
|
|
||||||
|
" map ctrl+space for autocompletion
|
||||||
|
if g:jedi#completions_command ==# '<C-Space>'
|
||||||
|
" In terminals, <C-Space> sometimes equals <Nul>.
|
||||||
|
imap <buffer> <Nul> <C-Space>
|
||||||
|
smap <buffer> <Nul> <C-Space>
|
||||||
|
endif
|
||||||
|
if len(g:jedi#completions_command)
|
||||||
|
execute 'inoremap <expr> <buffer> '.g:jedi#completions_command.' jedi#complete_string(0)'
|
||||||
|
" A separate mapping for select mode: deletes and completes.
|
||||||
|
execute 'snoremap <expr> <buffer> '.g:jedi#completions_command." '\<C-g>c'.jedi#complete_string(0)"
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
"PythonJedi jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout, speed=True, warnings=False, notices=False)
|
||||||
function! jedi#force_py_version_switch()
|
"PythonJedi jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout)
|
||||||
if g:jedi#force_py_version == 2
|
|
||||||
call jedi#force_py_version(3)
|
|
||||||
elseif g:jedi#force_py_version == 3
|
|
||||||
call jedi#force_py_version(2)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
" ------------------------------------------------------------------------
|
|
||||||
" deprecations
|
|
||||||
" ------------------------------------------------------------------------
|
|
||||||
let s:deprecations = {
|
|
||||||
\ 'get_definition_command': 'goto_definitions_command',
|
|
||||||
\ 'goto_command': 'goto_assignments_command',
|
|
||||||
\ 'pydoc': 'documentation_command',
|
|
||||||
\ 'related_names_command': 'usages_command',
|
|
||||||
\ 'autocompletion_command': 'completions_command',
|
|
||||||
\ 'show_function_definition': 'show_call_signatures',
|
|
||||||
\ }
|
|
||||||
|
|
||||||
" ------------------------------------------------------------------------
|
|
||||||
" defaults for jedi-vim
|
|
||||||
" ------------------------------------------------------------------------
|
|
||||||
let s:settings = {
|
|
||||||
\ 'use_tabs_not_buffers': 1,
|
|
||||||
\ 'use_splits_not_buffers': 1,
|
|
||||||
\ 'auto_initialization': 1,
|
|
||||||
\ 'auto_vim_configuration': 1,
|
|
||||||
\ 'goto_assignments_command': "'<leader>g'",
|
|
||||||
\ 'completions_command': "'<C-Space>'",
|
|
||||||
\ 'goto_definitions_command': "'<leader>d'",
|
|
||||||
\ 'call_signatures_command': "'<leader>n'",
|
|
||||||
\ 'usages_command': "'<leader>n'",
|
|
||||||
\ 'rename_command': "'<leader>r'",
|
|
||||||
\ 'popup_on_dot': 1,
|
|
||||||
\ 'documentation_command': "'K'",
|
|
||||||
\ 'show_call_signatures': 1,
|
|
||||||
\ 'call_signature_escape': "'≡'",
|
|
||||||
\ 'auto_close_doc': 1,
|
|
||||||
\ 'popup_select_first': 1,
|
|
||||||
\ 'quickfix_window_height': 10,
|
|
||||||
\ 'completions_enabled': 1,
|
|
||||||
\ 'force_py_version': 2
|
|
||||||
\ }
|
|
||||||
|
|
||||||
|
|
||||||
function! s:init()
|
|
||||||
for [key, val] in items(s:deprecations)
|
|
||||||
if exists('g:jedi#'.key)
|
|
||||||
echom "'g:jedi#".key."' is deprecated. Please use 'g:jedi#".val."' instead. Sorry for the inconvenience."
|
|
||||||
exe 'let g:jedi#'.val.' = g:jedi#'.key
|
|
||||||
end
|
|
||||||
endfor
|
|
||||||
|
|
||||||
for [key, val] in items(s:settings)
|
|
||||||
if !exists('g:jedi#'.key)
|
|
||||||
exe 'let g:jedi#'.key.' = '.val
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
call s:init()
|
|
||||||
|
|
||||||
" ------------------------------------------------------------------------
|
|
||||||
" Python initialization
|
|
||||||
" ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
let s:script_path = fnameescape(expand('<sfile>:p:h:h'))
|
|
||||||
|
|
||||||
if has('python') && has('python3')
|
|
||||||
call jedi#force_py_version(g:jedi#force_py_version)
|
|
||||||
elseif has('python')
|
|
||||||
command! -nargs=1 Python python <args>
|
|
||||||
execute 'pyfile '.s:script_path.'/initialize.py'
|
|
||||||
elseif has('python3')
|
|
||||||
command! -nargs=1 Python python3 <args>
|
|
||||||
execute 'py3file '.s:script_path.'/initialize.py'
|
|
||||||
else
|
|
||||||
if !exists("g:jedi#squelch_py_warning")
|
|
||||||
echomsg "Error: jedi-vim requires vim compiled with +python"
|
|
||||||
endif
|
|
||||||
finish
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
"Python jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout, speed=True, warnings=False, notices=False)
|
|
||||||
"Python jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout)
|
|
||||||
|
|
||||||
" vim: set et ts=4:
|
" vim: set et ts=4:
|
||||||
|
|||||||
48
conftest.py
48
conftest.py
@@ -1,10 +1,13 @@
|
|||||||
import os
|
import os
|
||||||
import urllib
|
|
||||||
import zipfile
|
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import urllib.request
|
||||||
|
import zipfile
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
VSPEC_URL = 'https://github.com/kana/vim-vspec/archive/1.4.1.zip'
|
||||||
CACHE_FOLDER = '.cache'
|
CACHE_FOLDER = '.cache'
|
||||||
VSPEC_FOLDER = os.path.join(CACHE_FOLDER, 'vim-vspec-master')
|
VSPEC_FOLDER = os.path.join(CACHE_FOLDER, 'vim-vspec-1.4.1')
|
||||||
VSPEC_RUNNER = os.path.join(VSPEC_FOLDER, 'bin/vspec')
|
VSPEC_RUNNER = os.path.join(VSPEC_FOLDER, 'bin/vspec')
|
||||||
TEST_DIR = 'test'
|
TEST_DIR = 'test'
|
||||||
|
|
||||||
@@ -14,14 +17,29 @@ class IntegrationTestFile(object):
|
|||||||
self.path = path
|
self.path = path
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
output = subprocess.check_output([VSPEC_RUNNER, '.', VSPEC_FOLDER, self.path])
|
output = subprocess.check_output(
|
||||||
|
[VSPEC_RUNNER, '.', VSPEC_FOLDER, self.path])
|
||||||
|
had_ok = False
|
||||||
for line in output.splitlines():
|
for line in output.splitlines():
|
||||||
if line.startswith('not ok') or line.startswith('Error'):
|
if (line.startswith(b'not ok') or
|
||||||
print(output)
|
line.startswith(b'Error') or
|
||||||
assert False
|
line.startswith(b'Bail out!')):
|
||||||
|
pytest.fail("{0} failed:\n{1}".format(
|
||||||
|
self.path, output.decode('utf-8')), pytrace=False)
|
||||||
|
if not had_ok and line.startswith(b'ok'):
|
||||||
|
had_ok = True
|
||||||
|
if not had_ok:
|
||||||
|
pytest.fail("{0} failed: no 'ok' found:\n{1}".format(
|
||||||
|
self.path, output.decode('utf-8')), pytrace=False)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
name = os.path.basename(self.path)
|
||||||
|
name, _, _ = name.rpartition('.')
|
||||||
|
return name
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<%s: %s>" % (type(self), self.path)
|
return "<%s: %s>" % (type(self), self.path)
|
||||||
|
|
||||||
|
|
||||||
def pytest_configure(config):
|
def pytest_configure(config):
|
||||||
@@ -29,20 +47,19 @@ def pytest_configure(config):
|
|||||||
os.mkdir(CACHE_FOLDER)
|
os.mkdir(CACHE_FOLDER)
|
||||||
|
|
||||||
if not os.path.exists(VSPEC_FOLDER):
|
if not os.path.exists(VSPEC_FOLDER):
|
||||||
url = 'https://github.com/kana/vim-vspec/archive/master.zip'
|
name, hdrs = urllib.request.urlretrieve(VSPEC_URL)
|
||||||
name, hdrs = urllib.urlretrieve(url)
|
|
||||||
z = zipfile.ZipFile(name)
|
z = zipfile.ZipFile(name)
|
||||||
for n in z.namelist():
|
for n in z.namelist():
|
||||||
dest = os.path.join(CACHE_FOLDER, n)
|
dest = os.path.join(CACHE_FOLDER, n)
|
||||||
destdir = os.path.dirname(dest)
|
destdir = os.path.dirname(dest)
|
||||||
if not os.path.isdir(destdir):
|
if not os.path.isdir(destdir):
|
||||||
os.makedirs(destdir)
|
os.makedirs(destdir)
|
||||||
data = z.read(n)
|
data = z.read(n)
|
||||||
if not os.path.isdir(dest):
|
if not os.path.isdir(dest):
|
||||||
with open(dest, 'w') as f:
|
with open(dest, 'wb') as f:
|
||||||
f.write(data)
|
f.write(data)
|
||||||
z.close()
|
z.close()
|
||||||
os.chmod(VSPEC_RUNNER, 0777)
|
os.chmod(VSPEC_RUNNER, 0o777)
|
||||||
|
|
||||||
|
|
||||||
def pytest_generate_tests(metafunc):
|
def pytest_generate_tests(metafunc):
|
||||||
@@ -51,7 +68,8 @@ def pytest_generate_tests(metafunc):
|
|||||||
"""
|
"""
|
||||||
def collect_tests():
|
def collect_tests():
|
||||||
for f in os.listdir(TEST_DIR):
|
for f in os.listdir(TEST_DIR):
|
||||||
if f.endswith('.vim'):
|
if f.endswith('.vim') and f != 'utils.vim':
|
||||||
yield IntegrationTestFile(os.path.join(TEST_DIR, f))
|
yield IntegrationTestFile(os.path.join(TEST_DIR, f))
|
||||||
|
|
||||||
metafunc.parametrize('case', list(collect_tests()))
|
tests = list(collect_tests())
|
||||||
|
metafunc.parametrize('case', tests, ids=[test.name for test in tests])
|
||||||
|
|||||||
287
doc/jedi-vim.txt
287
doc/jedi-vim.txt
@@ -1,4 +1,4 @@
|
|||||||
*jedi-vim.txt* - For Vim version 7.3 - Last change: 2013/3/1
|
*jedi-vim.txt* - For Vim version 7.3 - Last change: 2014/07/29
|
||||||
__ _______ _______ __ ____ ____ __ .___ ___.~
|
__ _______ _______ __ ____ ____ __ .___ ___.~
|
||||||
| | | ____|| \ | | \ \ / / | | | \/ |~
|
| | | ____|| \ | | \ \ / / | | | \/ |~
|
||||||
| | | |__ | .--. || | _____\ \/ / | | | \ / |~
|
| | | |__ | .--. || | _____\ \/ / | | | \ / |~
|
||||||
@@ -9,44 +9,49 @@
|
|||||||
jedi-vim - awesome Python autocompletion with Vim
|
jedi-vim - awesome Python autocompletion with Vim
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
Contents *jedi-vim-contents*
|
Contents *jedi-vim-contents*
|
||||||
|
|
||||||
1. Introduction |jedi-vim-introduction|
|
1. Introduction |jedi-vim-introduction|
|
||||||
2. Installation |jedi-vim-installation|
|
2. Installation |jedi-vim-installation|
|
||||||
2.0. Requirements |jedi-vim-installation-requirements|
|
2.0. Requirements |jedi-vim-installation-requirements|
|
||||||
2.1. Manually |jedi-vim-installation-manually|
|
2.1. Manually |jedi-vim-installation-manually|
|
||||||
2.2. Using Pathogen |jedi-vim-installation-pathogen|
|
2.2. Using Pathogen |jedi-vim-installation-pathogen|
|
||||||
2.3. Using Vundle |jedi-vim-installation-vundle|
|
2.3. Using Vundle |jedi-vim-installation-vundle|
|
||||||
3. Supported Python features |jedi-vim-support|
|
2.4. Installing from Repositories |jedi-vim-installation-repos|
|
||||||
4. Usage |jedi-vim-usage|
|
3. Supported Python features |jedi-vim-support|
|
||||||
5. Mappings |jedi-vim-keybindings|
|
4. Usage |jedi-vim-usage|
|
||||||
5.1. Start completion |g:jedi#completions_command|
|
5. Mappings |jedi-vim-keybindings|
|
||||||
5.2. Go to assignment |g:jedi#goto_assignments_command|
|
5.1. Start completion |g:jedi#completions_command|
|
||||||
5.3. Get original definition |g:jedi#goto_definitions_command|
|
5.2. Go to definition |g:jedi#goto_command|
|
||||||
5.4. Show documentation |g:jedi#documentation_command|
|
5.3. Go to assignment |g:jedi#goto_assignments_command|
|
||||||
5.5. Rename variables |g:jedi#rename_command|
|
5.4 Go to definition (deprecated) |g:jedi#goto_definitions_command|
|
||||||
5.6. Show name usages |g:jedi#usages_command|
|
5.5. Show documentation |g:jedi#documentation_command|
|
||||||
5.7. Open module by name |:Pyimport|
|
5.6. Rename variables |g:jedi#rename_command|
|
||||||
6. Configuration |jedi-vim-configuration|
|
5.7. Show name usages |g:jedi#usages_command|
|
||||||
6.1. auto_initialization |g:jedi#auto_initialization|
|
5.8. Open module by name |:Pyimport|
|
||||||
6.2. auto_vim_configuration |g:jedi#auto_vim_configuration|
|
6. Configuration |jedi-vim-configuration|
|
||||||
6.3. popup_on_dot |g:jedi#popup_on_dot|
|
6.1. auto_initialization |g:jedi#auto_initialization|
|
||||||
6.4. popup_select_first |g:jedi#popup_select_first|
|
6.2. auto_vim_configuration |g:jedi#auto_vim_configuration|
|
||||||
6.5. auto_close_doc |g:jedi#auto_close_doc|
|
6.3. popup_on_dot |g:jedi#popup_on_dot|
|
||||||
6.6. show_call_signatures |g:jedi#show_call_signatures|
|
6.4. popup_select_first |g:jedi#popup_select_first|
|
||||||
6.7. use_tabs_not_buffers |g:jedi#use_tabs_not_buffers|
|
6.5. auto_close_doc |g:jedi#auto_close_doc|
|
||||||
6.8. squelch_py_warning |g:jedi#squelch_py_warning|
|
6.6. show_call_signatures |g:jedi#show_call_signatures|
|
||||||
6.9. completions_enable |g:jedi#completions_enable|
|
6.7. show_call_signatures_delay |g:jedi#show_call_signatures_delay|
|
||||||
6.10. use_splits_not_buffers |g:jedi#use_splits_not_buffers|
|
6.8. use_tabs_not_buffers |g:jedi#use_tabs_not_buffers|
|
||||||
6.11. force_py_version |g:jedi#force_py_version|
|
6.9. squelch_py_warning |g:jedi#squelch_py_warning|
|
||||||
7. Testing |jedi-vim-testing|
|
6.10. completions_enabled |g:jedi#completions_enabled|
|
||||||
8. Contributing |jedi-vim-contributing|
|
6.11. use_splits_not_buffers |g:jedi#use_splits_not_buffers|
|
||||||
9. License |jedi-vim-license|
|
6.12. force_py_version |g:jedi#force_py_version|
|
||||||
|
6.13. smart_auto_mappings |g:jedi#smart_auto_mappings|
|
||||||
|
6.14. use_tag_stack |g:jedi#use_tag_stack|
|
||||||
|
7. Testing |jedi-vim-testing|
|
||||||
|
8. Contributing |jedi-vim-contributing|
|
||||||
|
9. License |jedi-vim-license|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
1. Introduction *jedi-vim-introduction*
|
1. Introduction *jedi-vim-introduction*
|
||||||
|
|
||||||
Jedi-vim is a is a Vim binding to the awesome Python autocompletion library
|
Jedi-vim is a Vim binding to the awesome Python autocompletion library
|
||||||
`jedi`. Among jedi's (and, therefore, jedi-vim's) features are:
|
`jedi`. Among jedi's (and, therefore, jedi-vim's) features are:
|
||||||
|
|
||||||
- Completion for a wide array of Python features (see |jedi-vim-support|)
|
- Completion for a wide array of Python features (see |jedi-vim-support|)
|
||||||
@@ -66,10 +71,10 @@ By leveraging this library, jedi-vim adds the following capabilities to Vim:
|
|||||||
- Looking up related names
|
- Looking up related names
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
2. Installation *jedi-vim-installation*
|
2. Installation *jedi-vim-installation*
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
2.0. Requirements *jedi-vim-installation-requirements*
|
2.0. Requirements *jedi-vim-installation-requirements*
|
||||||
|
|
||||||
First of all, jedi-vim requires Vim to be compiled with the `+python` option.
|
First of all, jedi-vim requires Vim to be compiled with the `+python` option.
|
||||||
|
|
||||||
@@ -82,12 +87,25 @@ using pip: >
|
|||||||
However, you can also install it as a git submodule if you don't want to use
|
However, you can also install it as a git submodule if you don't want to use
|
||||||
jedi for anything but this plugin. How to do this is detailed below.
|
jedi for anything but this plugin. How to do this is detailed below.
|
||||||
|
|
||||||
It is the best if you have VIM >= 7.3. For the older version, you probably
|
It is best if you have VIM >= 7.3, compiled with the `+conceal` option. With
|
||||||
cannot see the parameter recommendation list of function after typing open
|
older versions, you will probably not see the parameter recommendation list
|
||||||
bracket.
|
for functions after typing the open bracket. Some platforms (including OS X
|
||||||
|
releases) do not ship a VIM with `+conceal`. You can check if your VIM has the
|
||||||
|
feature with >
|
||||||
|
|
||||||
|
:ver
|
||||||
|
|
||||||
|
and look for "`+conceal`" (as opposed to "`-conceal`") or >
|
||||||
|
|
||||||
|
:echo has('conceal')
|
||||||
|
|
||||||
|
which will report 0 (not included) or 1 (included). If your VIM lacks this
|
||||||
|
feature and you would like function parameter completion, you will need to
|
||||||
|
build your own VIM, or use a package for your operating system that has this
|
||||||
|
feature (such as MacVim on OS X, which also contains a console binary).
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
2.1. Installing manually *jedi-vim-installation-manually*
|
2.1. Installing manually *jedi-vim-installation-manually*
|
||||||
|
|
||||||
1a. Get the latest repository from Github: >
|
1a. Get the latest repository from Github: >
|
||||||
|
|
||||||
@@ -105,7 +123,7 @@ bracket.
|
|||||||
:helptags <path/to/vimruntime>/doc
|
:helptags <path/to/vimruntime>/doc
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
2.1. Installing using Pathogen *jedi-vim-installation-pathogen*
|
2.2. Installing using Pathogen *jedi-vim-installation-pathogen*
|
||||||
|
|
||||||
Pathogen simplifies installation considerably.
|
Pathogen simplifies installation considerably.
|
||||||
|
|
||||||
@@ -119,22 +137,29 @@ Pathogen simplifies installation considerably.
|
|||||||
git clone --recursive http://github.com/davidhalter/jedi-vim
|
git clone --recursive http://github.com/davidhalter/jedi-vim
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
2.3. Installing using Vundle *jedi-vim-installation-vundle*
|
2.3. Installing using Vundle *jedi-vim-installation-vundle*
|
||||||
|
|
||||||
1. Vundle automatically downloads subrepositories as git submodules, so you
|
1. Vundle automatically downloads subrepositories as git submodules, so you
|
||||||
will automatically get the jedi library with the jedi-vim plugin. Add the
|
will automatically get the jedi library with the jedi-vim plugin. Add the
|
||||||
following to the Bundles section in your .vimrc file: >
|
following to the Bundles section in your .vimrc file: >
|
||||||
|
|
||||||
Bundle 'git://github.com/davidhalter/jedi-vim'
|
Plugin 'davidhalter/jedi-vim'
|
||||||
|
|
||||||
2. Issue the following command in Vim: >
|
2. Issue the following command in Vim: >
|
||||||
|
|
||||||
:BundleInstall
|
:PluginInstall
|
||||||
|
|
||||||
Help tags are generated automatically, so you should be good to go.
|
Help tags are generated automatically, so you should be good to go.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
2.4. Installing from Repositories *jedi-vim-installation-repos*
|
||||||
|
|
||||||
|
Some Linux distributions have jedi-vim packages in their official
|
||||||
|
repositories. On Arch Linux, install vim-jedi. On Debian (8+) or Ubuntu
|
||||||
|
(14.04+) install vim-python-jedi.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
3. Supported Python features *jedi-vim-support*
|
3. Supported Python features *jedi-vim-support*
|
||||||
|
|
||||||
The Jedi library does all the hard work behind the scenes. It supports
|
The Jedi library does all the hard work behind the scenes. It supports
|
||||||
completion of a large number of Python features, among them:
|
completion of a large number of Python features, among them:
|
||||||
@@ -166,7 +191,7 @@ Note: This list is not necessarily up to date. For a complete list of
|
|||||||
features, please refer to the Jedi documentation at http://jedi.jedidjah.ch.
|
features, please refer to the Jedi documentation at http://jedi.jedidjah.ch.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
4. Usage *jedi-vim-usage*
|
4. Usage *jedi-vim-usage*
|
||||||
|
|
||||||
With the default settings, autocompletion can be triggered by typing
|
With the default settings, autocompletion can be triggered by typing
|
||||||
<Ctrl-Space>. The first entry will automatically be selected, so you can press
|
<Ctrl-Space>. The first entry will automatically be selected, so you can press
|
||||||
@@ -181,7 +206,7 @@ module's contents. Afterwards, the contents are cached and completion will be
|
|||||||
almost instantaneous.
|
almost instantaneous.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
5. Key Bindings *jedi-vim-keybindings*
|
5. Key Bindings *jedi-vim-keybindings*
|
||||||
|
|
||||||
All keybindings can be mapped by setting the appropriate global option. For
|
All keybindings can be mapped by setting the appropriate global option. For
|
||||||
example, to set the keybinding for starting omnicompletion to <C-N> instead of
|
example, to set the keybinding for starting omnicompletion to <C-N> instead of
|
||||||
@@ -202,9 +227,9 @@ Note: You can set commands to '', which means that they are empty and not
|
|||||||
assigned. It's an easy way to "disable" functionality of jedi-vim.
|
assigned. It's an easy way to "disable" functionality of jedi-vim.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
5.1. `g:jedi#completions_command` *g:jedi#completions_command*
|
5.1. `g:jedi#completions_command` *g:jedi#completions_command*
|
||||||
Function: n/a; see above
|
Function: n/a; see above
|
||||||
Default: <Ctrl-Space> Start completion
|
Default: <Ctrl-Space> Start completion
|
||||||
|
|
||||||
Performs autocompletion (or omnicompletion, to be precise).
|
Performs autocompletion (or omnicompletion, to be precise).
|
||||||
|
|
||||||
@@ -212,17 +237,15 @@ Note: If you want to use <Tab> for completion, please install Supertab:
|
|||||||
https://github.com/ervandew/supertab.
|
https://github.com/ervandew/supertab.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
5.2. `g:jedi#goto_assignments_command` *g:jedi#goto_assignments_command*
|
5.2. `g:jedi#goto_command` *g:jedi#goto_command*
|
||||||
Function: `jedi#goto_assignments()`
|
Function: `jedi#goto()`
|
||||||
Default: <leader>g Go to definition
|
Default: <leader>d Go to definition (or assignment)
|
||||||
|
|
||||||
This function finds the first definition of the function/class under the
|
This function first tries |jedi#goto_definitions|, and falls back to
|
||||||
cursor. It produces an error if the definition is not in a Python file.
|
|jedi#goto_assignments| for builtin modules. It produces an error if nothing
|
||||||
|
could be found.
|
||||||
------------------------------------------------------------------------------
|
NOTE: this implementation is subject to change.
|
||||||
5.3. `g:jedi#goto_definitions_command` *g:jedi#goto_definitions_command*
|
Ref: https://github.com/davidhalter/jedi/issues/570
|
||||||
Function: `jedi#goto_definitions()`
|
|
||||||
Default: <leader>d Go to original definition
|
|
||||||
|
|
||||||
This command tries to find the original definition of the function/class under
|
This command tries to find the original definition of the function/class under
|
||||||
the cursor. Just like the `jedi#goto_assignments()` function, it does not work
|
the cursor. Just like the `jedi#goto_assignments()` function, it does not work
|
||||||
@@ -254,17 +277,34 @@ you all the way to the >
|
|||||||
line in file3.py.
|
line in file3.py.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
5.4. `g:jedi#documentation_command` *g:jedi#documentation_command*
|
5.3. `g:jedi#goto_assignments_command` *g:jedi#goto_assignments_command*
|
||||||
Function: `jedi#show_documentation()`
|
Function: `jedi#goto_assignments()`
|
||||||
Default: <K> Show pydoc documentation
|
Default: <leader>g Go to assignment
|
||||||
|
|
||||||
This shows the pydoc documentation for the item currently under the cursor.
|
This function finds the first definition of the function/class under the
|
||||||
The documentation is opened in a horizontally split buffer.
|
cursor. It produces an error if the definition is not in a Python file.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
5.5. `g:jedi#rename_command` *g:jedi#rename_command*
|
5.4. `g:jedi#goto_definitions_command` *g:jedi#goto_definitions_command*
|
||||||
|
Function: `jedi#goto_definitions()`
|
||||||
|
Default: - Go to original definition
|
||||||
|
|
||||||
|
NOTE: Deprecated. Use |g:jedi#goto_command| / |jedi#goto()| instead, which
|
||||||
|
currently uses this internally.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
5.5. `g:jedi#documentation_command` *g:jedi#documentation_command*
|
||||||
|
Function: `jedi#show_documentation()`
|
||||||
|
Default: <K> Show pydoc documentation
|
||||||
|
|
||||||
|
This shows the pydoc documentation for the item currently under the cursor.
|
||||||
|
The documentation is opened in a horizontally split buffer. The height of this
|
||||||
|
buffer is controlled by `g:jedi#max_doc_height` (set by default to 30).
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
5.6. `g:jedi#rename_command` *g:jedi#rename_command*
|
||||||
Function: `jedi#rename()`
|
Function: `jedi#rename()`
|
||||||
Default: <leader>r Rename variables
|
Default: <leader>r Rename variables
|
||||||
|
|
||||||
Jedi-vim deletes the word currently under the cursor and puts Vim in insert
|
Jedi-vim deletes the word currently under the cursor and puts Vim in insert
|
||||||
mode, where the user is expected to enter the new variable name. Upon leaving
|
mode, where the user is expected to enter the new variable name. Upon leaving
|
||||||
@@ -273,22 +313,22 @@ with the new one. The number of performed renames is displayed in the command
|
|||||||
line.
|
line.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
5.6. `g:jedi#usages_command` *g:jedi#usages_command*
|
5.7. `g:jedi#usages_command` *g:jedi#usages_command*
|
||||||
Function: `jedi#usages()`
|
Function: `jedi#usages()`
|
||||||
Default: <leader>n Show usages of a name.
|
Default: <leader>n Show usages of a name.
|
||||||
|
|
||||||
The quickfix window is populated with a list of all names which point to the
|
The quickfix window is populated with a list of all names which point to the
|
||||||
definition of the name under the cursor.
|
definition of the name under the cursor.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
5.7. Open module by name *:Pyimport*
|
5.8. Open module by name *:Pyimport*
|
||||||
Function: `jedi#py_import(args)`
|
Function: `jedi#py_import(args)`
|
||||||
Default: :Pyimport e.g. `:Pyimport os` shows os.py in VIM.
|
Default: :Pyimport e.g. `:Pyimport os` shows os.py in VIM.
|
||||||
|
|
||||||
Simulate an import and open that module in VIM.
|
Simulate an import and open that module in VIM.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
6. Configuration *jedi-vim-configuration*
|
6. Configuration *jedi-vim-configuration*
|
||||||
|
|
||||||
Note: You currently have to set these options in your .vimrc. Setting them in
|
Note: You currently have to set these options in your .vimrc. Setting them in
|
||||||
an ftplugin (e.g. ~/.vim/ftplugin/python/jedi-vim-settings.vim) will not work
|
an ftplugin (e.g. ~/.vim/ftplugin/python/jedi-vim-settings.vim) will not work
|
||||||
@@ -296,12 +336,12 @@ because jedi-vim is not set up as an filetype plugin, but as a "regular"
|
|||||||
plugin.
|
plugin.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.1. `g:jedi#auto_initialization` *g:jedi#auto_initialization*
|
6.1. `g:jedi#auto_initialization` *g:jedi#auto_initialization*
|
||||||
|
|
||||||
Upon initialization, jedi-vim performs the following steps:
|
Upon initialization, jedi-vim performs the following steps:
|
||||||
|
|
||||||
1. Set the current buffers 'omnifunc' to its own completion function
|
1. Set the current buffers 'omnifunc' to its own completion function
|
||||||
`jedi#complete`
|
`jedi#completions`
|
||||||
2. Create mappings to commands specified in |jedi-vim-keybindings|
|
2. Create mappings to commands specified in |jedi-vim-keybindings|
|
||||||
3. Call `jedi#configure_call_signatures()` if
|
3. Call `jedi#configure_call_signatures()` if
|
||||||
`g:jedi#show_call_signatures` is set
|
`g:jedi#show_call_signatures` is set
|
||||||
@@ -313,17 +353,19 @@ Options: 0 or 1
|
|||||||
Default: 1 (Perform automatic initialization)
|
Default: 1 (Perform automatic initialization)
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.2. `g:jedi#auto_vim_configuration` *g:jedi#auto_vim_configuration*
|
6.2. `g:jedi#auto_vim_configuration` *g:jedi#auto_vim_configuration*
|
||||||
|
|
||||||
Jedi-vim sets 'completeopt' to `menuone,longest,preview` by default. It also
|
Jedi-vim sets 'completeopt' to `menuone,longest,preview` by default, if
|
||||||
remaps <Ctrl-C> to <Esc> in insert mode. If you want to keep your own
|
'completeopt' is not changed from Vim's default.
|
||||||
configuration, disable this setting.
|
It also remaps <Ctrl-C> to <Esc> in insert mode.
|
||||||
|
|
||||||
|
If you want to keep your own configuration, disable this setting.
|
||||||
|
|
||||||
Options: 0 or 1
|
Options: 0 or 1
|
||||||
Default: 1 (Set 'completeopt' and mapping as described above)
|
Default: 1 (Set 'completeopt' and mapping as described above)
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.3. `g:jedi#popup_on_dot` *g:jedi#popup_on_dot*
|
6.3. `g:jedi#popup_on_dot` *g:jedi#popup_on_dot*
|
||||||
|
|
||||||
Jedi-vim automatically starts completion upon typing a period in insert mode.
|
Jedi-vim automatically starts completion upon typing a period in insert mode.
|
||||||
|
|
||||||
@@ -331,12 +373,13 @@ However, when working with large modules, this can slow down your typing flow
|
|||||||
since you have to wait for jedi to parse the module and show the completion
|
since you have to wait for jedi to parse the module and show the completion
|
||||||
menu. By disabling this setting, completion is only started when you manually
|
menu. By disabling this setting, completion is only started when you manually
|
||||||
press the completion key.
|
press the completion key.
|
||||||
|
You need to also have `g:jedi#completions_enabled` enabled for this.
|
||||||
|
|
||||||
Options: 0 or 1
|
Options: 0 or 1
|
||||||
Default: 1 (Start completion on typing a period)
|
Default: 1 (Start completion on typing a period)
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.4. `g:jedi#popup_select_first` *g:jedi#popup_select_first*
|
6.4. `g:jedi#popup_select_first` *g:jedi#popup_select_first*
|
||||||
|
|
||||||
Upon starting completion, jedi-vim can automatically select the first entry
|
Upon starting completion, jedi-vim can automatically select the first entry
|
||||||
that pops up (without actually inserting it).
|
that pops up (without actually inserting it).
|
||||||
@@ -349,28 +392,32 @@ Options: 0 or 1
|
|||||||
Default: 1 (Automatically select first completion entry)
|
Default: 1 (Automatically select first completion entry)
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.5. `g:jedi#auto_close_doc` *g:jedi#auto_close_doc*
|
6.5. `g:jedi#auto_close_doc` *g:jedi#auto_close_doc*
|
||||||
|
|
||||||
When doing completion, jedi-vim shows the docstring of the currently selected
|
When doing completion, jedi-vim shows the docstring of the currently selected
|
||||||
item in a preview window. By default, this window is being closed after
|
item in a preview window. By default, this window is being closed after
|
||||||
insertion of a completion item.
|
insertion of a completion item.
|
||||||
|
|
||||||
Set this to 1 to leave the preview window open even after leaving insert mode.
|
Set this to 0 to leave the preview window open even after leaving insert mode.
|
||||||
This could be useful if you want to browse longer docstrings.
|
This could be useful if you want to browse longer docstrings.
|
||||||
|
|
||||||
Options: 0 or 1
|
Options: 0 or 1
|
||||||
Default: 1 (Automatically close preview window upon leaving insert mode)
|
Default: 1 (Automatically close preview window upon leaving insert mode)
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.6. `g:jedi#show_call_signatures` *g:jedi#show_call_signatures*
|
6.6. `g:jedi#show_call_signatures` *g:jedi#show_call_signatures*
|
||||||
|
|
||||||
Jedi-vim can display a small window detailing the arguments of the currently
|
Jedi-vim can display a small window detailing the arguments of the currently
|
||||||
completed function and highlighting the currently selected argument. This can
|
completed function and highlighting the currently selected argument. This can
|
||||||
be disabled by setting this option to 0.
|
be disabled by setting this option to 0. Setting this option to 2 shows call
|
||||||
|
signatures in the command line instead of a popup window.
|
||||||
|
|
||||||
Options: 0 or 1
|
Options: 0, 1, or 2
|
||||||
Default: 1 (Show call signatures window)
|
Default: 1 (Show call signatures window)
|
||||||
|
|
||||||
|
Note: 'showmode' must be disabled for command line call signatures to be
|
||||||
|
visible.
|
||||||
|
|
||||||
Note: This setting is ignored if |g:jedi#auto_initialization| is set to 0. In
|
Note: This setting is ignored if |g:jedi#auto_initialization| is set to 0. In
|
||||||
that case, if you want to see call signatures, you have to set it up
|
that case, if you want to see call signatures, you have to set it up
|
||||||
manually by calling a function in your configuration file: >
|
manually by calling a function in your configuration file: >
|
||||||
@@ -378,17 +425,27 @@ manually by calling a function in your configuration file: >
|
|||||||
call jedi#configure_call_signatures()
|
call jedi#configure_call_signatures()
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.7. `g:jedi#use_tabs_not_buffers` *g:jedi#use_tabs_not_buffers*
|
6.7. `g:jedi#show_call_signatures_delay` *g:jedi#show_call_signatures_delay*
|
||||||
|
|
||||||
By default, jedi-vim opens a new tab if you use the "go to", "show
|
The delay to be used with |g:jedi#show_call_signatures|. If it is greater
|
||||||
definition", or "related names" commands. When you set this option to 0, they
|
than 0 it will use Vim's |CursorHoldI| event instead of |CursorMovedI|.
|
||||||
open in the current buffer instead.
|
It will temporarily set Vim's |'updatetime'| option during insert mode.
|
||||||
|
|
||||||
Options: 0 or 1
|
Options: delay in milliseconds
|
||||||
Default: 1 (Command output is put in a new tab)
|
Default: 500
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.8. `g:jedi#squelch_py_warning` *g:jedi#squelch_py_warning*
|
6.8. `g:jedi#use_tabs_not_buffers` *g:jedi#use_tabs_not_buffers*
|
||||||
|
|
||||||
|
You can make jedi-vim open a new tab if you use the "go to", "show
|
||||||
|
definition", or "related names" commands. When you leave this at the default
|
||||||
|
(0), they open in the current buffer instead.
|
||||||
|
|
||||||
|
Options: 0 or 1
|
||||||
|
Default: 0 (Command output is put in a new tab)
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
6.9. `g:jedi#squelch_py_warning` *g:jedi#squelch_py_warning*
|
||||||
|
|
||||||
When Vim has not been compiled with +python, jedi-vim shows a warning to that
|
When Vim has not been compiled with +python, jedi-vim shows a warning to that
|
||||||
effect and aborts loading itself. Set this to 1 to suppress that warning.
|
effect and aborts loading itself. Set this to 1 to suppress that warning.
|
||||||
@@ -397,7 +454,7 @@ Options: 0 or 1
|
|||||||
Default: 0 (Warning is shown)
|
Default: 0 (Warning is shown)
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.9. `g:jedi#completions_enable` *g:jedi#completions_enable*
|
6.10. `g:jedi#completions_enabled` *g:jedi#completions_enabled*
|
||||||
|
|
||||||
If you don't want Jedi completion, but all the other features, you can disable
|
If you don't want Jedi completion, but all the other features, you can disable
|
||||||
it in favor of another completion engine (that probably also uses Jedi, like
|
it in favor of another completion engine (that probably also uses Jedi, like
|
||||||
@@ -407,16 +464,21 @@ Options: 0 or 1
|
|||||||
Default: 1
|
Default: 1
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.10. `g:jedi#use_splits_not_buffers` *g:jedi#use_splits_not_buffers*
|
6.11. `g:jedi#use_splits_not_buffers` *g:jedi#use_splits_not_buffers*
|
||||||
|
|
||||||
If you want to open new split for "go to", you could set this option to the
|
If you want to open new split for "go to", you could set this option to the
|
||||||
direction which you want to open a split with.
|
direction which you want to open a split with.
|
||||||
|
|
||||||
Options: top, left, right or bottom
|
Options: top, left, right, bottom or winwidth
|
||||||
Default: "" (not enabled by default)
|
Default: "" (not enabled by default)
|
||||||
|
|
||||||
|
Note: with the 'winwidth' option the window is split vertically or horizontally
|
||||||
|
depending on the width of the window relative to 'textwidth'. This essentially
|
||||||
|
means that if the window is big enough it will be split vertically but if it is
|
||||||
|
small a horizontal split happens.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
6.11. `g:jedi#force_py_version` *g:jedi#force_py_version*
|
6.12. `g:jedi#force_py_version` *g:jedi#force_py_version*
|
||||||
|
|
||||||
If you have installed both python 2 and python 3, you can force which one jedi
|
If you have installed both python 2 and python 3, you can force which one jedi
|
||||||
should use by setting this variable. It forces the internal Vim command, which
|
should use by setting this variable. It forces the internal Vim command, which
|
||||||
@@ -432,10 +494,33 @@ or set directly using this function, which has the same name as the variable:
|
|||||||
Function: `jedi#force_py_version(py_version)`
|
Function: `jedi#force_py_version(py_version)`
|
||||||
|
|
||||||
Options: 2 or 3
|
Options: 2 or 3
|
||||||
Default: 2
|
Default: "auto" (will use sys.version_info from "python" in your $PATH)
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
6.13. `g:jedi#smart_auto_mappings` *g:jedi#smart_auto_mappings*
|
||||||
|
|
||||||
|
When you start typing `from module.name<space>` jedi-vim automatically
|
||||||
|
adds the "import" statement and displays the autocomplete popup.
|
||||||
|
|
||||||
|
This option can be disabled in the .vimrc:
|
||||||
|
|
||||||
|
`let g:jedi#smart_auto_mappings = 0`
|
||||||
|
|
||||||
|
Options: 0 or 1
|
||||||
|
Default: 1 (enabled by default)
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
6.14. `g:jedi#use_tag_stack` *g:jedi#use_tag_stack*
|
||||||
|
|
||||||
|
Write results of |jedi#goto| to a temporary file and use the |:tjump| command
|
||||||
|
to enable full |tagstack| functionality. Use of the tag stack allows
|
||||||
|
returning to the usage of a function with CTRL-T after exploring the
|
||||||
|
definition with arbitrary changes to the |jumplist|.
|
||||||
|
|
||||||
|
Options: 0 or 1
|
||||||
|
Default: 1 (enabled by default)
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
7. Testing *jedi-vim-testing*
|
7. Testing *jedi-vim-testing*
|
||||||
|
|
||||||
jedi-vim is being tested with a combination of vspec
|
jedi-vim is being tested with a combination of vspec
|
||||||
https://github.com/kana/vim-vspec and py.test http://pytest.org/.
|
https://github.com/kana/vim-vspec and py.test http://pytest.org/.
|
||||||
@@ -448,13 +533,13 @@ The tests are automatically run with `travis
|
|||||||
<https://travis-ci.org/davidhalter/jedi-vim>`_.
|
<https://travis-ci.org/davidhalter/jedi-vim>`_.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
8. Contributing *jedi-vim-contributing*
|
8. Contributing *jedi-vim-contributing*
|
||||||
|
|
||||||
We love Pull Requests! Read the instructions in `CONTRIBUTING.md`.
|
We love Pull Requests! Read the instructions in `CONTRIBUTING.md`.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
9. License *jedi-vim-license*
|
9. License *jedi-vim-license*
|
||||||
|
|
||||||
Jedi-vim is licensed with the MIT license.
|
Jedi-vim is licensed with the MIT license.
|
||||||
|
|
||||||
vim: textwidth=78 tabstop=8 filetype=help:norightleft:
|
vim: textwidth=78 et filetype=help:norightleft:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
if !has('python') && !has('python3')
|
if !jedi#init_python()
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
" ------------------------------------------------------------------------
|
" ------------------------------------------------------------------------
|
||||||
@@ -7,25 +7,29 @@ endif
|
|||||||
|
|
||||||
if g:jedi#auto_initialization
|
if g:jedi#auto_initialization
|
||||||
" goto / get_definition / usages
|
" goto / get_definition / usages
|
||||||
if g:jedi#goto_assignments_command != ''
|
if len(g:jedi#goto_command)
|
||||||
execute "nnoremap <buffer> ".g:jedi#goto_assignments_command." :call jedi#goto_assignments()<CR>"
|
execute 'nnoremap <buffer> '.g:jedi#goto_command.' :call jedi#goto()<CR>'
|
||||||
endif
|
endif
|
||||||
if g:jedi#goto_definitions_command != ''
|
if len(g:jedi#goto_assignments_command)
|
||||||
execute "nnoremap <buffer> ".g:jedi#goto_definitions_command." :call jedi#goto_definitions()<CR>"
|
execute 'nnoremap <buffer> '.g:jedi#goto_assignments_command.' :call jedi#goto_assignments()<CR>'
|
||||||
endif
|
endif
|
||||||
if g:jedi#usages_command != ''
|
if len(g:jedi#goto_definitions_command)
|
||||||
execute "nnoremap <buffer> ".g:jedi#usages_command." :call jedi#usages()<CR>"
|
execute 'nnoremap <buffer> '.g:jedi#goto_definitions_command.' :call jedi#goto_definitions()<CR>'
|
||||||
|
endif
|
||||||
|
if len(g:jedi#usages_command)
|
||||||
|
execute 'nnoremap <buffer> '.g:jedi#usages_command.' :call jedi#usages()<CR>'
|
||||||
endif
|
endif
|
||||||
" rename
|
" rename
|
||||||
if g:jedi#rename_command != ''
|
if len(g:jedi#rename_command)
|
||||||
execute "nnoremap <buffer> ".g:jedi#rename_command." :call jedi#rename()<CR>"
|
execute 'nnoremap <buffer> '.g:jedi#rename_command.' :call jedi#rename()<CR>'
|
||||||
|
execute 'vnoremap <buffer> '.g:jedi#rename_command.' :call jedi#rename_visual()<CR>'
|
||||||
endif
|
endif
|
||||||
" documentation/pydoc
|
" documentation/pydoc
|
||||||
if g:jedi#documentation_command != ''
|
if len(g:jedi#documentation_command)
|
||||||
execute "nnoremap <silent> <buffer>".g:jedi#documentation_command." :call jedi#show_documentation()<CR>"
|
execute 'nnoremap <silent> <buffer>'.g:jedi#documentation_command.' :call jedi#show_documentation()<CR>'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if g:jedi#show_call_signatures == 1 && has('conceal')
|
if g:jedi#show_call_signatures > 0 && has('conceal')
|
||||||
call jedi#configure_call_signatures()
|
call jedi#configure_call_signatures()
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -33,15 +37,14 @@ if g:jedi#auto_initialization
|
|||||||
inoremap <silent> <buffer> . .<C-R>=jedi#complete_string(1)<CR>
|
inoremap <silent> <buffer> . .<C-R>=jedi#complete_string(1)<CR>
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if g:jedi#smart_auto_mappings == 1
|
||||||
|
inoremap <silent> <buffer> <space> <C-R>=jedi#smart_auto_mappings()<CR>
|
||||||
|
end
|
||||||
|
|
||||||
if g:jedi#auto_close_doc
|
if g:jedi#auto_close_doc
|
||||||
" close preview if its still open after insert
|
" close preview if its still open after insert
|
||||||
autocmd InsertLeave <buffer> if pumvisible() == 0|pclose|endif
|
augroup jedi_preview
|
||||||
end
|
autocmd! InsertLeave <buffer> if pumvisible() == 0|pclose|endif
|
||||||
end
|
augroup END
|
||||||
|
endif
|
||||||
if g:jedi#auto_vim_configuration
|
endif
|
||||||
setlocal completeopt=menuone,longest,preview
|
|
||||||
if len(mapcheck('<C-c>', 'i')) == 0
|
|
||||||
inoremap <C-c> <ESC>
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
''' ------------------------------------------------------------------------
|
|
||||||
Python initialization
|
|
||||||
---------------------------------------------------------------------------
|
|
||||||
here we initialize the jedi stuff '''
|
|
||||||
|
|
||||||
import vim
|
|
||||||
|
|
||||||
# update the system path, to include the jedi path
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
|
|
||||||
# vim.command('echom expand("<sfile>:p:h:h")') # broken, <sfile> inside function
|
|
||||||
# sys.path.insert(0, os.path.join(vim.eval('expand("<sfile>:p:h:h")'), 'jedi'))
|
|
||||||
sys.path.insert(0, os.path.join(vim.eval('s:script_path'), 'jedi'))
|
|
||||||
|
|
||||||
# to display errors correctly
|
|
||||||
import traceback
|
|
||||||
|
|
||||||
# update the sys path to include the jedi_vim script
|
|
||||||
sys.path.insert(0, vim.eval('s:script_path'))
|
|
||||||
try:
|
|
||||||
import jedi_vim
|
|
||||||
except ImportError:
|
|
||||||
vim.command('echoerr "Please install Jedi if you want to use jedi_vim."')
|
|
||||||
sys.path.pop(1)
|
|
||||||
|
|
||||||
1
jedi
1
jedi
Submodule jedi deleted from 78f1ae5e71
473
jedi_vim.py
473
jedi_vim.py
@@ -1,473 +0,0 @@
|
|||||||
"""
|
|
||||||
The Python parts of the Jedi library for VIM. It is mostly about communicating
|
|
||||||
with VIM.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import traceback # for exception output
|
|
||||||
import re
|
|
||||||
import os
|
|
||||||
from shlex import split as shsplit
|
|
||||||
|
|
||||||
import vim
|
|
||||||
import jedi
|
|
||||||
import jedi.keywords
|
|
||||||
from jedi._compatibility import unicode, is_py3k
|
|
||||||
|
|
||||||
|
|
||||||
def catch_and_print_exceptions(func):
|
|
||||||
def wrapper(*args, **kwargs):
|
|
||||||
try:
|
|
||||||
return func(*args, **kwargs)
|
|
||||||
except (Exception, vim.error):
|
|
||||||
print(traceback.format_exc())
|
|
||||||
return None
|
|
||||||
return wrapper
|
|
||||||
|
|
||||||
|
|
||||||
class VimError(Exception):
|
|
||||||
def __init__(self, message, throwpoint, executing):
|
|
||||||
super(type(self), self).__init__(message)
|
|
||||||
self.throwpoint = throwpoint
|
|
||||||
self.executing = executing
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.message + '; created by: ' + repr(self.executing)
|
|
||||||
|
|
||||||
|
|
||||||
def _catch_exception(string, is_eval):
|
|
||||||
"""
|
|
||||||
Interface between vim and python calls back to it.
|
|
||||||
Necessary, because the exact error message is not given by `vim.error`.
|
|
||||||
"""
|
|
||||||
e = 'jedi#_vim_exceptions(%s, %s)'
|
|
||||||
result = vim.eval(e % (repr(PythonToVimStr(string, 'UTF-8')), is_eval))
|
|
||||||
if 'exception' in result:
|
|
||||||
raise VimError(result['exception'], result['throwpoint'], string)
|
|
||||||
return result['result']
|
|
||||||
|
|
||||||
|
|
||||||
def vim_eval(string):
|
|
||||||
return _catch_exception(string, 1)
|
|
||||||
|
|
||||||
|
|
||||||
def vim_command(string):
|
|
||||||
_catch_exception(string, 0)
|
|
||||||
|
|
||||||
|
|
||||||
def echo_highlight(msg):
|
|
||||||
vim_command('echohl WarningMsg | echom "%s" | echohl None' % msg)
|
|
||||||
|
|
||||||
|
|
||||||
class PythonToVimStr(unicode):
|
|
||||||
""" Vim has a different string implementation of single quotes """
|
|
||||||
__slots__ = []
|
|
||||||
def __new__(cls, obj, encoding='UTF-8'):
|
|
||||||
if is_py3k or isinstance(obj, unicode):
|
|
||||||
return unicode.__new__(cls, obj)
|
|
||||||
else:
|
|
||||||
return unicode.__new__(cls, obj, encoding)
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
# this is totally stupid and makes no sense but vim/python unicode
|
|
||||||
# support is pretty bad. don't ask how I came up with this... It just
|
|
||||||
# works...
|
|
||||||
# It seems to be related to that bug: http://bugs.python.org/issue5876
|
|
||||||
if unicode is str:
|
|
||||||
s = self
|
|
||||||
else:
|
|
||||||
s = self.encode('UTF-8')
|
|
||||||
return '"%s"' % s.replace('\\', '\\\\').replace('"', r'\"')
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def get_script(source=None, column=None):
|
|
||||||
jedi.settings.additional_dynamic_modules = [b.name for b in vim.buffers
|
|
||||||
if b.name is not None and b.name.endswith('.py')]
|
|
||||||
if source is None:
|
|
||||||
source = '\n'.join(vim.current.buffer)
|
|
||||||
row = vim.current.window.cursor[0]
|
|
||||||
if column is None:
|
|
||||||
column = vim.current.window.cursor[1]
|
|
||||||
buf_path = vim.current.buffer.name
|
|
||||||
encoding = vim_eval('&encoding') or 'latin1'
|
|
||||||
return jedi.Script(source, row, column, buf_path, encoding)
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def completions():
|
|
||||||
row, column = vim.current.window.cursor
|
|
||||||
clear_call_signatures()
|
|
||||||
if vim.eval('a:findstart') == '1':
|
|
||||||
count = 0
|
|
||||||
for char in reversed(vim.current.line[:column]):
|
|
||||||
if not re.match('[\w\d]', char):
|
|
||||||
break
|
|
||||||
count += 1
|
|
||||||
vim.command('return %i' % (column - count))
|
|
||||||
else:
|
|
||||||
base = vim.eval('a:base')
|
|
||||||
source = ''
|
|
||||||
for i, line in enumerate(vim.current.buffer):
|
|
||||||
# enter this path again, otherwise source would be incomplete
|
|
||||||
if i == row - 1:
|
|
||||||
source += line[:column] + base + line[column:]
|
|
||||||
else:
|
|
||||||
source += line
|
|
||||||
source += '\n'
|
|
||||||
# here again hacks, because jedi has a different interface than vim
|
|
||||||
column += len(base)
|
|
||||||
try:
|
|
||||||
script = get_script(source=source, column=column)
|
|
||||||
completions = script.completions()
|
|
||||||
signatures = script.call_signatures()
|
|
||||||
|
|
||||||
out = []
|
|
||||||
for c in completions:
|
|
||||||
d = dict(word=PythonToVimStr(c.name[:len(base)] + c.complete),
|
|
||||||
abbr=PythonToVimStr(c.name),
|
|
||||||
# stuff directly behind the completion
|
|
||||||
menu=PythonToVimStr(c.description),
|
|
||||||
info=PythonToVimStr(c.doc), # docstr
|
|
||||||
icase=1, # case insensitive
|
|
||||||
dup=1 # allow duplicates (maybe later remove this)
|
|
||||||
)
|
|
||||||
out.append(d)
|
|
||||||
|
|
||||||
strout = str(out)
|
|
||||||
except Exception:
|
|
||||||
# print to stdout, will be in :messages
|
|
||||||
print(traceback.format_exc())
|
|
||||||
strout = ''
|
|
||||||
completions = []
|
|
||||||
signatures = []
|
|
||||||
|
|
||||||
show_call_signatures(signatures)
|
|
||||||
vim.command('return ' + strout)
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def goto(is_definition=False, is_related_name=False, no_output=False):
|
|
||||||
definitions = []
|
|
||||||
script = get_script()
|
|
||||||
try:
|
|
||||||
if is_related_name:
|
|
||||||
definitions = script.usages()
|
|
||||||
elif is_definition:
|
|
||||||
definitions = script.goto_definitions()
|
|
||||||
else:
|
|
||||||
definitions = script.goto_assignments()
|
|
||||||
except jedi.NotFoundError:
|
|
||||||
echo_highlight( "Cannot follow nothing. Put your cursor on a valid name.")
|
|
||||||
else:
|
|
||||||
if no_output:
|
|
||||||
return definitions
|
|
||||||
if not definitions:
|
|
||||||
echo_highlight("Couldn't find any definitions for this.")
|
|
||||||
elif len(definitions) == 1 and not is_related_name:
|
|
||||||
# just add some mark to add the current position to the jumplist.
|
|
||||||
# this is ugly, because it overrides the mark for '`', so if anyone
|
|
||||||
# has a better idea, let me know.
|
|
||||||
vim_command('normal! m`')
|
|
||||||
|
|
||||||
d = list(definitions)[0]
|
|
||||||
if d.in_builtin_module():
|
|
||||||
if d.is_keyword:
|
|
||||||
echo_highlight(
|
|
||||||
"Cannot get the definition of Python keywords.")
|
|
||||||
else:
|
|
||||||
echo_highlight("Builtin modules cannot be displayed (%s)."
|
|
||||||
% d.module_path)
|
|
||||||
else:
|
|
||||||
if d.module_path != vim.current.buffer.name:
|
|
||||||
result = new_buffer(d.module_path)
|
|
||||||
if not result:
|
|
||||||
return
|
|
||||||
vim.current.window.cursor = d.line, d.column
|
|
||||||
vim_command('normal! zt') # cursor at top of screen
|
|
||||||
else:
|
|
||||||
# multiple solutions
|
|
||||||
lst = []
|
|
||||||
for d in definitions:
|
|
||||||
if d.in_builtin_module():
|
|
||||||
lst.append(dict(text=
|
|
||||||
PythonToVimStr('Builtin ' + d.description)))
|
|
||||||
else:
|
|
||||||
lst.append(dict(filename=PythonToVimStr(d.module_path),
|
|
||||||
lnum=d.line, col=d.column + 1,
|
|
||||||
text=PythonToVimStr(d.description)))
|
|
||||||
vim_eval('setqflist(%s)' % repr(lst))
|
|
||||||
vim_eval('jedi#add_goto_window()')
|
|
||||||
return definitions
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def show_documentation():
|
|
||||||
script = get_script()
|
|
||||||
try:
|
|
||||||
definitions = script.goto_definitions()
|
|
||||||
except jedi.NotFoundError:
|
|
||||||
definitions = []
|
|
||||||
except Exception:
|
|
||||||
# print to stdout, will be in :messages
|
|
||||||
definitions = []
|
|
||||||
print("Exception, this shouldn't happen.")
|
|
||||||
print(traceback.format_exc())
|
|
||||||
|
|
||||||
if not definitions:
|
|
||||||
echo_highlight('No documentation found for that.')
|
|
||||||
vim.command('return')
|
|
||||||
else:
|
|
||||||
docs = ['Docstring for %s\n%s\n%s' % (d.desc_with_module, '='*40, d.doc) if d.doc
|
|
||||||
else '|No Docstring for %s|' % d for d in definitions]
|
|
||||||
text = ('\n' + '-' * 79 + '\n').join(docs)
|
|
||||||
vim.command('let l:doc = %s' % repr(PythonToVimStr(text)))
|
|
||||||
vim.command('let l:doc_lines = %s' % len(text.split('\n')))
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def clear_call_signatures():
|
|
||||||
cursor = vim.current.window.cursor
|
|
||||||
e = vim_eval('g:jedi#call_signature_escape')
|
|
||||||
regex = r'%sjedi=([0-9]+), ([^%s]*)%s.*%sjedi%s'.replace('%s', e)
|
|
||||||
for i, line in enumerate(vim.current.buffer):
|
|
||||||
match = re.search(r'%s' % regex, line)
|
|
||||||
if match is not None:
|
|
||||||
vim_regex = r'\v' + regex.replace('=', r'\=') + '.{%s}' % \
|
|
||||||
int(match.group(1))
|
|
||||||
vim_command(r'try | %s,%ss/%s/\2/g | catch | endtry' \
|
|
||||||
% (i + 1, i + 1, vim_regex))
|
|
||||||
vim_eval('histdel("search", -1)')
|
|
||||||
vim_command('let @/ = histget("search", -1)')
|
|
||||||
vim.current.window.cursor = cursor
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def show_call_signatures(signatures=()):
|
|
||||||
if vim_eval("has('conceal') && g:jedi#show_call_signatures") == '0':
|
|
||||||
return
|
|
||||||
|
|
||||||
if signatures == ():
|
|
||||||
signatures = get_script().call_signatures()
|
|
||||||
clear_call_signatures()
|
|
||||||
|
|
||||||
if not signatures:
|
|
||||||
return
|
|
||||||
|
|
||||||
for i, signature in enumerate(signatures):
|
|
||||||
line, column = signature.bracket_start
|
|
||||||
# signatures are listed above each other
|
|
||||||
line_to_replace = line - i - 1
|
|
||||||
# because there's a space before the bracket
|
|
||||||
insert_column = column - 1
|
|
||||||
if insert_column < 0 or line_to_replace <= 0:
|
|
||||||
# Edge cases, when the call signature has no space on the screen.
|
|
||||||
break
|
|
||||||
|
|
||||||
# TODO check if completion menu is above or below
|
|
||||||
line = vim_eval("getline(%s)" % line_to_replace)
|
|
||||||
|
|
||||||
params = [p.get_code().replace('\n', '') for p in signature.params]
|
|
||||||
try:
|
|
||||||
params[signature.index] = '*%s*' % params[signature.index]
|
|
||||||
except (IndexError, TypeError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
# This stuff is reaaaaally a hack! I cannot stress enough, that
|
|
||||||
# this is a stupid solution. But there is really no other yet.
|
|
||||||
# There is no possibility in VIM to draw on the screen, but there
|
|
||||||
# will be one (see :help todo Patch to access screen under Python.
|
|
||||||
# (Marko Mahni, 2010 Jul 18))
|
|
||||||
text = " (%s) " % ', '.join(params)
|
|
||||||
text = ' ' * (insert_column - len(line)) + text
|
|
||||||
end_column = insert_column + len(text) - 2 # -2 due to bold symbols
|
|
||||||
|
|
||||||
# Need to decode it with utf8, because vim returns always a python 2
|
|
||||||
# string even if it is unicode.
|
|
||||||
e = vim_eval('g:jedi#call_signature_escape')
|
|
||||||
if hasattr(e, 'decode'):
|
|
||||||
e = e.decode('UTF-8')
|
|
||||||
# replace line before with cursor
|
|
||||||
regex = "xjedi=%sx%sxjedix".replace('x', e)
|
|
||||||
|
|
||||||
prefix, replace = line[:insert_column], line[insert_column:end_column]
|
|
||||||
|
|
||||||
# Check the replace stuff for strings, to append them
|
|
||||||
# (don't want to break the syntax)
|
|
||||||
regex_quotes = r'''\\*["']+'''
|
|
||||||
# `add` are all the quotation marks.
|
|
||||||
# join them with a space to avoid producing '''
|
|
||||||
add = ' '.join(re.findall(regex_quotes, replace))
|
|
||||||
# search backwards
|
|
||||||
if add and replace[0] in ['"', "'"]:
|
|
||||||
a = re.search(regex_quotes + '$', prefix)
|
|
||||||
add = ('' if a is None else a.group(0)) + add
|
|
||||||
|
|
||||||
tup = '%s, %s' % (len(add), replace)
|
|
||||||
repl = prefix + (regex % (tup, text)) + add + line[end_column:]
|
|
||||||
|
|
||||||
vim_eval('setline(%s, %s)' % (line_to_replace, repr(PythonToVimStr(repl))))
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def rename():
|
|
||||||
if not int(vim.eval('a:0')):
|
|
||||||
_rename_cursor = vim.current.window.cursor
|
|
||||||
|
|
||||||
vim_command('normal A ') # otherwise startinsert doesn't work well
|
|
||||||
vim.current.window.cursor = _rename_cursor
|
|
||||||
|
|
||||||
vim_command('augroup jedi_rename')
|
|
||||||
vim_command('autocmd InsertLeave <buffer> call jedi#rename(1)')
|
|
||||||
vim_command('augroup END')
|
|
||||||
|
|
||||||
vim_command('normal! diw')
|
|
||||||
vim_command(':startinsert')
|
|
||||||
else:
|
|
||||||
window_path = vim.current.buffer.name
|
|
||||||
# reset autocommand
|
|
||||||
vim_command('autocmd! jedi_rename InsertLeave')
|
|
||||||
|
|
||||||
replace = vim_eval("expand('<cword>')")
|
|
||||||
vim_command('normal! u') # undo new word
|
|
||||||
cursor = vim.current.window.cursor
|
|
||||||
vim_command('normal! u') # undo the space at the end
|
|
||||||
vim.current.window.cursor = cursor
|
|
||||||
|
|
||||||
if replace is None:
|
|
||||||
echo_highlight('No rename possible, if no name is given.')
|
|
||||||
else:
|
|
||||||
temp_rename = goto(is_related_name=True, no_output=True)
|
|
||||||
# sort the whole thing reverse (positions at the end of the line
|
|
||||||
# must be first, because they move the stuff before the position).
|
|
||||||
temp_rename = sorted(temp_rename, reverse=True,
|
|
||||||
key=lambda x: (x.module_path, x.start_pos))
|
|
||||||
for r in temp_rename:
|
|
||||||
if r.in_builtin_module():
|
|
||||||
continue
|
|
||||||
|
|
||||||
if vim.current.buffer.name != r.module_path:
|
|
||||||
result = new_buffer(r.module_path)
|
|
||||||
if not result:
|
|
||||||
return
|
|
||||||
|
|
||||||
vim.current.window.cursor = r.start_pos
|
|
||||||
vim_command('normal! cw%s' % replace)
|
|
||||||
|
|
||||||
result = new_buffer(window_path)
|
|
||||||
if not result:
|
|
||||||
return
|
|
||||||
vim.current.window.cursor = cursor
|
|
||||||
echo_highlight('Jedi did %s renames!' % len(temp_rename))
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def py_import():
|
|
||||||
# args are the same as for the :edit command
|
|
||||||
args = shsplit(vim.eval('a:args'))
|
|
||||||
import_path = args.pop()
|
|
||||||
text = 'import %s' % import_path
|
|
||||||
scr = jedi.Script(text, 1, len(text), '')
|
|
||||||
try:
|
|
||||||
completion = scr.goto_assignments()[0]
|
|
||||||
except IndexError:
|
|
||||||
echo_highlight('Cannot find %s in sys.path!' % import_path)
|
|
||||||
else:
|
|
||||||
if completion.in_builtin_module():
|
|
||||||
echo_highlight('%s is a builtin module.' % import_path)
|
|
||||||
else:
|
|
||||||
cmd_args = ' '.join([a.replace(' ', '\\ ') for a in args])
|
|
||||||
new_buffer(completion.module_path, cmd_args)
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def py_import_completions():
|
|
||||||
argl = vim.eval('a:argl')
|
|
||||||
try:
|
|
||||||
import jedi
|
|
||||||
except ImportError:
|
|
||||||
print('Pyimport completion requires jedi module: https://github.com/davidhalter/jedi')
|
|
||||||
comps = []
|
|
||||||
else:
|
|
||||||
text = 'import %s' % argl
|
|
||||||
script=jedi.Script(text, 1, len(text), '')
|
|
||||||
comps = ['%s%s' % (argl, c.complete) for c in script.completions()]
|
|
||||||
vim.command("return '%s'" % '\n'.join(comps))
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def new_buffer(path, options=''):
|
|
||||||
# options are what you can to edit the edit options
|
|
||||||
if vim_eval('g:jedi#use_tabs_not_buffers') == '1':
|
|
||||||
_tabnew(path, options)
|
|
||||||
elif not vim_eval('g:jedi#use_splits_not_buffers') == '1':
|
|
||||||
user_split_option = vim_eval('g:jedi#use_splits_not_buffers')
|
|
||||||
split_options = {
|
|
||||||
'top': 'topleft split',
|
|
||||||
'left': 'topleft vsplit',
|
|
||||||
'right': 'botright vsplit',
|
|
||||||
'bottom': 'botright split'
|
|
||||||
}
|
|
||||||
if user_split_option not in split_options:
|
|
||||||
print('g:jedi#use_splits_not_buffers value is not correct, valid options are: %s' % ','.join(split_options.keys()))
|
|
||||||
else:
|
|
||||||
vim_command(split_options[user_split_option] + " %s" % path)
|
|
||||||
else:
|
|
||||||
if vim_eval("!&hidden && &modified") == '1':
|
|
||||||
if vim_eval("bufname('%')") is None:
|
|
||||||
echo_highlight('Cannot open a new buffer, use `:set hidden` or save your buffer')
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
vim_command('w')
|
|
||||||
vim_command('edit %s %s' % (options, escape_file_path(path)))
|
|
||||||
# sometimes syntax is being disabled and the filetype not set.
|
|
||||||
if vim_eval('!exists("g:syntax_on")') == '1':
|
|
||||||
vim_command('syntax enable')
|
|
||||||
if vim_eval("&filetype != 'python'") == '1':
|
|
||||||
vim_command('set filetype=python')
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
@catch_and_print_exceptions
|
|
||||||
def _tabnew(path, options=''):
|
|
||||||
"""
|
|
||||||
Open a file in a new tab or switch to an existing one.
|
|
||||||
|
|
||||||
:param options: `:tabnew` options, read vim help.
|
|
||||||
"""
|
|
||||||
path = os.path.abspath(path)
|
|
||||||
if vim_eval('has("gui")') == '1':
|
|
||||||
vim_command('tab drop %s %s' % (options, escape_file_path(path)))
|
|
||||||
return
|
|
||||||
|
|
||||||
for tab_nr in range(int(vim_eval("tabpagenr('$')"))):
|
|
||||||
for buf_nr in vim_eval("tabpagebuflist(%i + 1)" % tab_nr):
|
|
||||||
buf_nr = int(buf_nr) - 1
|
|
||||||
try:
|
|
||||||
buf_path = vim.buffers[buf_nr].name
|
|
||||||
except (LookupError, ValueError):
|
|
||||||
# Just do good old asking for forgiveness.
|
|
||||||
# don't know why this happens :-)
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
if buf_path == path:
|
|
||||||
# tab exists, just switch to that tab
|
|
||||||
vim_command('tabfirst | tabnext %i' % (tab_nr + 1))
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
continue
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
# tab doesn't exist, add a new one.
|
|
||||||
vim_command('tabnew %s' % escape_file_path(path))
|
|
||||||
|
|
||||||
|
|
||||||
def escape_file_path(path):
|
|
||||||
return path.replace(' ', r'\ ')
|
|
||||||
|
|
||||||
|
|
||||||
def print_to_stdout(level, str_out):
|
|
||||||
print(str_out)
|
|
||||||
|
|
||||||
if not hasattr(jedi, '__version__') or jedi.__version__ < (0, 7, 0):
|
|
||||||
echo_highlight('Please update your Jedi version, it is to old.')
|
|
||||||
|
|
||||||
@@ -4,16 +4,51 @@
|
|||||||
" This part of the software is just the vim interface. The really big deal is
|
" This part of the software is just the vim interface. The really big deal is
|
||||||
" the Jedi Python library.
|
" the Jedi Python library.
|
||||||
|
|
||||||
|
if get(g:, 'jedi#auto_vim_configuration', 1)
|
||||||
|
" jedi-vim doesn't work in compatible mode (vim script syntax problems)
|
||||||
|
if &compatible
|
||||||
|
" vint: -ProhibitSetNoCompatible
|
||||||
|
set nocompatible
|
||||||
|
" vint: +ProhibitSetNoCompatible
|
||||||
|
endif
|
||||||
|
|
||||||
" jedi-vim doesn't work in compatible mode (vim script syntax problems)
|
" jedi-vim really needs, otherwise jedi-vim cannot start.
|
||||||
if &compatible
|
filetype plugin on
|
||||||
set nocompatible
|
|
||||||
|
" Change completeopt, but only if it was not set already.
|
||||||
|
" This gets done on VimEnter, since otherwise Vim fails to restore the
|
||||||
|
" screen. Neovim is not affected, this is likely caused by using
|
||||||
|
" :redir/execute() before the (alternate) terminal is configured.
|
||||||
|
function! s:setup_completeopt()
|
||||||
|
if exists('*execute')
|
||||||
|
let completeopt = execute('silent verb set completeopt?')
|
||||||
|
else
|
||||||
|
redir => completeopt
|
||||||
|
silent verb set completeopt?
|
||||||
|
redir END
|
||||||
|
endif
|
||||||
|
if len(split(completeopt, '\n')) == 1
|
||||||
|
set completeopt=menuone,longest,preview
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
if has('nvim')
|
||||||
|
call s:setup_completeopt()
|
||||||
|
else
|
||||||
|
augroup jedi_startup
|
||||||
|
au!
|
||||||
|
autocmd VimEnter * call s:setup_completeopt()
|
||||||
|
augroup END
|
||||||
|
endif
|
||||||
|
|
||||||
|
if len(mapcheck('<C-c>', 'i')) == 0
|
||||||
|
inoremap <C-c> <ESC>
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" jedi-vim really needs, otherwise jedi-vim cannot start.
|
|
||||||
filetype plugin on
|
|
||||||
|
|
||||||
" Pyimport command
|
" Pyimport command
|
||||||
command! -nargs=1 -complete=custom,jedi#py_import_completions Pyimport :call jedi#py_import(<q-args>)
|
command! -nargs=1 -complete=custom,jedi#py_import_completions Pyimport :call jedi#py_import(<q-args>)
|
||||||
|
|
||||||
|
command! -nargs=0 -bar JediDebugInfo call jedi#debug_info()
|
||||||
|
command! -nargs=0 -bang JediClearCache call jedi#clear_cache(<bang>0)
|
||||||
|
|
||||||
" vim: set et ts=4:
|
" vim: set et ts=4:
|
||||||
|
|||||||
1
pythonx/jedi
Submodule
1
pythonx/jedi
Submodule
Submodule pythonx/jedi added at 02f238ce08
734
pythonx/jedi_vim.py
Normal file
734
pythonx/jedi_vim.py
Normal file
@@ -0,0 +1,734 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
The Python parts of the Jedi library for VIM. It is mostly about communicating
|
||||||
|
with VIM.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import traceback # for exception output
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from shlex import split as shsplit
|
||||||
|
from contextlib import contextmanager
|
||||||
|
try:
|
||||||
|
from itertools import zip_longest
|
||||||
|
except ImportError:
|
||||||
|
from itertools import izip_longest as zip_longest # Python 2
|
||||||
|
|
||||||
|
import vim
|
||||||
|
|
||||||
|
is_py3 = sys.version_info[0] >= 3
|
||||||
|
if is_py3:
|
||||||
|
ELLIPSIS = "…"
|
||||||
|
unicode = str
|
||||||
|
else:
|
||||||
|
ELLIPSIS = u"…"
|
||||||
|
|
||||||
|
|
||||||
|
class PythonToVimStr(unicode):
|
||||||
|
""" Vim has a different string implementation of single quotes """
|
||||||
|
__slots__ = []
|
||||||
|
|
||||||
|
def __new__(cls, obj, encoding='UTF-8'):
|
||||||
|
if not (is_py3 or isinstance(obj, unicode)):
|
||||||
|
obj = unicode.__new__(cls, obj, encoding)
|
||||||
|
|
||||||
|
# Vim cannot deal with zero bytes:
|
||||||
|
obj = obj.replace('\0', '\\0')
|
||||||
|
return unicode.__new__(cls, obj)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
# this is totally stupid and makes no sense but vim/python unicode
|
||||||
|
# support is pretty bad. don't ask how I came up with this... It just
|
||||||
|
# works...
|
||||||
|
# It seems to be related to that bug: http://bugs.python.org/issue5876
|
||||||
|
if unicode is str:
|
||||||
|
s = self
|
||||||
|
else:
|
||||||
|
s = self.encode('UTF-8')
|
||||||
|
return '"%s"' % s.replace('\\', '\\\\').replace('"', r'\"')
|
||||||
|
|
||||||
|
|
||||||
|
class VimError(Exception):
|
||||||
|
def __init__(self, message, throwpoint, executing):
|
||||||
|
super(type(self), self).__init__(message)
|
||||||
|
self.message = message
|
||||||
|
self.throwpoint = throwpoint
|
||||||
|
self.executing = executing
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.message + '; created by: ' + repr(self.executing)
|
||||||
|
|
||||||
|
|
||||||
|
def _catch_exception(string, is_eval):
|
||||||
|
"""
|
||||||
|
Interface between vim and python calls back to it.
|
||||||
|
Necessary, because the exact error message is not given by `vim.error`.
|
||||||
|
"""
|
||||||
|
result = vim.eval('jedi#_vim_exceptions({0}, {1})'.format(
|
||||||
|
repr(PythonToVimStr(string, 'UTF-8')), int(is_eval)))
|
||||||
|
if 'exception' in result:
|
||||||
|
raise VimError(result['exception'], result['throwpoint'], string)
|
||||||
|
return result['result']
|
||||||
|
|
||||||
|
|
||||||
|
def vim_command(string):
|
||||||
|
_catch_exception(string, False)
|
||||||
|
|
||||||
|
|
||||||
|
def vim_eval(string):
|
||||||
|
return _catch_exception(string, True)
|
||||||
|
|
||||||
|
|
||||||
|
def no_jedi_warning(error=None):
|
||||||
|
vim.command('echohl WarningMsg')
|
||||||
|
vim.command('echom "Please install Jedi if you want to use jedi-vim."')
|
||||||
|
if error:
|
||||||
|
vim.command('echom "The error was: {0}"'.format(error))
|
||||||
|
vim.command('echohl None')
|
||||||
|
|
||||||
|
|
||||||
|
def echo_highlight(msg):
|
||||||
|
vim_command('echohl WarningMsg | echom "jedi-vim: {0}" | echohl None'.format(
|
||||||
|
str(msg).replace('"', '\\"')))
|
||||||
|
|
||||||
|
|
||||||
|
jedi_path = os.path.join(os.path.dirname(__file__), 'jedi')
|
||||||
|
sys.path.insert(0, jedi_path)
|
||||||
|
parso_path = os.path.join(os.path.dirname(__file__), 'parso')
|
||||||
|
sys.path.insert(0, parso_path)
|
||||||
|
|
||||||
|
try:
|
||||||
|
import jedi
|
||||||
|
except ImportError as e:
|
||||||
|
no_jedi_warning(str(e))
|
||||||
|
jedi = None
|
||||||
|
jedi_import_error = str(e)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
version = jedi.__version__
|
||||||
|
except Exception as e: # e.g. AttributeError
|
||||||
|
echo_highlight(
|
||||||
|
"Error when loading the jedi python module ({0}). "
|
||||||
|
"Please ensure that Jedi is installed correctly (see Installation "
|
||||||
|
"in the README.".format(e))
|
||||||
|
jedi = None
|
||||||
|
else:
|
||||||
|
if isinstance(version, str):
|
||||||
|
# the normal use case, now.
|
||||||
|
from jedi import utils
|
||||||
|
version = utils.version_info()
|
||||||
|
if version < (0, 7):
|
||||||
|
echo_highlight('Please update your Jedi version, it is too old.')
|
||||||
|
finally:
|
||||||
|
sys.path.remove(jedi_path)
|
||||||
|
sys.path.remove(parso_path)
|
||||||
|
|
||||||
|
|
||||||
|
def catch_and_print_exceptions(func):
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
try:
|
||||||
|
return func(*args, **kwargs)
|
||||||
|
except (Exception, vim.error):
|
||||||
|
print(traceback.format_exc())
|
||||||
|
return None
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
def _check_jedi_availability(show_error=False):
|
||||||
|
def func_receiver(func):
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
if jedi is None:
|
||||||
|
if show_error:
|
||||||
|
no_jedi_warning()
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
return func(*args, **kwargs)
|
||||||
|
return wrapper
|
||||||
|
return func_receiver
|
||||||
|
|
||||||
|
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def get_script(source=None, column=None):
|
||||||
|
jedi.settings.additional_dynamic_modules = \
|
||||||
|
[b.name for b in vim.buffers if b.name is not None and b.name.endswith('.py')]
|
||||||
|
if source is None:
|
||||||
|
source = '\n'.join(vim.current.buffer)
|
||||||
|
row = vim.current.window.cursor[0]
|
||||||
|
if column is None:
|
||||||
|
column = vim.current.window.cursor[1]
|
||||||
|
buf_path = vim.current.buffer.name
|
||||||
|
encoding = vim_eval('&encoding') or 'latin1'
|
||||||
|
return jedi.Script(source, row, column, buf_path, encoding)
|
||||||
|
|
||||||
|
|
||||||
|
@_check_jedi_availability(show_error=False)
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def completions():
|
||||||
|
row, column = vim.current.window.cursor
|
||||||
|
# Clear call signatures in the buffer so they aren't seen by the completer.
|
||||||
|
# Call signatures in the command line can stay.
|
||||||
|
if int(vim_eval("g:jedi#show_call_signatures")) == 1:
|
||||||
|
clear_call_signatures()
|
||||||
|
if vim.eval('a:findstart') == '1':
|
||||||
|
count = 0
|
||||||
|
for char in reversed(vim.current.line[:column]):
|
||||||
|
if not re.match('[\w\d]', char):
|
||||||
|
break
|
||||||
|
count += 1
|
||||||
|
vim.command('return %i' % (column - count))
|
||||||
|
else:
|
||||||
|
base = vim.eval('a:base')
|
||||||
|
source = ''
|
||||||
|
for i, line in enumerate(vim.current.buffer):
|
||||||
|
# enter this path again, otherwise source would be incomplete
|
||||||
|
if i == row - 1:
|
||||||
|
source += line[:column] + base + line[column:]
|
||||||
|
else:
|
||||||
|
source += line
|
||||||
|
source += '\n'
|
||||||
|
# here again hacks, because jedi has a different interface than vim
|
||||||
|
column += len(base)
|
||||||
|
try:
|
||||||
|
script = get_script(source=source, column=column)
|
||||||
|
completions = script.completions()
|
||||||
|
signatures = script.call_signatures()
|
||||||
|
|
||||||
|
out = []
|
||||||
|
for c in completions:
|
||||||
|
d = dict(word=PythonToVimStr(c.name[:len(base)] + c.complete),
|
||||||
|
abbr=PythonToVimStr(c.name_with_symbols),
|
||||||
|
# stuff directly behind the completion
|
||||||
|
menu=PythonToVimStr(c.description),
|
||||||
|
info=PythonToVimStr(c.docstring()), # docstr
|
||||||
|
icase=1, # case insensitive
|
||||||
|
dup=1 # allow duplicates (maybe later remove this)
|
||||||
|
)
|
||||||
|
out.append(d)
|
||||||
|
|
||||||
|
strout = str(out)
|
||||||
|
except Exception:
|
||||||
|
# print to stdout, will be in :messages
|
||||||
|
print(traceback.format_exc())
|
||||||
|
strout = ''
|
||||||
|
completions = []
|
||||||
|
signatures = []
|
||||||
|
|
||||||
|
show_call_signatures(signatures)
|
||||||
|
vim.command('return ' + strout)
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def tempfile(content):
|
||||||
|
# Using this instead of the tempfile module because Windows won't read
|
||||||
|
# from a file not yet written to disk
|
||||||
|
with open(vim_eval('tempname()'), 'w') as f:
|
||||||
|
f.write(content)
|
||||||
|
try:
|
||||||
|
yield f
|
||||||
|
finally:
|
||||||
|
os.unlink(f.name)
|
||||||
|
|
||||||
|
@_check_jedi_availability(show_error=True)
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def goto(mode="goto", no_output=False):
|
||||||
|
"""
|
||||||
|
:param str mode: "related_name", "definition", "assignment", "auto"
|
||||||
|
:return: list of definitions/assignments
|
||||||
|
:rtype: list
|
||||||
|
"""
|
||||||
|
script = get_script()
|
||||||
|
if mode == "goto":
|
||||||
|
definitions = [x for x in script.goto_definitions()
|
||||||
|
if not x.in_builtin_module()]
|
||||||
|
if not definitions:
|
||||||
|
definitions = script.goto_assignments()
|
||||||
|
elif mode == "related_name":
|
||||||
|
definitions = script.usages()
|
||||||
|
elif mode == "definition":
|
||||||
|
definitions = script.goto_definitions()
|
||||||
|
elif mode == "assignment":
|
||||||
|
definitions = script.goto_assignments()
|
||||||
|
|
||||||
|
|
||||||
|
if no_output:
|
||||||
|
return definitions
|
||||||
|
if not definitions:
|
||||||
|
echo_highlight("Couldn't find any definitions for this.")
|
||||||
|
elif len(definitions) == 1 and mode != "related_name":
|
||||||
|
d = list(definitions)[0]
|
||||||
|
if d.in_builtin_module():
|
||||||
|
if d.is_keyword:
|
||||||
|
echo_highlight("Cannot get the definition of Python keywords.")
|
||||||
|
else:
|
||||||
|
echo_highlight("Builtin modules cannot be displayed (%s)."
|
||||||
|
% d.desc_with_module)
|
||||||
|
else:
|
||||||
|
using_tagstack = int(vim_eval('g:jedi#use_tag_stack')) == 1
|
||||||
|
if (d.module_path or '') != vim.current.buffer.name:
|
||||||
|
result = new_buffer(d.module_path,
|
||||||
|
using_tagstack=using_tagstack)
|
||||||
|
if not result:
|
||||||
|
return []
|
||||||
|
if d.module_path and os.path.exists(d.module_path) and using_tagstack:
|
||||||
|
tagname = d.name
|
||||||
|
with tempfile('{0}\t{1}\t{2}'.format(tagname, d.module_path,
|
||||||
|
'call cursor({0}, {1})'.format(d.line, d.column + 1))) as f:
|
||||||
|
old_tags = vim.eval('&tags')
|
||||||
|
old_wildignore = vim.eval('&wildignore')
|
||||||
|
try:
|
||||||
|
# Clear wildignore to ensure tag file isn't ignored
|
||||||
|
vim.command('set wildignore=')
|
||||||
|
vim.command('let &tags = %s' %
|
||||||
|
repr(PythonToVimStr(f.name)))
|
||||||
|
vim.command('tjump %s' % tagname)
|
||||||
|
finally:
|
||||||
|
vim.command('let &tags = %s' %
|
||||||
|
repr(PythonToVimStr(old_tags)))
|
||||||
|
vim.command('let &wildignore = %s' %
|
||||||
|
repr(PythonToVimStr(old_wildignore)))
|
||||||
|
vim.current.window.cursor = d.line, d.column
|
||||||
|
else:
|
||||||
|
# multiple solutions
|
||||||
|
lst = []
|
||||||
|
for d in definitions:
|
||||||
|
if d.in_builtin_module():
|
||||||
|
lst.append(dict(text=PythonToVimStr('Builtin ' + d.description)))
|
||||||
|
elif d.module_path is None:
|
||||||
|
# Typically a namespace, in the future maybe other things as
|
||||||
|
# well.
|
||||||
|
lst.append(dict(text=PythonToVimStr(d.description)))
|
||||||
|
else:
|
||||||
|
lst.append(dict(filename=PythonToVimStr(d.module_path),
|
||||||
|
lnum=d.line, col=d.column + 1,
|
||||||
|
text=PythonToVimStr(d.description)))
|
||||||
|
vim_eval('setqflist(%s)' % repr(lst))
|
||||||
|
vim_eval('jedi#add_goto_window(' + str(len(lst)) + ')')
|
||||||
|
return definitions
|
||||||
|
|
||||||
|
|
||||||
|
@_check_jedi_availability(show_error=True)
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def show_documentation():
|
||||||
|
script = get_script()
|
||||||
|
try:
|
||||||
|
definitions = script.goto_definitions()
|
||||||
|
except jedi.NotFoundError:
|
||||||
|
definitions = []
|
||||||
|
except Exception:
|
||||||
|
# print to stdout, will be in :messages
|
||||||
|
definitions = []
|
||||||
|
print("Exception, this shouldn't happen.")
|
||||||
|
print(traceback.format_exc())
|
||||||
|
|
||||||
|
if not definitions:
|
||||||
|
echo_highlight('No documentation found for that.')
|
||||||
|
vim.command('return')
|
||||||
|
else:
|
||||||
|
docs = ['Docstring for %s\n%s\n%s' % (d.desc_with_module, '=' * 40, d.docstring())
|
||||||
|
if d.docstring() else '|No Docstring for %s|' % d for d in definitions]
|
||||||
|
text = ('\n' + '-' * 79 + '\n').join(docs)
|
||||||
|
vim.command('let l:doc = %s' % repr(PythonToVimStr(text)))
|
||||||
|
vim.command('let l:doc_lines = %s' % len(text.split('\n')))
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def clear_call_signatures():
|
||||||
|
# Check if using command line call signatures
|
||||||
|
if int(vim_eval("g:jedi#show_call_signatures")) == 2:
|
||||||
|
vim_command('echo ""')
|
||||||
|
return
|
||||||
|
cursor = vim.current.window.cursor
|
||||||
|
e = vim_eval('g:jedi#call_signature_escape')
|
||||||
|
# We need two turns here to search and replace certain lines:
|
||||||
|
# 1. Search for a line with a call signature and save the appended
|
||||||
|
# characters
|
||||||
|
# 2. Actually replace the line and redo the status quo.
|
||||||
|
py_regex = r'%sjedi=([0-9]+), (.*?)%s.*?%sjedi%s'.replace(
|
||||||
|
'%s', re.escape(e))
|
||||||
|
for i, line in enumerate(vim.current.buffer):
|
||||||
|
match = re.search(py_regex, line)
|
||||||
|
if match is not None:
|
||||||
|
# Some signs were added to minimize syntax changes due to call
|
||||||
|
# signatures. We have to remove them again. The number of them is
|
||||||
|
# specified in `match.group(1)`.
|
||||||
|
after = line[match.end() + int(match.group(1)):]
|
||||||
|
line = line[:match.start()] + match.group(2) + after
|
||||||
|
vim.current.buffer[i] = line
|
||||||
|
vim.current.window.cursor = cursor
|
||||||
|
|
||||||
|
|
||||||
|
@_check_jedi_availability(show_error=False)
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def show_call_signatures(signatures=()):
|
||||||
|
if int(vim_eval("has('conceal') && g:jedi#show_call_signatures")) == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
if signatures == ():
|
||||||
|
signatures = get_script().call_signatures()
|
||||||
|
clear_call_signatures()
|
||||||
|
|
||||||
|
if not signatures:
|
||||||
|
return
|
||||||
|
|
||||||
|
if int(vim_eval("g:jedi#show_call_signatures")) == 2:
|
||||||
|
return cmdline_call_signatures(signatures)
|
||||||
|
|
||||||
|
for i, signature in enumerate(signatures):
|
||||||
|
line, column = signature.bracket_start
|
||||||
|
# signatures are listed above each other
|
||||||
|
line_to_replace = line - i - 1
|
||||||
|
# because there's a space before the bracket
|
||||||
|
insert_column = column - 1
|
||||||
|
if insert_column < 0 or line_to_replace <= 0:
|
||||||
|
# Edge cases, when the call signature has no space on the screen.
|
||||||
|
break
|
||||||
|
|
||||||
|
# TODO check if completion menu is above or below
|
||||||
|
line = vim_eval("getline(%s)" % line_to_replace)
|
||||||
|
|
||||||
|
# Descriptions are usually looking like `param name`, remove the param.
|
||||||
|
params = [p.description.replace('\n', '').replace('param ', '', 1) for p in signature.params]
|
||||||
|
try:
|
||||||
|
# *_*PLACEHOLDER*_* makes something fat. See after/syntax file.
|
||||||
|
params[signature.index] = '*_*%s*_*' % params[signature.index]
|
||||||
|
except (IndexError, TypeError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# This stuff is reaaaaally a hack! I cannot stress enough, that
|
||||||
|
# this is a stupid solution. But there is really no other yet.
|
||||||
|
# There is no possibility in VIM to draw on the screen, but there
|
||||||
|
# will be one (see :help todo Patch to access screen under Python.
|
||||||
|
# (Marko Mahni, 2010 Jul 18))
|
||||||
|
text = " (%s) " % ', '.join(params)
|
||||||
|
text = ' ' * (insert_column - len(line)) + text
|
||||||
|
end_column = insert_column + len(text) - 2 # -2 due to bold symbols
|
||||||
|
|
||||||
|
# Need to decode it with utf8, because vim returns always a python 2
|
||||||
|
# string even if it is unicode.
|
||||||
|
e = vim_eval('g:jedi#call_signature_escape')
|
||||||
|
if hasattr(e, 'decode'):
|
||||||
|
e = e.decode('UTF-8')
|
||||||
|
# replace line before with cursor
|
||||||
|
regex = "xjedi=%sx%sxjedix".replace('x', e)
|
||||||
|
|
||||||
|
prefix, replace = line[:insert_column], line[insert_column:end_column]
|
||||||
|
|
||||||
|
# Check the replace stuff for strings, to append them
|
||||||
|
# (don't want to break the syntax)
|
||||||
|
regex_quotes = r'''\\*["']+'''
|
||||||
|
# `add` are all the quotation marks.
|
||||||
|
# join them with a space to avoid producing '''
|
||||||
|
add = ' '.join(re.findall(regex_quotes, replace))
|
||||||
|
# search backwards
|
||||||
|
if add and replace[0] in ['"', "'"]:
|
||||||
|
a = re.search(regex_quotes + '$', prefix)
|
||||||
|
add = ('' if a is None else a.group(0)) + add
|
||||||
|
|
||||||
|
tup = '%s, %s' % (len(add), replace)
|
||||||
|
repl = prefix + (regex % (tup, text)) + add + line[end_column:]
|
||||||
|
|
||||||
|
vim_eval('setline(%s, %s)' % (line_to_replace, repr(PythonToVimStr(repl))))
|
||||||
|
|
||||||
|
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def cmdline_call_signatures(signatures):
|
||||||
|
def get_params(s):
|
||||||
|
return [p.description.replace('\n', '').replace('param ', '', 1) for p in s.params]
|
||||||
|
|
||||||
|
def escape(string):
|
||||||
|
return string.replace('"', '\\"').replace(r'\n', r'\\n')
|
||||||
|
|
||||||
|
def join():
|
||||||
|
return ', '.join(filter(None, (left, center, right)))
|
||||||
|
|
||||||
|
def too_long():
|
||||||
|
return len(join()) > max_msg_len
|
||||||
|
|
||||||
|
if len(signatures) > 1:
|
||||||
|
params = zip_longest(*map(get_params, signatures), fillvalue='_')
|
||||||
|
params = ['(' + ', '.join(p) + ')' for p in params]
|
||||||
|
else:
|
||||||
|
params = get_params(signatures[0])
|
||||||
|
|
||||||
|
index = next(iter(s.index for s in signatures if s.index is not None), None)
|
||||||
|
|
||||||
|
# Allow 12 characters for showcmd plus 18 for ruler - setting
|
||||||
|
# noruler/noshowcmd here causes incorrect undo history
|
||||||
|
max_msg_len = int(vim_eval('&columns')) - 12
|
||||||
|
if int(vim_eval('&ruler')):
|
||||||
|
max_msg_len -= 18
|
||||||
|
max_msg_len -= len(signatures[0].name) + 2 # call name + parentheses
|
||||||
|
|
||||||
|
if max_msg_len < (1 if params else 0):
|
||||||
|
return
|
||||||
|
elif index is None:
|
||||||
|
text = escape(', '.join(params))
|
||||||
|
if params and len(text) > max_msg_len:
|
||||||
|
text = ELLIPSIS
|
||||||
|
elif max_msg_len < len(ELLIPSIS):
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
left = escape(', '.join(params[:index]))
|
||||||
|
center = escape(params[index])
|
||||||
|
right = escape(', '.join(params[index + 1:]))
|
||||||
|
while too_long():
|
||||||
|
if left and left != ELLIPSIS:
|
||||||
|
left = ELLIPSIS
|
||||||
|
continue
|
||||||
|
if right and right != ELLIPSIS:
|
||||||
|
right = ELLIPSIS
|
||||||
|
continue
|
||||||
|
if (left or right) and center != ELLIPSIS:
|
||||||
|
left = right = None
|
||||||
|
center = ELLIPSIS
|
||||||
|
continue
|
||||||
|
if too_long():
|
||||||
|
# Should never reach here
|
||||||
|
return
|
||||||
|
|
||||||
|
max_num_spaces = max_msg_len
|
||||||
|
if index is not None:
|
||||||
|
max_num_spaces -= len(join())
|
||||||
|
_, column = signatures[0].bracket_start
|
||||||
|
spaces = min(int(vim_eval('g:jedi#first_col +'
|
||||||
|
'wincol() - col(".")')) +
|
||||||
|
column - len(signatures[0].name),
|
||||||
|
max_num_spaces) * ' '
|
||||||
|
|
||||||
|
if index is not None:
|
||||||
|
vim_command(' echon "%s" | '
|
||||||
|
'echohl Function | echon "%s" | '
|
||||||
|
'echohl None | echon "(" | '
|
||||||
|
'echohl jediFunction | echon "%s" | '
|
||||||
|
'echohl jediFat | echon "%s" | '
|
||||||
|
'echohl jediFunction | echon "%s" | '
|
||||||
|
'echohl None | echon ")"'
|
||||||
|
% (spaces, signatures[0].name,
|
||||||
|
left + ', ' if left else '',
|
||||||
|
center, ', ' + right if right else ''))
|
||||||
|
else:
|
||||||
|
vim_command(' echon "%s" | '
|
||||||
|
'echohl Function | echon "%s" | '
|
||||||
|
'echohl None | echon "(%s)"'
|
||||||
|
% (spaces, signatures[0].name, text))
|
||||||
|
|
||||||
|
|
||||||
|
@_check_jedi_availability(show_error=True)
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def rename():
|
||||||
|
if not int(vim.eval('a:0')):
|
||||||
|
# Need to save the cursor position before insert mode
|
||||||
|
cursor = vim.current.window.cursor
|
||||||
|
changenr = vim.eval('changenr()') # track undo tree
|
||||||
|
vim_command('augroup jedi_rename')
|
||||||
|
vim_command('autocmd InsertLeave <buffer> call jedi#rename'
|
||||||
|
'({}, {}, {})'.format(cursor[0], cursor[1], changenr))
|
||||||
|
vim_command('augroup END')
|
||||||
|
|
||||||
|
vim_command("let s:jedi_replace_orig = expand('<cword>')")
|
||||||
|
vim_command('normal! diw')
|
||||||
|
vim_command('startinsert')
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Remove autocommand.
|
||||||
|
vim_command('autocmd! jedi_rename InsertLeave')
|
||||||
|
|
||||||
|
args = vim.eval('a:000')
|
||||||
|
cursor = tuple(int(x) for x in args[:2])
|
||||||
|
changenr = args[2]
|
||||||
|
|
||||||
|
# Get replacement, if there is something on the cursor.
|
||||||
|
# This won't be the case when the user ends insert mode right away,
|
||||||
|
# and `<cword>` would pick up the nearest word instead.
|
||||||
|
if vim_eval('getline(".")[getpos(".")[2]-1]') != ' ':
|
||||||
|
replace = vim_eval("expand('<cword>')")
|
||||||
|
else:
|
||||||
|
replace = None
|
||||||
|
|
||||||
|
vim_command('undo {}'.format(changenr))
|
||||||
|
|
||||||
|
vim.current.window.cursor = cursor
|
||||||
|
|
||||||
|
if replace:
|
||||||
|
return do_rename(replace)
|
||||||
|
|
||||||
|
|
||||||
|
def rename_visual():
|
||||||
|
replace = vim.eval('input("Rename to: ")')
|
||||||
|
orig = vim.eval('getline(".")[(getpos("\'<")[2]-1):getpos("\'>")[2]]')
|
||||||
|
do_rename(replace, orig)
|
||||||
|
|
||||||
|
|
||||||
|
def do_rename(replace, orig=None):
|
||||||
|
if not len(replace):
|
||||||
|
echo_highlight('No rename possible without name.')
|
||||||
|
return
|
||||||
|
|
||||||
|
if orig is None:
|
||||||
|
orig = vim_eval('s:jedi_replace_orig')
|
||||||
|
|
||||||
|
# Save original window / tab.
|
||||||
|
saved_tab = int(vim_eval('tabpagenr()'))
|
||||||
|
saved_win = int(vim_eval('winnr()'))
|
||||||
|
|
||||||
|
temp_rename = goto(mode="related_name", no_output=True)
|
||||||
|
# Sort the whole thing reverse (positions at the end of the line
|
||||||
|
# must be first, because they move the stuff before the position).
|
||||||
|
temp_rename = sorted(temp_rename, reverse=True,
|
||||||
|
key=lambda x: (x.module_path, x.line, x.column))
|
||||||
|
buffers = set()
|
||||||
|
for r in temp_rename:
|
||||||
|
if r.in_builtin_module():
|
||||||
|
continue
|
||||||
|
|
||||||
|
if os.path.abspath(vim.current.buffer.name) != r.module_path:
|
||||||
|
assert r.module_path is not None
|
||||||
|
result = new_buffer(r.module_path)
|
||||||
|
if not result:
|
||||||
|
echo_highlight("Jedi-vim: failed to create buffer window for {0}!".format(r.module_path))
|
||||||
|
continue
|
||||||
|
|
||||||
|
buffers.add(vim.current.buffer.name)
|
||||||
|
|
||||||
|
# Save view.
|
||||||
|
saved_view = vim_eval('string(winsaveview())')
|
||||||
|
|
||||||
|
# Replace original word.
|
||||||
|
vim.current.window.cursor = (r.line, r.column)
|
||||||
|
vim_command('normal! c{0:d}l{1}'.format(len(orig), replace))
|
||||||
|
|
||||||
|
# Restore view.
|
||||||
|
vim_command('call winrestview(%s)' % saved_view)
|
||||||
|
|
||||||
|
# Restore previous tab and window.
|
||||||
|
vim_command('tabnext {0:d}'.format(saved_tab))
|
||||||
|
vim_command('{0:d}wincmd w'.format(saved_win))
|
||||||
|
|
||||||
|
if len(buffers) > 1:
|
||||||
|
echo_highlight('Jedi did {0:d} renames in {1:d} buffers!'.format(
|
||||||
|
len(temp_rename), len(buffers)))
|
||||||
|
else:
|
||||||
|
echo_highlight('Jedi did {0:d} renames!'.format(len(temp_rename)))
|
||||||
|
|
||||||
|
|
||||||
|
@_check_jedi_availability(show_error=True)
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def py_import():
|
||||||
|
# args are the same as for the :edit command
|
||||||
|
args = shsplit(vim.eval('a:args'))
|
||||||
|
import_path = args.pop()
|
||||||
|
text = 'import %s' % import_path
|
||||||
|
scr = jedi.Script(text, 1, len(text), '')
|
||||||
|
try:
|
||||||
|
completion = scr.goto_assignments()[0]
|
||||||
|
except IndexError:
|
||||||
|
echo_highlight('Cannot find %s in sys.path!' % import_path)
|
||||||
|
else:
|
||||||
|
if completion.in_builtin_module():
|
||||||
|
echo_highlight('%s is a builtin module.' % import_path)
|
||||||
|
else:
|
||||||
|
cmd_args = ' '.join([a.replace(' ', '\\ ') for a in args])
|
||||||
|
new_buffer(completion.module_path, cmd_args)
|
||||||
|
|
||||||
|
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def py_import_completions():
|
||||||
|
argl = vim.eval('a:argl')
|
||||||
|
try:
|
||||||
|
import jedi
|
||||||
|
except ImportError:
|
||||||
|
print('Pyimport completion requires jedi module: https://github.com/davidhalter/jedi')
|
||||||
|
comps = []
|
||||||
|
else:
|
||||||
|
text = 'import %s' % argl
|
||||||
|
script = jedi.Script(text, 1, len(text), '')
|
||||||
|
comps = ['%s%s' % (argl, c.complete) for c in script.completions()]
|
||||||
|
vim.command("return '%s'" % '\n'.join(comps))
|
||||||
|
|
||||||
|
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def new_buffer(path, options='', using_tagstack=False):
|
||||||
|
# options are what you can to edit the edit options
|
||||||
|
if int(vim_eval('g:jedi#use_tabs_not_buffers')) == 1:
|
||||||
|
_tabnew(path, options)
|
||||||
|
elif not vim_eval('g:jedi#use_splits_not_buffers') in [1, '1']:
|
||||||
|
user_split_option = vim_eval('g:jedi#use_splits_not_buffers')
|
||||||
|
split_options = {
|
||||||
|
'top': 'topleft split',
|
||||||
|
'left': 'topleft vsplit',
|
||||||
|
'right': 'botright vsplit',
|
||||||
|
'bottom': 'botright split',
|
||||||
|
'winwidth': 'vs'
|
||||||
|
}
|
||||||
|
if (user_split_option == 'winwidth' and
|
||||||
|
vim.current.window.width <= 2 * int(vim_eval(
|
||||||
|
"&textwidth ? &textwidth : 80"))):
|
||||||
|
split_options['winwidth'] = 'sp'
|
||||||
|
if user_split_option not in split_options:
|
||||||
|
print('Unsupported value for g:jedi#use_splits_not_buffers: {0}. '
|
||||||
|
'Valid options are: {1}.'.format(
|
||||||
|
user_split_option, ', '.join(split_options.keys())))
|
||||||
|
else:
|
||||||
|
vim_command(split_options[user_split_option] + " %s" % escape_file_path(path))
|
||||||
|
else:
|
||||||
|
if int(vim_eval("!&hidden && &modified")) == 1:
|
||||||
|
if not vim_eval("bufname('%')"):
|
||||||
|
echo_highlight('Cannot open a new buffer, use `:set hidden` or save your buffer')
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
vim_command('w')
|
||||||
|
if using_tagstack:
|
||||||
|
return True
|
||||||
|
vim_command('edit %s %s' % (options, escape_file_path(path)))
|
||||||
|
# sometimes syntax is being disabled and the filetype not set.
|
||||||
|
if int(vim_eval('!exists("g:syntax_on")')) == 1:
|
||||||
|
vim_command('syntax enable')
|
||||||
|
if int(vim_eval("&filetype != 'python'")) == 1:
|
||||||
|
vim_command('set filetype=python')
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
@catch_and_print_exceptions
|
||||||
|
def _tabnew(path, options=''):
|
||||||
|
"""
|
||||||
|
Open a file in a new tab or switch to an existing one.
|
||||||
|
|
||||||
|
:param options: `:tabnew` options, read vim help.
|
||||||
|
"""
|
||||||
|
path = os.path.abspath(path)
|
||||||
|
if int(vim_eval('has("gui")')) == 1:
|
||||||
|
vim_command('tab drop %s %s' % (options, escape_file_path(path)))
|
||||||
|
return
|
||||||
|
|
||||||
|
for tab_nr in range(int(vim_eval("tabpagenr('$')"))):
|
||||||
|
for buf_nr in vim_eval("tabpagebuflist(%i + 1)" % tab_nr):
|
||||||
|
buf_nr = int(buf_nr) - 1
|
||||||
|
try:
|
||||||
|
buf_path = vim.buffers[buf_nr].name
|
||||||
|
except (LookupError, ValueError):
|
||||||
|
# Just do good old asking for forgiveness.
|
||||||
|
# don't know why this happens :-)
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if buf_path == path:
|
||||||
|
# tab exists, just switch to that tab
|
||||||
|
vim_command('tabfirst | tabnext %i' % (tab_nr + 1))
|
||||||
|
# Goto the buffer's window.
|
||||||
|
vim_command('exec bufwinnr(%i) . " wincmd w"' % (buf_nr + 1))
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
# tab doesn't exist, add a new one.
|
||||||
|
vim_command('tabnew %s' % escape_file_path(path))
|
||||||
|
|
||||||
|
|
||||||
|
def escape_file_path(path):
|
||||||
|
return path.replace(' ', r'\ ')
|
||||||
|
|
||||||
|
|
||||||
|
def print_to_stdout(level, str_out):
|
||||||
|
print(str_out)
|
||||||
44
pythonx/jedi_vim_debug.py
Normal file
44
pythonx/jedi_vim_debug.py
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
"""Used in jedi-vim's jedi#debug_info()"""
|
||||||
|
|
||||||
|
|
||||||
|
def display_debug_info():
|
||||||
|
import vim
|
||||||
|
|
||||||
|
def echo(msg):
|
||||||
|
vim.command('echo {0}'.format(msg))
|
||||||
|
|
||||||
|
echo("printf(' - sys.version: `%s`', {0!r})".format(
|
||||||
|
', '.join([x.strip()
|
||||||
|
for x in __import__('sys').version.split('\n')])))
|
||||||
|
echo("printf(' - site module: `%s`', {0!r})".format(
|
||||||
|
__import__('site').__file__))
|
||||||
|
|
||||||
|
try:
|
||||||
|
import jedi_vim
|
||||||
|
except Exception as e:
|
||||||
|
echo("printf('ERROR: jedi_vim is not available: %s: %s', "
|
||||||
|
"{0!r}, {1!r})".format(e.__class__.__name__, str(e)))
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
if jedi_vim.jedi is None:
|
||||||
|
echo("'ERROR: could not import the \"jedi\" Python module.'")
|
||||||
|
echo("printf(' The error was: %s', {0!r})".format(
|
||||||
|
getattr(jedi_vim, "jedi_import_error", "UNKNOWN")))
|
||||||
|
else:
|
||||||
|
echo("printf('Jedi path: `%s`', {0!r})".format(
|
||||||
|
jedi_vim.jedi.__file__))
|
||||||
|
echo("printf(' - version: %s', {0!r})".format(
|
||||||
|
jedi_vim.jedi.__version__))
|
||||||
|
echo("' - sys_path:'")
|
||||||
|
|
||||||
|
script_evaluator = jedi_vim.jedi.Script('')._evaluator
|
||||||
|
try:
|
||||||
|
sys_path = script_evaluator.project.sys_path
|
||||||
|
except AttributeError:
|
||||||
|
sys_path = script_evaluator.sys_path
|
||||||
|
for p in sys_path:
|
||||||
|
echo("printf(' - `%s`', {0!r})".format(p))
|
||||||
|
except Exception as e:
|
||||||
|
echo("printf('There was an error accessing jedi_vim.jedi: %s', "
|
||||||
|
"{0!r})".format(e))
|
||||||
1
pythonx/parso
Submodule
1
pythonx/parso
Submodule
Submodule pythonx/parso added at 2ca629a2f6
@@ -8,9 +8,22 @@ describe 'completions'
|
|||||||
end
|
end
|
||||||
|
|
||||||
after
|
after
|
||||||
|
" default
|
||||||
|
let g:jedi#popup_select_first = 1
|
||||||
bd!
|
bd!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'smart import'
|
||||||
|
exec "normal ifrom os "
|
||||||
|
Expect getline('.') == 'from os import '
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'no smart import after space'
|
||||||
|
exec "normal! ifrom os "
|
||||||
|
exec "normal a "
|
||||||
|
Expect getline('.') == 'from os '
|
||||||
|
end
|
||||||
|
|
||||||
it 'import'
|
it 'import'
|
||||||
" X is the completion command
|
" X is the completion command
|
||||||
normal oimporX
|
normal oimporX
|
||||||
@@ -26,26 +39,32 @@ describe 'completions'
|
|||||||
Expect getline('.') == 'IndentationError().filename'
|
Expect getline('.') == 'IndentationError().filename'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'dot_open'
|
it 'multi complete'
|
||||||
normal oraisX ImpXErrX()
|
normal oImpXErrX()
|
||||||
Expect getline('.') == 'raise ImportError()'
|
Expect getline('.') == 'ImportError()'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'cycling through entries'
|
it 'cycling through entries popup_select_first=0'
|
||||||
" testing select_first doesn't seem to work in ex mode
|
|
||||||
execute "normal oraise impX\<C-n>\<C-n>\<C-n>"
|
|
||||||
Expect getline('.') == 'raise ImportWarning'
|
|
||||||
let g:jedi#popup_select_first = 0
|
let g:jedi#popup_select_first = 0
|
||||||
execute "normal oraise impX\<C-n>\<C-n>\<C-n>"
|
execute "normal oraise impX\<C-n>"
|
||||||
Expect getline('.') == 'raise ImportWarning'
|
" It looks like this is currently not working properly.
|
||||||
let g:jedi#popup_select_first = 1
|
"Expect getline('.') == 'raise ImportError'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'cycling through entries popup_select_first=1'
|
||||||
|
execute "normal oraise impX\<C-n>"
|
||||||
|
Expect getline('.') == 'raise ImportWarning'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'longest'
|
||||||
" -longest completes the first one
|
" -longest completes the first one
|
||||||
set completeopt -=longest
|
set completeopt -=longest
|
||||||
execute "normal oraise baseX"
|
execute "normal oraise baseX"
|
||||||
Expect getline('.') == 'raise BaseException'
|
Expect getline('.') == 'raise BaseException'
|
||||||
set completeopt +=longest
|
set completeopt +=longest
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'dot_open'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ describe 'documentation docstrings'
|
|||||||
it 'simple'
|
it 'simple'
|
||||||
put = 'ImportError'
|
put = 'ImportError'
|
||||||
normal GK
|
normal GK
|
||||||
Expect bufname('%') == "'__doc__'"
|
Expect bufname('%') == "__doc__"
|
||||||
Expect &filetype == 'rst'
|
Expect &filetype == 'rst'
|
||||||
let content = join(getline(1,'$'), "\n")
|
let content = join(getline(1,'$'), "\n")
|
||||||
Expect stridx(content, "Import can't find module") > 0
|
Expect stridx(content, "Import can't find module") > 0
|
||||||
@@ -23,7 +23,7 @@ describe 'documentation docstrings'
|
|||||||
|
|
||||||
it 'no documentation'
|
it 'no documentation'
|
||||||
put = 'x = 2'
|
put = 'x = 2'
|
||||||
normal G0K
|
normal o<ESC>GK
|
||||||
Expect bufname('%') == ''
|
Expect bufname('%') == ''
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
135
test/goto.vim
135
test/goto.vim
@@ -2,7 +2,7 @@ let mapleader = '\'
|
|||||||
source plugin/jedi.vim
|
source plugin/jedi.vim
|
||||||
source test/utils.vim
|
source test/utils.vim
|
||||||
|
|
||||||
describe 'goto_simple'
|
describe 'goto simple'
|
||||||
before
|
before
|
||||||
new " open a new split
|
new " open a new split
|
||||||
set filetype=python
|
set filetype=python
|
||||||
@@ -20,13 +20,13 @@ describe 'goto_simple'
|
|||||||
bd!
|
bd!
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'goto_definitions'
|
it 'goto definitions'
|
||||||
silent normal \d
|
normal \d
|
||||||
Expect line('.') == 1
|
Expect line('.') == 1
|
||||||
"Expect col('.') == 5 " not working yet.
|
Expect col('.') == 5
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'goto_assignments'
|
it 'goto assignments'
|
||||||
silent normal \g
|
silent normal \g
|
||||||
Expect line('.') == 2
|
Expect line('.') == 2
|
||||||
Expect col('.') == 1
|
Expect col('.') == 1
|
||||||
@@ -45,9 +45,10 @@ describe 'goto_simple'
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
describe 'goto_with_tabs'
|
describe 'goto with tabs'
|
||||||
before
|
before
|
||||||
set filetype=python
|
set filetype=python
|
||||||
|
let g:jedi#use_tabs_not_buffers = 1
|
||||||
end
|
end
|
||||||
|
|
||||||
after
|
after
|
||||||
@@ -55,7 +56,7 @@ describe 'goto_with_tabs'
|
|||||||
bd!
|
bd!
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'follow_import'
|
it 'follow import'
|
||||||
put = ['import subprocess', 'subprocess']
|
put = ['import subprocess', 'subprocess']
|
||||||
silent normal G\g
|
silent normal G\g
|
||||||
Expect getline('.') == 'import subprocess'
|
Expect getline('.') == 'import subprocess'
|
||||||
@@ -63,7 +64,7 @@ describe 'goto_with_tabs'
|
|||||||
Expect col('.') == 8
|
Expect col('.') == 8
|
||||||
|
|
||||||
silent normal G\d
|
silent normal G\d
|
||||||
Expect g:current_buffer_is_module('subprocess') == 1
|
Expect CurrentBufferIsModule('subprocess') == 1
|
||||||
Expect line('.') == 1
|
Expect line('.') == 1
|
||||||
Expect col('.') == 1
|
Expect col('.') == 1
|
||||||
Expect tabpagenr('$') == 2
|
Expect tabpagenr('$') == 2
|
||||||
@@ -72,27 +73,30 @@ describe 'goto_with_tabs'
|
|||||||
Expect bufname('%') == ''
|
Expect bufname('%') == ''
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'multi_definitions'
|
it 'multi definitions'
|
||||||
put = ['import tokenize']
|
" This used to behave differently. Now we don't have any real multi
|
||||||
silent normal G$\d
|
" definitions.
|
||||||
Expect g:current_buffer_is_module('tokenize') == 0
|
|
||||||
Expect g:current_buffer_is_module('token') == 0
|
|
||||||
execute "normal \<CR>"
|
|
||||||
Expect tabpagenr('$') == 2
|
|
||||||
Expect winnr('$') == 1
|
|
||||||
Expect g:current_buffer_is_module('token') == 1
|
|
||||||
|
|
||||||
bd
|
" put = ['import tokenize']
|
||||||
silent normal G$\d
|
" silent normal G$\d
|
||||||
execute "normal j\<CR>"
|
" Expect CurrentBufferIsModule('tokenize') == 1
|
||||||
Expect tabpagenr('$') == 2
|
" Expect CurrentBufferIsModule('token') == 0
|
||||||
Expect winnr('$') == 1
|
" execute "normal \<CR>"
|
||||||
Expect g:current_buffer_is_module('tokenize') == 1
|
" Expect tabpagenr('$') == 2
|
||||||
|
" Expect winnr('$') == 1
|
||||||
|
" Expect CurrentBufferIsModule('token') == 1
|
||||||
|
|
||||||
|
" bd
|
||||||
|
" silent normal G$\d
|
||||||
|
" execute "normal j\<CR>"
|
||||||
|
" Expect tabpagenr('$') == 2
|
||||||
|
" Expect winnr('$') == 1
|
||||||
|
" Expect CurrentBufferIsModule('tokenize') == 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
describe 'goto_with_buffers'
|
describe 'goto with buffers'
|
||||||
before
|
before
|
||||||
set filetype=python
|
set filetype=python
|
||||||
let g:jedi#use_tabs_not_buffers = 0
|
let g:jedi#use_tabs_not_buffers = 0
|
||||||
@@ -104,46 +108,46 @@ describe 'goto_with_buffers'
|
|||||||
set nohidden
|
set nohidden
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'no_new_tabs'
|
it 'no new tabs'
|
||||||
put = ['import os']
|
put = ['import os']
|
||||||
normal G$
|
normal G$
|
||||||
call jedi#goto_assignments()
|
call jedi#goto_assignments()
|
||||||
python jedi_vim.goto()
|
PythonJedi jedi_vim.goto()
|
||||||
Expect g:current_buffer_is_module('os') == 0
|
Expect CurrentBufferIsModule('os') == 0
|
||||||
" Without hidden, it's not possible to open a new buffer, when the old
|
" Without hidden, it's not possible to open a new buffer, when the old
|
||||||
" one is not saved.
|
" one is not saved.
|
||||||
set hidden
|
set hidden
|
||||||
call jedi#goto_assignments()
|
call jedi#goto_assignments()
|
||||||
Expect g:current_buffer_is_module('os') == 1
|
Expect CurrentBufferIsModule('os') == 1
|
||||||
Expect winnr('$') == 1
|
Expect winnr('$') == 1
|
||||||
Expect tabpagenr('$') == 1
|
Expect tabpagenr('$') == 1
|
||||||
Expect line('.') == 1
|
Expect line('.') == 1
|
||||||
Expect col('.') == 1
|
Expect col('.') == 1
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'multi_definitions'
|
it 'multi definitions'
|
||||||
set hidden
|
" set hidden
|
||||||
put = ['import tokenize']
|
" put = ['import tokenize']
|
||||||
silent normal G$\d
|
" silent normal G$\d
|
||||||
Expect g:current_buffer_is_module('tokenize') == 0
|
" Expect CurrentBufferIsModule('tokenize') == 0
|
||||||
Expect g:current_buffer_is_module('token') == 0
|
" Expect CurrentBufferIsModule('token') == 0
|
||||||
execute "normal \<CR>"
|
" execute "normal \<CR>"
|
||||||
Expect tabpagenr('$') == 1
|
" Expect tabpagenr('$') == 1
|
||||||
Expect winnr('$') == 1
|
" Expect winnr('$') == 1
|
||||||
Expect g:current_buffer_is_module('token') == 1
|
" Expect CurrentBufferIsModule('token') == 1
|
||||||
|
|
||||||
bd
|
" bd
|
||||||
silent normal G$\d
|
" silent normal G$\d
|
||||||
execute "normal j\<CR>"
|
" execute "normal j\<CR>"
|
||||||
Expect tabpagenr('$') == 1
|
" Expect tabpagenr('$') == 1
|
||||||
Expect winnr('$') == 1
|
" Expect winnr('$') == 1
|
||||||
Expect g:current_buffer_is_module('tokenize') == 1
|
" Expect CurrentBufferIsModule('tokenize') == 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
describe 'goto_with_splits'
|
describe 'goto with splits'
|
||||||
before
|
before
|
||||||
set filetype=python
|
set filetype=python
|
||||||
let g:jedi#use_splits_not_buffers = 'left'
|
let g:jedi#use_splits_not_buffers = 'left'
|
||||||
@@ -154,7 +158,7 @@ describe 'goto_with_splits'
|
|||||||
bd!
|
bd!
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'follow_import'
|
it 'follow import'
|
||||||
put = ['import subprocess', 'subprocess']
|
put = ['import subprocess', 'subprocess']
|
||||||
silent normal G\g
|
silent normal G\g
|
||||||
Expect getline('.') == 'import subprocess'
|
Expect getline('.') == 'import subprocess'
|
||||||
@@ -162,7 +166,7 @@ describe 'goto_with_splits'
|
|||||||
Expect col('.') == 8
|
Expect col('.') == 8
|
||||||
|
|
||||||
silent normal G\d
|
silent normal G\d
|
||||||
Expect g:current_buffer_is_module('subprocess') == 1
|
Expect CurrentBufferIsModule('subprocess') == 1
|
||||||
Expect line('.') == 1
|
Expect line('.') == 1
|
||||||
Expect col('.') == 1
|
Expect col('.') == 1
|
||||||
Expect winnr('$') == 2
|
Expect winnr('$') == 2
|
||||||
@@ -173,4 +177,41 @@ describe 'goto_with_splits'
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
describe 'goto wildignore'
|
||||||
|
before
|
||||||
|
set filetype=python
|
||||||
|
set wildignore=*,with\ spaces,*.pyc
|
||||||
|
set hidden
|
||||||
|
let g:jedi#use_tag_stack = 1
|
||||||
|
let g:jedi#use_tabs_not_buffers = 0
|
||||||
|
" Need to use splits for code coverage in new_buffer()
|
||||||
|
let g:jedi#use_splits_not_buffers = 1
|
||||||
|
|
||||||
|
put = ['from subprocess import Popen', 'Popen']
|
||||||
|
Expect CurrentBufferIsModule('subprocess') == 0
|
||||||
|
silent normal G
|
||||||
|
end
|
||||||
|
|
||||||
|
after
|
||||||
|
bd!
|
||||||
|
bd!
|
||||||
|
set wildignore&vim
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'restores wildignore'
|
||||||
|
let before = &wildignore
|
||||||
|
call jedi#goto()
|
||||||
|
Expect getline('.') =~ 'Popen'
|
||||||
|
Expect &wildignore == before
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'not using tagstack'
|
||||||
|
let g:jedi#use_tag_stack = 0
|
||||||
|
call jedi#goto()
|
||||||
|
Expect CurrentBufferIsModule('subprocess') == 1
|
||||||
|
Expect getline('.') =~ 'Popen'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
" vim: et:ts=4:sw=4
|
" vim: et:ts=4:sw=4
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ source plugin/jedi.vim
|
|||||||
source test/utils.vim
|
source test/utils.vim
|
||||||
|
|
||||||
describe 'pyimport'
|
describe 'pyimport'
|
||||||
|
before
|
||||||
|
let g:jedi#use_tabs_not_buffers = 1
|
||||||
|
end
|
||||||
|
|
||||||
after
|
after
|
||||||
bd!
|
bd!
|
||||||
bd!
|
bd!
|
||||||
@@ -9,9 +13,9 @@ describe 'pyimport'
|
|||||||
|
|
||||||
it 'open_tab'
|
it 'open_tab'
|
||||||
Pyimport os
|
Pyimport os
|
||||||
Expect g:current_buffer_is_module('os') == 1
|
Expect CurrentBufferIsModule('os') == 1
|
||||||
Pyimport subprocess
|
Pyimport subprocess
|
||||||
Expect g:current_buffer_is_module('subprocess') == 1
|
Expect CurrentBufferIsModule('subprocess') == 1
|
||||||
" the empty tab is sometimes also a tab
|
" the empty tab is sometimes also a tab
|
||||||
Expect tabpagenr('$') >= 2
|
Expect tabpagenr('$') >= 2
|
||||||
end
|
end
|
||||||
@@ -19,10 +23,14 @@ describe 'pyimport'
|
|||||||
it 'completion'
|
it 'completion'
|
||||||
" don't know how to test this directly
|
" don't know how to test this directly
|
||||||
"execute "Pyimport subproc\<Tab>"
|
"execute "Pyimport subproc\<Tab>"
|
||||||
"Expect g:current_buffer_is_module('subprocess') == 1
|
"Expect CurrentBufferIsModule('subprocess') == 1
|
||||||
|
|
||||||
Expect jedi#py_import_completions('subproc', 0, 0) == 'subprocess'
|
Expect jedi#py_import_completions('subproc', 0, 0) == 'subprocess'
|
||||||
Expect jedi#py_import_completions('subprocess', 0, 0) == 'subprocess'
|
Expect jedi#py_import_completions('subprocess', 0, 0) == 'subprocess'
|
||||||
Expect jedi#py_import_completions('zip', 0, 0) == "zipfile\nzipimport"
|
let g:comp = jedi#py_import_completions('zip', 0, 0)
|
||||||
|
" Sometimes zipapp is in there sometimes not, depends on Python
|
||||||
|
" version.
|
||||||
|
let g:comp = substitute(g:comp, '^zipapp\n', '', '')
|
||||||
|
Expect g:comp == "zipfile\nzipimport"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -11,14 +11,41 @@ describe 'signatures'
|
|||||||
end
|
end
|
||||||
|
|
||||||
it 'simple'
|
it 'simple'
|
||||||
normal ostr(
|
normal odef xyz(number): return
|
||||||
|
normal o
|
||||||
|
normal oxyz(
|
||||||
|
normal G$
|
||||||
" equals doautocmd CursorMovedI
|
" equals doautocmd CursorMovedI
|
||||||
Python jedi_vim.show_call_signatures()
|
Python jedi_vim.show_call_signatures()
|
||||||
|
|
||||||
Expect getline(1) == '≡jedi=0, ≡ (*obj*) ≡jedi≡'
|
Expect getline(3) == '?!?jedi=0, ?!? (*_*number*_*) ?!?jedi?!?'
|
||||||
|
|
||||||
doautocmd InsertLeave
|
doautocmd InsertLeave
|
||||||
Expect getline(1) == ''
|
Expect getline(3) == ''
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'multiple buffers'
|
||||||
|
set hidden
|
||||||
|
new
|
||||||
|
setfiletype python
|
||||||
|
redir => autocmds
|
||||||
|
autocmd jedi_call_signatures * <buffer>
|
||||||
|
redir END
|
||||||
|
Expect autocmds =~# 'jedi_call_signatures'
|
||||||
|
buffer #
|
||||||
|
redir => autocmds
|
||||||
|
autocmd jedi_call_signatures * <buffer>
|
||||||
|
redir END
|
||||||
|
Expect autocmds =~# 'jedi_call_signatures'
|
||||||
|
bd!
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'simple after CursorHoldI with only parenthesis'
|
||||||
|
noautocmd normal o
|
||||||
|
doautocmd CursorHoldI
|
||||||
|
noautocmd normal istr(
|
||||||
|
doautocmd CursorHoldI
|
||||||
|
Expect getline(1) == '?!?jedi=0, ?!? (*_*object*_*) ?!?jedi?!?'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'no signature'
|
it 'no signature'
|
||||||
@@ -28,12 +55,79 @@ describe 'signatures'
|
|||||||
end
|
end
|
||||||
|
|
||||||
it 'signatures disabled'
|
it 'signatures disabled'
|
||||||
let g:jedi#show_signatures = 0
|
let g:jedi#show_call_signatures = 0
|
||||||
|
|
||||||
normal ostr(
|
normal ostr(
|
||||||
Python jedi_vim.show_call_signatures()
|
Python jedi_vim.show_call_signatures()
|
||||||
Expect getline(1, '$') == ['', 'str( ']
|
Expect getline(1, '$') == ['', 'str( ']
|
||||||
|
|
||||||
let g:jedi#show_signatures = 1
|
let g:jedi#show_call_signatures = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'command line simple'
|
||||||
|
let g:jedi#show_call_signatures = 2
|
||||||
|
call jedi#configure_call_signatures()
|
||||||
|
|
||||||
|
normal ostr(
|
||||||
|
redir => msg
|
||||||
|
Python jedi_vim.show_call_signatures()
|
||||||
|
redir END
|
||||||
|
Expect msg == "\nstr(object)"
|
||||||
|
|
||||||
|
redir => msg
|
||||||
|
doautocmd InsertLeave
|
||||||
|
redir END
|
||||||
|
Expect msg == "\n"
|
||||||
|
|
||||||
|
normal Sdef foo(a, b): pass
|
||||||
|
normal ofoo(a, b, c,
|
||||||
|
redir => msg
|
||||||
|
Python jedi_vim.show_call_signatures()
|
||||||
|
redir END
|
||||||
|
Expect msg == "\nfoo(a, b)"
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'command line truncation'
|
||||||
|
let g:jedi#show_call_signatures = 2
|
||||||
|
call jedi#configure_call_signatures()
|
||||||
|
|
||||||
|
function! Signature()
|
||||||
|
redir => msg
|
||||||
|
Python jedi_vim.show_call_signatures()
|
||||||
|
redir END
|
||||||
|
return msg
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let funcname = repeat('a', &columns - 30)
|
||||||
|
put = 'def '.funcname.'(arg1, arg2, arg3, a, b, c):'
|
||||||
|
put = ' pass'
|
||||||
|
execute "normal o".funcname."( "
|
||||||
|
Expect Signature() == "\n".funcname."(arg1, …)"
|
||||||
|
|
||||||
|
normal sarg1,
|
||||||
|
Expect Signature() == "\n".funcname."(…, arg2, …)"
|
||||||
|
|
||||||
|
normal sarg2, arg3,
|
||||||
|
Expect Signature() == "\n".funcname."(…, a, b, c)"
|
||||||
|
|
||||||
|
normal sa, b,
|
||||||
|
Expect Signature() == "\n".funcname."(…, c)"
|
||||||
|
|
||||||
|
g/^/d
|
||||||
|
put = 'def '.funcname.'('.repeat('b', 20).', arg2):'
|
||||||
|
put = ' pass'
|
||||||
|
execute "normal o".funcname."( "
|
||||||
|
Expect Signature() == "\n".funcname."(…)"
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'command line no signature'
|
||||||
|
let g:jedi#show_call_signatures = 2
|
||||||
|
call jedi#configure_call_signatures()
|
||||||
|
|
||||||
|
normal ostr
|
||||||
|
redir => msg
|
||||||
|
Python jedi_vim.show_call_signatures()
|
||||||
|
redir END
|
||||||
|
Expect msg == "\n"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
function! g:current_buffer_is_module(module_name)
|
function! CurrentBufferIsModule(module_name)
|
||||||
return g:ends_with(bufname('%'), a:module_name.'.py')
|
return EndsWith(bufname('%'), a:module_name.'.py')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function g:ends_with(string, end)
|
function EndsWith(string, end)
|
||||||
let l:should = len(a:string) - strlen(a:end)
|
let l:should = len(a:string) - strlen(a:end)
|
||||||
return l:should == stridx(a:string, a:end, should)
|
return l:should == stridx(a:string, a:end, should)
|
||||||
endfunction
|
endfunction
|
||||||
|
|||||||
Reference in New Issue
Block a user