vim的python接口
命令 | 作用 | 实例 |
---|---|---|
:py3 {stat} | 执行一条python语句 | :py3fprint(‘hello world’) |
:py3f {file} | 执行一个python模块 | :py3f test.py |
vim提供给python的模块–>vim模块
即在python中可以 import vim 然后使用该模块操作vim
vim.current对象
表示vim当前所在
其中提供了如下属性:
line #当前所在行
buffer #当前所在缓冲区
window #当前所在窗口
tabpage #当前所在标签
buffer,window,tabpage对象均支持python的索引操作
比如:
b = vim.current.buffer
print b.name #打印缓冲区名字
b[0] = ‘hello’ #缓冲区第一行设为hello
b[:] = None #清空缓冲区
del b[:] #清空缓冲区
b[0:0] = [‘a line’] #缓冲区第一行替换为a line
del b[2] #删除缓冲区行,删除的是第三行
b.append(‘bottom’) #在缓冲区尾行添加字符串
n = len(b) #计算缓冲区多少行
(row,col) = b.mark(‘a’) #获得缓冲区中mark所在的行列
r = b.range(1,5) #返回一个返回对象(1,5)
b.vars[‘foo’] = ‘bar’ #设置缓冲区变量
b.options[‘ff’] = ‘dos’ #设置缓冲区选项
del. b.options[‘ar’] #删除缓冲区选项
编写插件
1.内嵌:用 py py<<EOF EOF 等命令嵌入vim插件
2.把代码放在py中,然后vim脚本定义全局变量和map,command调用
实例:手写一个目录管理插件
用到的python模块:
- vim
- pathlib
使用说明:
在vim中执行 :py3f test.py #这里是你保存代码的名字
然后按F9即类似:vsp方式垂直打开一个目录管理窗口
在管理窗口,使用o键,在缓冲区打开文件,或者进入文件夹
截图:
代码:
import vim
from pathlib import *
class FileManage(object):
'''
这是有关文件管理的插件
'''
def __init__(self):
self.pre_b = None
self.b = None
self.pre_w = None
self.w = None
self.p = Path('.').absolute()
def open_win(self):
'''
打开一个窗口用来显示文件和文件夹
'''
#保存之前的buffer
self.pre_b = vim.current.buffer
self.pre_w = vim.current.window
#利用vim命令打开缓冲区,并绑定映射
vim.command(':vsp qqqq')
vim.command(':normal'+' <C-w>h')
vim.command('map <buffer> o :call Open_file()<Esc>') #绑定打开
#获得窗口和缓冲区对象
self.w = vim.current.window
self.b = vim.current.buffer
#设置窗口
self.w.height = 30
#局部缓冲区设置
vim.command('set cursorline')
vim.command('set nonu')
#设置局部缓冲区的设置
#设置窗口的宽度
self.w.width = 30
#把目录下文件写入缓冲区
self.win_show()
def win_show(self):
'''
用来在窗口中打印出指定path路径下的文件和子文件夹
'''
self.b[:] = None #先清空缓冲区
#一些提示信息, ..可用来进入上一层
print('当前的文件夹',self.p)
self.b.append('.. (up a dir)')
self.b.append(f'{str(self.p)}')
#开始迭代子文件和w子文件夹
mulu_n = 3 #记录当前文件夹应该插入的位置,
#文件夹前面插,文件后面插可以分开查看
for i in self.p.iterdir():
j = i.name
if j.startswith('.'):
continue
if i.is_dir():
j = f'[ {j} ]'
self.b.append(j,mulu_n)
mulu_n += 1
continue
self.b.append(j)
def open_file(self):
'''
用户按下o键时候,进入文件或文件夹
'''
l = vim.current.line
#进入光标行指定的目录
if l.startswith('[') and l.endswith(']'):
print('进入文件夹')
self.b[:] = None
path = l.strip('[] ')
self.p = self.p / path
self.win_show()
#回到上一层目录
elif l == '.. (up a dir)':
self.p = self.p.parent
self.win_show()
#当前文件夹只是显示的,不跳转
elif '当前文件夹' in l:
return
#回到首页
elif l == '-home-':
self.path = '~'
self.win_show()
#正常的文件,直接打开
else:
print('进入文件')
print(f'之前的缓冲区{self.pre_b.name}')
vim.current.window = self.pre_w
vim.command(f':e {l}')
vim.current.window = self.w
#下面是绑定到vim里面
vim.command(':py3 fm=FileManage()')
vim.command(
'''
function! Open_win()
:py3 fm.open_win()
endfunction
function! Open_file()
:py3 fm.open_file()
endfunction
'''
)
vim.command('map <F9> :call Open_win()<Esc>')