爱游戏平台登录入口

  • 利用Python编写vim插件的简略示例
  • 2017年12月24日
  • 搜集搜集

 Vim 插件是一个 .vim 的剧本文件,界说了函数、映照、语法法则和号令,可用于操纵窗口、缓冲和行。普通一个插件包罗了号令界说和事务钩子。当利用 Python 编写 vim 插件时,函数里面是利用 VimL 编写,虽然 VimL 学起来很快,但 Python 加倍矫捷,比方能够用 urllib/httplib/simplejson 来拜候某些 Web 办事,这也是为甚么良多须要拜候 Web 办事的插件爱游戏平台登录入口是利用 VimL + Python 编写的缘由。


在起头编写插件之前,你须要确认 Vim 撑持 Python,经由过程以下号令来辨别:
 

代码以下:
vim --version | grep +python


接上去咱们经由过程一个简略的例子来进爱游戏平台登录入口用 Python 编写 Vim 插件,该插件用来获得 Reddit 爱游戏平台登录入口信息并显现在以后缓冲区上。

起首在 Vim 新建 vimmit.vim 文件,咱们起首须要判定是不是撑持 Python,若是不撑持给出提醒信息:
 

if !has('python')
  echo "Error: Required vim compiled with +python"
  finish
endif
                  

上面这段代码便是用 VimL 编写的,它将查抄 Vim 是不是撑持 Python。


上面是用 Python 编写的 Reddit() 主函数:

 

" Vim comments start with a double quote.
" Function definition is VimL. We can mix VimL and Python in
" function definition.
function! Reddit()
" We start the python code like the next line.
python << EOF
# the vim module contains everything we need to interface with vim from
# python. We need urllib2 for the web service consumer.
import vim, urllib2
# we need json for parsing the response
import json
# we define a timeout that we'll use in the API call. We don't want
# users to wait much.
TIMEOUT = 20
URL = "http://reddit.com/.json"
try:
  # Get the posts and parse the json response
  response = urllib2.urlopen(URL, None, TIMEOUT).read()
  json_response = json.loads(response)
  posts = json_response.get("data", "").get("children", "")
  # vim.current.buffer is the current buffer. It's list-like object.
  # each line is an item in the list. We can loop through them delete
  # them, alter them etc.
  # Here we delete all lines in the current buffer
  del vim.current.buffer[:]
  # Here we append some lines above. Aesthetics.
  vim.current.buffer[0] = 80*"-"
  for post in posts:
    # In the next few lines, we get the post details
    post_data = post.get("data", {})
    up = post_data.get("ups", 0)
    down = post_data.get("downs", 0)
    title = post_data.get("title", "NO TITLE").encode("utf-8")
    score = post_data.get("score", 0)
    permalink = post_data.get("permalink").encode("utf-8")
    url = post_data.get("url").encode("utf-8")
    comments = post_data.get("num_comments")
    # And here we append line by line to the buffer.
    # First the upvotes
    vim.current.buffer.append("↑ %s"%up)
    # Then the title and the url
    vim.current.buffer.append("  %s [%s]"%(title, url,))
    # Then the downvotes and number of comments
    vim.current.buffer.append("↓ %s  | comments: %s [%s]"%(down, comments, permalink,))
    # And last we append some "-" for visual appeal.
    vim.current.buffer.append(80*"-")
except Exception, e:
  print e
EOF
" Here the python code is closed. We can continue writing VimL or python again.
endfunction
                  

利用以下号令保管文件
 

代码以下:
:source vimmit.vim

而后挪用该插件:
 

代码以下:
:call Reddit()

这个号令用起来不那末便利,是以咱们再界说一个号令:

代码以下:
command! -nargs=0 Reddit call Reddit()

咱们界说了号令:Reddit来挪用这个函数。-nargs 参数申明号令行爱游戏平台登录入口爱游戏平台登录入口几多个参数。


对于函数参数的题目:

问:若何拜候函数爱游戏平台登录入口的参数?
 

function! SomeName(arg1, arg2, arg3)
  " Get the first argument by name in VimL
  let firstarg=a:arg1
  " Get the second argument by position in Viml
  let secondarg=a:1
  " Get the arguments in python
  python << EOF
  import vim
  first_argument = vim.eval("a:arg1") #or vim.eval("a:0")
  second_argument = vim.eval("a:arg2") #or vim.eval("a:1")
                  

你能够利用 ... 来处置可变个数参数来替代特定的参数名,可经由过程地位或定名参数来拜候,如:(arg1, arg2, ...)

问:若安在 Python 爱游戏平台登录入口挪用 Vim 号令?
 

代码以下:
vim.command("[vim-command-here]")

问:若何界说全局变量,并在 VimL 和 Python 爱游戏平台登录入口拜候?

全局变量利用形如 g:. 的前缀,界说全局变量前应该查抄该变量是不是已界说:
 

if !exists("g:reddit_apicall_timeout")
  let g:reddit_apicall_timeout=40
endif
                  

而后你经由过程上面代码在 Python 爱游戏平台登录入口拜候这个变量:
 

TIMEOUT = vim.eval("g:reddit_apicall_timeout")
                  

可经由过程上面的方式来对全局变量停止从头赋值:
 

let g:reddit_apicall_timeout=60
                  

更多对于利用 Python 编写 Vim 插件的申明请看官方文档。


备注:

一旦你用过VimL,就会发明它挺简略的,你用python写的代码也能够用它来完爱游戏平台登录入口。具体请参考 ,这是一份主要的参考材料。

除上述文档,你也能够在IBM developerWorks网站找到一些爱游戏平台登录入口效的 。