pythonvim插件安装
‘壹’ 怎么装python编辑器vim
增加tab键长度为4的,在/etc/vimrc里面设置set
tabstop=4,效果如下
设置语法高亮,主要是设置syntax
on
下载安装vundle,如下目录
安装好之后,用VundleInstall安装nerdtree,
上面显示正在安装,之后安装完成就可以看到
‘贰’ 如何用 Python 给 Vim 写插件
vim中执行python命令
在vim中可以使用py[thon] {stmt}来执行python语句{stmt},你可以用:python print "Hello World!"来验证一下。
只能执行一条语句,没什么用,不是吗?所以有更加强大的接口,语法如下:
py[thon] << {endmarker}
{script}
{endmarker}
<!-- more -->
这样我们就可以执行python脚本{script}中的内容了。{endmarker}是一个标记符号,可以是任何内容,不过{endmarker}后面不能有任何的空白字符。看一个简单的例子,假设下面代码保存为script_demo.vim:
function! Foo()
python << EOF
class Foo_demo:
def __init__(self):
print 'Foo_demo init'
Foo_demo()
EOF
endfunction
那么在vim中我们先用:source path_to_script/script_demo.vim来加载脚本,然后就可以用:call Foo()来运行python脚本了,整个过程如图所示:
此外,我们还可以将python脚本放到一个单独的.py文件中,然后用pyf[ile] {file}来运行python文件中的程序,要注意这里pyf[ile]后面的所有参数被看做是一个文件的名字。
vim模块
我们已经可以在vim中执行python命令了,但是python怎么获取vim中的一些信息呢?比如说我想知道vim当前缓冲区一共有多少行内容,然后获取最后一行的内容,用python该怎么做呢?
于是vim提供了一个python模块,有趣的是模块名字就叫做vim,我们可以用它来获取vim编辑器里面的所有信息。上面问题用以下python脚本就可以解决了:
function! Bar()
python << EOF
import vim
cur_buf = vim.current.buffer
print "Lines: {0}".format(len(cur_buf))
print "Contents: {0}".format(cur_buf[-1])
EOF
endfunction
你可以自己加载脚本运行一下见证奇迹!上面代码出现了vim.current.buffer,想必你已经从名字猜到了它的意思了,不过还是来详细看下吧:
vim模块中的常量
vim.buffers: 用来访问vim中缓冲区的列表对象,可以进行如下操作:
:py b = vim.buffers[i] # Indexing (read-only)
:py b in vim.buffers # Membership test
:py n = len(vim.buffers) # Number of elements
:py for b in vim.buffers: # Iterating over buffer list
vim.windows: 用来访问vim中窗口的列表对象,和vim.buffers支持的操作基本相。
vim.current: 用来访问vim中当前位置的各种信息,比如:
vim.current.line
vim.current.buffer
vim.current.window
vim.current.tabpage
vim.current.range
vim.vvars: 类似字典的对象,用来存储global(g:)变量或者vim(v:)变量。
还有其他的一些常量,这里不做叙述。注意这里的常量并不是真正意义上的常量,你可以重新给他们赋值。但是我们应该避免这样做,因为这样会丢失该常量引用的值。现在为止我们已经能获取vim中数据,然后用python来对其进行操作,似乎完美了。
不过vim并没有止步于此,它可是Stronger than Stronger!因为我们可以在python里使用vim强大的命令集,这样就可以用python写一些常用的批处理插件,看下面简单的例子:
function! Del(number)
python << EOF
import vim
num = vim.eval("a:number")
vim.command("normal gg{0}dd".format(num))
vim.command("w")
EOF
endfunction
可以调用上面函数Del(n)用来删除当前缓冲区前n行的内容(只是示例而已,现实中别这么做!)上面用到了eval和command函数,如下:
vim模块中两个主要的方法
vim.command(str): 执行vim中的命令str(ex-mode,命令模式下的命令),返回值为None,比如:
:py vim.command("%s/aaa/bbb/g")
也可以用`vim.command("normal "+str)`来执行normal模式下的命令,比如说用以下命令删除当前行的内容:
:py vim.command("normal "+'dd')
vim.eval(str): 用vim内部的解释器来计算str中的内容,返回值可以是字符串、字典、或者列表,比如计算12+12的值:
:py print vim.eval("12+12")
将返回结算结果24。
前面的Del函数还提供了一个number参数,在vimL里面可以通过let arg=a:number来使用,在python中通过vim.eval("a:number")来使用。也可以通过参数位置来访问,比如let arg=a:0或者是vim.eval("a:0")。我们可以使用"..."来代替命名参数来定义一个能接收任意数量参数的函数,不过这样只能通过位置来访问。
vim模块还提供了一个异常处理对象vim.error,使用vim模块时一旦出现错误,将会触发一个vim.error异常,简单的例子如下:
try:
vim.command("put a")
except vim.error:
# nothing in register a
vim模块提供的对象
到这里你基本能用python来对缓冲区进行基本的操作,比如删除行或者是在指定行添加内容等。不过在缓冲区添加内容会很不pythoner,因为你得使用command来调用vim的i/I/a/A命令。好在有更科学的方式,那就是利用vim模块提供的对象来进行操作,看下面简单的例子:
function! Append()
python << EOF
import vim
cur_buf = vim.current.buffer
lens = len(cur_buf)
cur_buf.append('" Demo', lens)
EOF
endfunction
Append函数在当前缓冲区的结尾添加注释内容" Demo,缓冲区对象是怎么一会儿事呢?
缓冲区对象
vim模块提供了缓冲区对象来让我们对缓冲区进行操作,该对象有两个只读属性name和number,name为当前缓冲区文件的名称(包含绝对路径),number为缓冲区的数量。还有一个bool属性valid,用来标识相关缓冲区是否被擦除。
缓冲区对象有以下几种方法:
b.append(str): 在当前行的下面插入新的行,内容为str;
b.append(str, n): 在第n行的下面插入新的行,内容为str;
b.append(list)
b.append(list, n): 插入多行到缓冲区中;
b.range(s,e): 返回一个range对象表示缓冲区中s到e行的内容。
注意使用append添加新行str时,str中一定不能包含换行符"\n"。str结尾可以有"\n",但会被忽略掉。
缓冲区对象的range方法会返回一个range对象来代表部分的缓冲区内容,那么range对象又有那些属性以及方法呢?
其实在操作上range对象和缓冲区对象基本相同,除了range对象的操作均是在指定的区域上。range对象有两个属性start和end,分别是range对象的起始和结尾行。它的方法有r.append(str),r.append(str,
n)和r.append(list),r.append(list, n)。
我们可以通过vim.windows来获取vim中的窗口对象,我们只能通过窗口对象的属性来对其进行操作,因为它没有提供方法或者其他接口来操作。其中只读属性有buffer、number、tabpage等,读写属性有cursor、height、width、valid等。具体可以查看帮助:h python-window
‘叁’ 虚拟环境工具pyenv的安装,配置和使用,完美控制python版本
使用
使用 pyenv 和 pyenv-virtualenv ,在 linux 下完美隔离 python 各个版本
第 1 章:使用环境
注意: 本文的 Linux和Mac OS X 下进行,不涉及 windows下的安装使用
清单
git
bash,zsh或者brew
pyenv
pyenv-virtualenv
1、安装 git
在各大 Linux 的发行版下安装 git 都非常简单,此处只展示部分示例
archlinux
sudo pacman -S git
debian/ubuntu
sudo apt install git
centos
sudo yum install git
Mac
brew install git
2、开启终端
Ubuntu下使用 shell
Ctrl + Alt + t 快捷键打开终端
3、安装 pyenv
说明: 本文的所有安装都严格遵守官方文档,与官方文档完全保持一致。
源码git 地址:github.com/pyenv/pyenv
在终端中执行如下命令完成安装:
首先把项目克隆下来,放在家目录下的隐藏文件夹中:.pyenv
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
如果你是Mac用户,可以使用brew命令来安装
brew update
brew install pyenv
然后配置环境变量:
如果你使用 bash,就依次执行如下命令:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; thenn eval "$(pyenv init -)"nfi' >> ~/.bashrc
如果你使用 zsh,就依次执行如下命令:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; thenn eval "$(pyenv init -)"nfi' >> ~/.zshrc
如果你用Mac,就执行如下命令:
echo -e 'if command -v pyenv 1>/dev/null 2>&1; thenn eval "$(pyenv init-)"nfi' >> ~/.bash_profile
echo 命令的含义是:将引号中内容写入某文件中
请注意,以上的三条 echo 命令的最后一条命令,请保证它引号中的内容处于 ~/.bashrc 或者 ~/.zshrc 的最底部。
因为在 pyenv 初始化期间会操作 path 环境变量,导致不可预测的行为。
查看文件的底部内容,可以使用 tail 命令,用法:tail ~/.bashrc 或者 tail ~/.zshrc,编辑文件可以使用 vim 或者 vscode
然后,在使用 pyenv 之前,需要初始化 shell 环境,执行如下命令
exec $SHELL或者source ~/.bashrc
同样也可以关闭当前的终端窗口,重新启动一个。
4、安装 pyenv-virtualenv
源码git 地址:github.com/pyenv/pyenv…
把插件克隆在刚才已经安装完毕的 pyenv 的 plugins 文件夹中
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
如果你是Mac用户可以使用brew命令来安装
brew install pyenv-virtualenv
然后配置环境变量
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
如果你使用 bash,就执行如下命令:
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
如果你使用 zsh,就执行如下命令:
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
最后,在使用 pyenv 之前,重新初始化 shell 环境,执行如下命令
exec $SHELL或者source ~/.bashrc
或者重启一个终端窗口。
没有出错的话,此时已经完成了所有的安装操作,如果提示错误,请检查前文中的==路径==和==环境变量==(请检查是否使用对应系统环境的命令)是否配置正确,或者将操作回退,重新执行安装命令
第 2 章:使用 pyenv
此处仅展示 pyenv 和 pyenv-virtualenv 的日常用法
检查安装是否正确
检查 pyenv 的版本
pyenv version
查看 pyenv 已经托管了哪些 python 版本
pyenv versions
如果显示了正常的版本信息,说明安装成功,如果显示类似于 command not found 之类的提示,说明安装失败,请查看第一章末尾的提示。
安装 3.6.6 版本的 python
pyenv install 3.6.6
这里需要注意,某些情况下会安装失败,Build failed.
Don't panic,我们可以查看pyenv在github wiki里面准备的应对方案,原文地址 github.com/pyenv/pyenv…
摘录如下,只需要执行对应的命令即可:
archlinux用户
sudo pacman -S base-devel openssl zlib
Mac用户
brew install openssl readline sqlite3 xz zlib
如果你使用的是OS X Mojave或者更高的版本(10.14+),还需要执行一下命令
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
Ubuntu/Debian/Mint用户
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev
CentOS/Fedora <= 21 用户,确保已经安装了 xz 工具
sudo yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel
Fedora >= 22 用户,确保已经安装了 xz 工具
sudo dnf install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel
openSUSE用户
zypper install gcc automake openssl-devel ncurses-devel readline-devel zlib-devel tk-devel
Solus 用户
sudo eopkg it -c system.devel
sudo eopkg install git gcc make zlib-devel bzip2-devel readline-devel sqlite3-devel openssl-devel tk-devel
Linuxbrew用户
brew install bzip2 openssl readline sqlite xz
安装完这些补充的工具之后,再次执行:
pyenv install 3.6.6
就可以成功了,你可以不断的使用pyenv versions来查看被 pyenv 托管的 python 版本,多版本之间不会冲突,完美共存
执行pyenv install,然后按下 tab 键,就可以看到所有可选的安装版本
如何使用已经安装的版本创建虚拟环境
pyenv和pyenv-virtualenv的协作可以这么理解:
pyenv 托管安装的 python 版本,python-virtualenv 则调用对应的 python 版本
下面是如何创建和使用虚拟环境
1. 创建虚拟环境
首先需要创建一个虚拟环境,执行命令:
pyenv virtualenv 3.6.6 my-env
最后一个是环境的名字,可以随便取。安装成功会显示:
Looking in links: /tmp/tmp0eywgc7v
Requirement already satisfied: setuptools in /home/vic/.pyenv/versions/3.6.6/envs/my-env/lib/python3.6/site-packages (39.0.1)
Requirement already satisfied: pip in /home/vic/.pyenv/versions/3.6.6/envs/my-env/lib/python3.6/site-packages (10.0.1)
它写明了该虚拟环境的绝对路径。
2. 激活虚拟环境
在任意目录下,执行命令:
pyenv activate my-env
复制代码在终端命令行前面,会出现(my-env) 的提示,进入python环境可以看到版本为虚拟环境设定的3.6.6,使用pip --version,可以看到 pip 包安装的绝对路径
使用终端进入任意目录,比如 ~/envtest
cd ~/envtest
然后在该目录下执行:
pyenv local my-env
也可以激活创建好的虚拟环境,执行:
ls -al
local命令和之前的命令区别在于,在 ~/envtest 目录下,会创建一个隐藏文件 .python-version,文件内容只包含一句话 my-env,只要使用终端进入 ~/test 目录,就会自动激活虚拟环境
退出虚拟环境使用下面两个中任意一条命令
pyenv deactivate # 或者
source deactivate
3. 删除虚拟环境
随着时间推移,你可能积攒很多虚拟环境,删除虚拟环境可以使用命令
pyenv uninstall my-env或者rm -rf my-env直接删除虚拟环境所在的目录
第 3 章:更新 pyenv
如果是用 git 克隆的,更新则使用git pull命令
cd ~/.pyenv 或者 cd $(pyenv root)
git pull origin master
Mac用户则使用brew命令
brew upgrade pyenv
第 4 章:卸载 pyenv
由于 pyenv 把一切都放在 ~/.pyenv 下了,所以Linux下卸载分为两步
删除环境变量
执行:rm -rf ~/.pyenv或者 rm -rf $(pyenv root)
Mac用户卸载需要使用brew命令:
brew uninstall pyenv
‘肆’ 如何用 Python 给 Vim 写插件
vim有各种强大的插件,这不仅归功于其提供的用来编写插件的脚本语言vimL,还得益于它良好的接口实现,从而支持python等语言编写插件。当vim编译时带有+python特性时就能使用python2.x编写插件,+python3则支持python3.x,可以使用vim --version来查看vim的编译特性。
要使用python接口,可以用:h python来查看vim提供的帮助文档,本文做一个简单的介绍。我们都知道在vim里可以执行bash命令,只需要:!command即可,那么vim里可以执行python语句吗?当然可以了,vim那么强大!不是吗,是吗?!
vim中执行python命令
在vim中可以使用py[thon] {stmt}来执行python语句{stmt},你可以用:python print "Hello World!"来验证一下。
只能执行一条语句,没什么用,不是吗?所以有更加强大的接口,语法如下:
py[thon] << {endmarker}
{script} {endmarker}
这样我们就可以执行python脚本{script}中的内容了。{endmarker}是一个标记符号,可以是任何内容,不过{endmarker}后面不能有任何的空白字符。看一个简单的例子,假设下面代码保存为script_demo.vim:
function! Foo()
python << EOF
class Foo_demo:
def __init__(self):
print 'Foo_demo init'
Foo_demo()
EOF
endfunction
‘伍’ 如何启用vim自带python自动补全功能
这里介绍一下 Python omni complete, 安装启用之后,是这个样子的:
1. 如何安装 'python omni complete' plugin.
如果是VIM7.3,不需要再下载 pythoncomplete.vim 这个插件,因为安装时自带了。
但是, 必须保证编译安装 VIM 的时候启用了 Python 特性, 即
./configure --with-features=huge --enable-pythoninterp=yes
因为,pythoncomplete.vim 是用 python 写的。
我们可以在vim autoload 目录下看到
ls -la /usr/local/share/vim/vim73/autoload/
drwxr-xr-x 3 root root 4096 2011-02-16 16:29 .
drwxr-xr-x 17 root root 4096 2011-02-16 16:29 ..
-rw-r--r-- 1 root root 3669 2011-02-16 16:29 adacomplete.vim
-rw-r--r-- 1 root root 22439 2011-02-16 16:29 ada.vim
-rw-r--r-- 1 root root 16938 2011-02-16 16:29 ccomplete.vim
-rw-r--r-- 1 root root 15922 2011-02-16 16:29 csscomplete.vim
-rw-r--r-- 1 root root 2998 2011-02-16 16:29 decada.vim
-rw-r--r-- 1 root root 23804 2011-02-16 16:29 getscript.vim
-rw-r--r-- 1 root root 5331 2011-02-16 16:29 gnat.vim
-rw-r--r-- 1 root root 6093 2011-02-16 16:29 gzip.vim
-rw-r--r-- 1 root root 24253 2011-02-16 16:29 htmlcomplete.vim
-rw-r--r-- 1 root root 27028 2011-02-16 16:29 javascriptcomplete.vim
-rw-r--r-- 1 root root 10130 2011-02-16 16:29 netrwFileHandlers.vim
-rw-r--r-- 1 root root 8684 2011-02-16 16:29 netrwSettings.vim
-rw-r--r-- 1 root root 338720 2011-02-16 16:29 netrw.vim
-rw-r--r-- 1 root root 1232 2011-02-16 16:29 paste.vim
-rw-r--r-- 1 root root 293714 2011-02-16 16:29 phpcomplete.vim
-rw-r--r-- 1 root root 21507 2011-02-16 16:29 python3complete.vim
-rw-r--r-- 1 root root 22019 2011-02-16 16:29 pythoncomplete.vim
-rw-r--r-- 1 root root 773 2011-02-16 16:29 README.txt
-rw-r--r-- 1 root root 23443 2011-02-16 16:29 rubycomplete.vim
-rw-r--r-- 1 root root 6184 2011-02-16 16:29 spellfile.vim
-rw-r--r-- 1 root root 30201 2011-02-16 16:29 sqlcomplete.vim
-rw-r--r-- 1 root root 16839 2011-02-16 16:29 syntaxcomplete.vim
-rw-r--r-- 1 root root 21145 2011-02-16 16:29 tar.vim
-rw-r--r-- 1 root root 12646 2011-02-16 16:29 tohtml.vim
-rw-r--r-- 1 root root 23031 2011-02-16 16:29 vimball.vim
drwxr-xr-x 2 root root 4096 2011-02-16 16:29 xml
-rw-r--r-- 1 root root 14933 2011-02-16 16:29 xmlcomplete.vim
-rw-r--r-- 1 root root 11906 2011-02-16 16:29 zip.vim
如果没有,则下载 pythoncomplete.vim, 并复制到 ~/.vim/autoload/ 目录下。
2. 如何启用自动补全
在 ~/.vimrc 中添加这样两行
[plain] view plain
filetype plugin on
autocmd FileType python set omnifunc=pythoncomplete#Complete
此时,我们就完成了安装及配置工作。
3. 如何使用自动补全
例如我们输入
[python] view plain
import sys
print sys.
此时, 按下 Ctrl+x, Ctrl+o, 就能看到提示列表框,以及对应的 docstring.
Ctrl+n, Ctrl+p 来上下选择
ESC 来取消提示框。
4. 不足之处
a. 属性没有 docstring, 只有函数有。
:( 这个似乎不好搞,因为属性似乎没有 docstring 这个概念。
b. 在没有下拉框的情况下,没有 docstring.
好在, pythoncomplete.vim 是 python 写的,有空大家可以自己完善一下。
‘陆’ 使用vim搭建python开发环境-
最近开始经常需要用vim写代码,这里记录一下自己利用vim搭建基本的python开发环境所使用的插件和一些基本配置
在 ~/.vimrc 文件中,添加如下的信息,完成vim的一些基本配置。
从 GitHub clone Vundle.vim 文件到 ~/.vim/bundle 文件夹下,完成Vundle的安装。
然后修改 ~/.vimrc 文件,添加如下的信息
若使用 Vundle 安装 nerdcommenter 插件,需要中 Vim 的配置文件中添加
然后在 Vim 的命令行模式下执行 :BundleInstall 命令完成插件的安装
nerdcommenter的主要使用方式:
然后在 Vim 的命令行模式下执行 :BundleInstall 命令完成插件的安装
通过vundle安装好NERDTree插件后,在vim命令行模式输入命令:NERDTree就可以看到NERDTree的显示界面。
使用组合按键 Ctrl + w,可将光标自动在左右侧窗口进行切换。
如果想要每次启动vim的时候都默认开启NERDTree。可以在vimrc文件中添加:
jedi-vim插件依赖python开源库 “jedi” ,可以使用pip安装:
Vim 普通模式下按 F7 便可以直接启动 flake8 对当前文件进行语法和格式检查。
以上是我自己用的vim工具配置,如果大家有其他的好用的插件或者配置插件,欢迎一起交流分享呀