用python编写一个vim目录管理插件

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>')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值