注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

liangxh2008的博客

 
 
 

日志

 
 

Python in Vim  

2010-05-20 09:36:43|  分类: python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://hi.baidu.com/bluebanboom/blog/item/2239710eb82a0ec07acbe164.html

2009年11月30日 星期一 00:12
很长时间没写点关于小技术的文章了,没什么可写。不过,最近找到了点乐子,Python inVim,Vim实在强大,强大到在vimrc里可以直接写python脚本(地球人都知道)。当然,我也是很早知道vim对python的支持了,如果想要在vimrc使用python的话,首先要保证vim编译的时候开启了python支持,输入“:version”,或者直接“:py print 1”试试自己的vim是否支持python。幸运的是官方发布的版本支持了python,不幸的是,目前的7.2需要python 24,而我一直用python25,大概很多人用python26了吧。
不要紧,自己编译一版就OK了,在Windows下也很容易。
当然,如果想要深入研究的话,vim文档是最好的资料了,“:help python”即可。
这里还有一篇介绍将vim变成python调式工具的文章,也非常直接的告诉我们python和vim结合到底能干什么?
总之,灰常之强悍。
很好,很强大。
来个简单的例子,映射快捷键开关hex模式。
 1 "
 2 " Block of python
 3 "
 4 python << EOF
 5 import os
 6 import vim
 7 hex_status = False
 8 def toggle_hex():
 9         global hex_status
10         if hex_status:
11                 vim.command(':%!xxd -r')
12                 hex_status = False
13         else:
14                 vim.command(':%!xxd -u -g 1')
15                 hex_status = True
16 EOF
17 "
18 " Define vim mapping to call the python function
19 "
20 :map <C-H> :py toggle_hex()<cr>

怎么样,很简单?很清晰吧,抄debug一文的代码模式,相当清晰。
代码很清晰,5~15行标准的python代码,导入了vim模块,设了一个全局变量hex_status,然后定义了toggle_hex函数来根据hex_status的值来切换hex模式。
最后20行是映射了快捷键Ctrl+H来切换hex模式。
上面的代码主要调用了vim模块中的command函数来执行命令切换hex模式,很简单。command函数可以将命令传递给vim执行。
这是最简单的代码了,其实也可以用vim自己的脚本实现。不过作为python控,我们还是希望用python来实现了,清晰明了,而且还可以使用python强大的库。如果想要实现更加复杂的更能就需要使用vim模块中提供的其他几类对象:buffer,range,以及window了。
来个简单的计算器吧,很多情况下,我们可能需要计算一些数据,但是数据需要一个一个粘贴,复制到计算器里,然后得到结果,再复制回来,听起来就很烦躁,写个vim的python脚本来实现了。代码如下所示:
  1 "
  2 " Block of python
  3 "
  4 python << EOF
  5 import time
  6 import vim
  7
  8 hex_status = False
  9 num = '0123456789'
 10 hex = 'abcdefABCDEF'
 11 nmark = 0
 12 mark_names = 'abcdefghijlmn'
 13 class python_calc:
 14         def __init__(self):
 15                 self.dec = '0123456789'
 16                 self.hex = 'abcdefABCDEF'
 17                 self.nums = []
 18                 self.arit_signs = ''
 19                 self.is_hex = False
 20         def toggle_hex(self):
 21                 self.is_hex = not self.is_hex
 22                 if self.is_hex:
 23                         print '十六进制模式'
 24                 else:
 25                         print '十进制模式'
 26         def add_num(self):
 27                 # 获取光标所在的位置
 28                 (row, col) = vim.current.window.cursor
 29                 # 获取当前行
 30                 cur_line = vim.current.line[col:]
 31                 # 获取数字
 32                 num = ''
 33                 for s in cur_line:
 34                         if s == ' ':
 35                                 break
 36                         if (s in self.dec) or (s in self.hex and self.is_hex):
 37                                 num = num + s
 38                         else:
 39                                 break
 40                 self.nums.append(num)
 41                 print '%d:' % len(self.nums), num
 42         def calc(self):
 43                 if len(self.nums) <= 1:
 44                         return
 45                 (row, col) = vim.current.window.cursor
 46                 cur_line = vim.current.line[col:]
 47                 expr = ''
 48                 if self.is_hex:
 49                         prefix = '0x'
 50                 else:
 51                         prefix = ''
 52                 #print self.nums
 53                 for s in cur_line:
 54                         if s == ' ':
 55                                 break
 56                         else:
 57                                 self.arit_signs = self.arit_signs + s
 58                 if len(self.arit_signs) == 1:
 59                         for num in self.nums:
 60                                 expr = expr + prefix + num + self.arit_signs
 61                         expr = expr[:-1]
 62                         #print expr
 63                 elif (len(self.arit_signs)+1) == len(self.nums):
 64                         for i in range(len(self.arit_signs)):
 65                                 expr = expr + prefix + self.nums[i] + self.arit_signs[i]
 66                         expr = expr + prefix + self.nums[i+1]
 67                         #print expr
 68                 else:
 69                         print "运算符与数字不符"
 70                         self.nums = []
 71                         self.is_hex = False
 72                         self.arit_signs = ''
 73                         return
 74                 if self.is_hex:
 75                         value = '%X' % eval(expr)
 76                 else:
 77                         value = '%d' % eval(expr)
 78                 #print value
 79                 vim.command(":normal cw%s" % value)
 80                 self.nums = []
 81                 self.arit_signs = ''
 82                 print expr, '=', '%s%s' % (prefix, value)
 83
 84 pcalc = python_calc()
 85
 86 EOF
 87 "
 88 " Define vim mapping to call the python function
 89 "
 90 :map <C-H> :py pcalc.toggle_hex()<cr>
 91 :map <C-I> :py pcalc.add_num()<cr>
 92 :map <C-O> :py pcalc.calc()<cr>

写的比较拙劣,简单的功能用了这么多的代码,改天再优化吧。
功能很简单,映射了三个快捷键:Ctrl+H切换计算模式十进制或者十六进制,Ctrl+I将当前光标位置的数字加入计算列表,Ctrl+O获取当前光标下的运算符,进行计算,并替换当前光标位置的运算符为结果。
使用这个简单的计算器流程如下,首先,根据需要设置计算模式,然后依次在需要计算的数字位置按下快捷键Ctrl+H,在需要插入计算结果的位置输入运算符后,将光标移动到第一个运算符后按下快捷键Ctrl+O,就会将运算符替换为计算结果。
当然,目前仅实现了顺序计算,不能使用括号来改变计算优先级了,不过还是可以改进的。
  评论这张
 
阅读(2931)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017