这几天一直为了写一个合适自己的vim插件,努力了多天。最终有了点结果。
写vim插件(脚本),就麻烦、最难搞明白的事就是vim的多模式方面(思维会乱想的)。
这里要记录几个重要的问题:
normal的作用:
exec的作用:
vim.command、vim.eval的作用:
python脚本与vim本身脚本的数据交流、方法互调
模拟键盘操作
=============================================
1)老是会想:normal不是在normal模式下用的吗?当我在insert模式里怎么使用呀?没有错。当我们在用手动去让vim工作时,normal是要在normal模式里这样用:“:normal gg”。但是当我们在脚本里写到(现在还是在insert模式里):“:normal gg”时,这句话能完成本来的工作,而且还是会回到insert模式里,这也就是说,我们在insert模式里可以实现normal模式里的操作。那我们怎么实现?答案在函数的调用里(vim脚本代码的触发)。
=============================================
2)exec是为了在脚本里用(主要用在vim本身脚本语言里),当然可以用在command模式,当是没有这个必要。直接在command里写命令不就行了嘛,还用:“exec “tabnew””有什么意思?
exec用处是运行字符串变量里的命令:
myCmd = “tabnew”
exec myCmd
如果是用python写vim脚本时,这个没有什么用。因为它被python的vim.command()取代。
=============================================
3)vim.command主要是为了使用vim本身的脚本语句!它与vim.eval是python与vim本身脚本的交流通道。3)与4)是连在一起的。下面一起说说:
数据交流:
python使用vim的数据:
pyVariable = vim.eval(”vimVariable”)
python把数据交给vim:
vim.command(’let vimVariable = “%s”%spyVariable)
vim.command(’let completeList = “%s”‘%returnString)
方法互调:
python使用vim的方法:
vim.command(’let tmpVariable = getpos(”.”)’)
pypos= vim.eval(’tmpVariable’)
vim使用python的方法:
function PythonFunc()
python 《《EOF
import vim
python代码段
EOF
endfunction
call PythonFunc()
5)模拟键盘操作:
有两种方法:
1)normal方式:“:normal “\《Esc》””(要在insert模式下才看到模拟效果的,感谢邮件列表网友tocer)
2)函数return方式:
function Esc()
exe “normal \《Tab》”
return “\《Esc》”
endfunction
=============================================
=============================================
=============================================
vim脚本代码的触发。(写程序不可能一直运行的,有时候要等用户的触发)
现在我只知道几种:
1)启动自动触发
2)映射触发
3)《C-R》=方式触发
4)自动命令触发
=============================================
1)启动触发就没有什么好说的。就是启动vim时触发的。这时vim在normal模式里。
=============================================
2)映射触发:
就是用户按键时,引发一个函数或者一串normal语句可以执行的操作。 再者就是两者的混合使用!!
函数只要是数据的处理。而normal语句则是帮我们模拟键盘的操作!(我们不用去手动按:-))
inoremap CleverTab()
function CleverTab()
let curLine = getline(’.')
python 《《EOF
import vim
cur = vim.eval(’curLine’)
if len(cur):
____if cur[-1] == ‘ ‘ or cur[-1] ==’\t’:
________string = ‘”\《Tab》”‘
____else:
________string = ‘”\《C-X》\《C-N》”‘
________vim.command(’let curLine =’ + string)
else:
____string = ‘”\《Tab》”‘
____vim.command(’let curLine =’ + string)
EOF
____return curLine
endfunction
=============================================
3)《C-R》= 方式触发
这种方法只要是完成2)方法的安全问题设置的。
和2)只是一点不同:
inoremap =CleverTab()
=============================================
4)还没有学,不会。到时写。
多种脚本的混合使用。
不要想着用其它语言(不用vim本身的脚本语言)写出一个vim插件 !
虽说可以多种语言写vim脚本,但是vim本身脚本还是处于上风(没有它不行)。其它语言一般是用于数据、算法,在这个过程中要通过vim.command、vim.eval用到vim本身语言。
阅读(2231) | 评论(0) | 转发(0) |