`
shrek
  • 浏览: 73931 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
qja
社区版块
存档分类
最新评论

python写vim script 之 山寨版 GTD

    博客分类:
  • vim
阅读更多
一直想找个用vim来管理todo列表的script, 没发现特别好用的,
自己写了个,用sqlite来保存数据.
将下面代码存为 SzTodo.vim,放到plugin目录里.
用 :SzTodo  启动.


let  g:sztodo_db_path="/root/.vim/todo"
let  s:list_type="unfinished"
let  s:cur_buf = 0

function! MakeTemplate() 
python << EOF
import vim   

vim.command("call SwitchToDetailView()")
vim.command("call SetSyntax()")
template = "=" * 50 + "\n" \
      + "tag:" +"\n" \
      + "title:" +  "\n" \
      + "=" * 50 + "\n" 
for index,line in enumerate(template.split("\n")):
  if index ==0 :
    vim.current.buffer[0]=line
  else :
    vim.current.buffer.append(line)

EOF
endfunction

function! SaveTodoItem()
python << EOF
import vim   

def loadData(lines):
  item=ToDoItem()
  content=""
  seperates=0
  for line in lines:
    if line.startswith("====="): seperates=seperates+1
    if line.startswith("id:"): item.id=line[3:].strip()
    if line.startswith("tag:"): item.tag=line[4:].strip()
    if line.startswith("title:"): item.title=line[6:].strip()
    if line.startswith("status:"): item.status=line[7:].strip()
    if seperates==2 and not line.startswith("===="):
      content=content+line+"\n"
  item.content=content[:-1]
  return item

def addItem(item):
  insertSql="insert into SzTodo(tag,title,create_date,status,content) values (?,?,?,?,?)"
  con=sqlite.connect(getDbFileName())
  cur=con.cursor()
  values=(item.tag,item.title,item.create_date,item.status,item.content)
  cur.execute(insertSql,values)
  con.commit()
  con.close()

def updateItem(item):
  updateSql="update SzTodo set tag=?,title=?,create_date=?,status=?,content=? where id=?"
  con=sqlite.connect(getDbFileName())
  cur=con.cursor()
  values=(item.tag,item.title,item.create_date,item.status,item.content,item.id)
  cur.execute(updateSql,values)
  con.commit()
  con.close()


data=vim.current.buffer[:]
todoItem=loadData(data)
if not todoItem.title:
  print "title can't be empty"
else:
  if todoItem.id.strip() == "" :
    todoItem.create_date=getCurrentDate()
    todoItem.status="unstarted"
    addItem(todoItem)
  else :
    updateItem(todoItem)
  print "todo has been saved"

EOF
  exec bufwinnr(s:cur_buf) . "wincmd w"  
  call ListItems()

endfunction

function! ListItems()
python << EOF
import vim   

listFinished=vim.eval("s:list_type")

vim.current.buffer[:]=None
vim.command("set nonumber")
if listFinished=="finished":
  selectSql="select id,tag,title,create_date,content from SzTodo where status == 'done' "
else:
  selectSql="select id,tag,title,create_date,content from SzTodo where status != 'done' "

con=sqlite.connect(getDbFileName())
cur=con.cursor()
items=[]
cur.execute(selectSql)


for index,row in enumerate(cur):  
  formatedItem=str(row[0])+". "+str(unicode(row[2]).encode("utf-8"))
  if index==0:
    vim.current.buffer[0]=formatedItem
  else :
    vim.current.buffer.append(formatedItem)

con.commit()
con.close()

EOF
endfunction

function! SwitchToDetailView()  
  let s:cur_buf = bufnr("%")  
  let s:szdb_result_buf=bufnr("SztodoDetail")  
  if bufwinnr(s:szdb_result_buf) > 0  
    exec bufwinnr(s:szdb_result_buf) . "wincmd w"  
    %d  
  else  
    exec 'silent! botright split SztodoDetail'   
    exec "e SztodoDetail"  
    exec "set nowrap"  
    map <silent><buffer>s :call SaveTodoItem()<cr>
  endif  
  
endfunction  

function! ShowItemDetail(preview)
python << EOF
import vim   
(row, col) = vim.current.window.cursor
line = vim.current.buffer[row-1]
id=line[0:line.find(".")]
selectSql="select id,tag,title,create_date,content,status from SzTodo where id=?"
con=sqlite.connect(getDbFileName())
cur=con.cursor()
cur.execute(selectSql,(id,))

todoItem=ToDoItem()
for row in cur:  
  todoItem.id=row[0]
  todoItem.tag=unicode(row[1]).encode("utf-8")
  todoItem.title=unicode(row[2]).encode("utf-8")
  todoItem.create_date=unicode(row[3]).encode("utf-8")
  todoItem.content=unicode(row[4]).encode("utf-8")
  todoItem.status=unicode(row[5]).encode("utf-8")

vim.command("call SwitchToDetailView()")  
vim.command("call SetSyntax()")
for index,line in enumerate(str(todoItem).split("\n")):
  if index==0:
    vim.current.buffer[0]=line
  else:
    vim.current.buffer.append(line)
EOF
  if a:preview=="true"
    exec bufwinnr(s:cur_buf) . "wincmd w"  
  endif

endfunction

function! UpdateItemStatus(status)
  let choice=input('you really want to update the todo item status to '.a:status."?[y/n]")
  if choice=="n"
    return
  endif
python << EOF
import vim
(row, col) = vim.current.window.cursor
line = vim.current.buffer[row-1]
id=line[0:line.find(".")]
updateSql="update SzTodo set status = ? where id=?"
status=vim.eval("a:status")
con=sqlite.connect(getDbFileName())
cur=con.cursor()
cur.execute(updateSql,(status,id))
con.commit()
con.close()
EOF
endfunction

function! InitDb()
python << EOF
import vim   
import os
createSql="create table SzTodo (id integer primary key , tag char(20), title varchar(200), \
  create_date varchar(10),status char(1),content varchar(5000))"
path=os.path.dirname(getDbFileName())
if not os.path.exists(path):
  os.makedirs(path)
con=sqlite.connect(getDbFileName())
cur=con.cursor()
cur.execute(createSql)
con.commit()
con.close()
print "db has been created"

EOF
endfunction

function! s:DefSzTodoGlobal() 
python << EOF
import vim   
from pysqlite2 import dbapi2 as sqlite

statusDict=dict(done="done",postpone="postpone",doing="doing",unstarted="unstarted")

class ToDoItem(object):
  def __init__(self,id="",tag="",title="",content="",create_date="",status=""):
    self.id=id
    self.tag=tag
    self.title=title
    self.create_date=create_date
    self.status=status
    self.content=content

  def __str__(self):
    return "=" * 50 + "\n" \
        + "id:" + str(self.id) +"\n" \
        + "tag:" + self.tag +"\n" \
        + "title:" + self.title + "\n" \
        + "status:" + self.status + "\n" \
        + "=" * 50 + "\n" \
        + self.content 

def getCurrentDate():
  from datetime import datetime
  t=datetime.now()
  return t.strftime("%Y-%m-%d %H:%M")

def getDbFileName():
  dbpath=vim.eval("g:sztodo_db_path")
  path=os.path.join(dbpath,"todo.dat")
  return path

EOF
endfunction

function! StartApp()
python << EOF
import vim   
import os
if not os.path.exists(getDbFileName()):
  vim.command("call InitDb()")
vim.command("call ListItems()")
vim.command("call SetMapping()")
EOF
endfunction


function! SetMapping()
  map <silent><buffer> o  :call ShowItemDetail("false")<cr> 
  map <silent><buffer> s  :call ShowItemDetail("true")<cr> 
  map <silent><buffer> i  :call MakeTemplate()<cr> 
  map <silent><buffer> r  :call ListItems()<cr> 

  map <silent><buffer> p  :call UpdateItemStatus("postpone")<cr> 
  map <silent><buffer> d  :call UpdateItemStatus("done")<cr> 
  command! -nargs=0 FinishedItem :call FinishedItem()
  command! -nargs=0 UnfinishedItem :call UnfinishedItem()
endfunction

function! FinishedItem() 
  let s:list_type="finished"
  call ListItems()
endfunction

function! UnfinishedItem() 
  let s:list_type="unfinished"
  call ListItems()
endfunction

function! SetSyntax()

  syn keyword sztodoKeyword tag title id status 
  syn keyword sztodoStatus unstarted done doing postpone

  syn match tag "^tag:.*" 
  syn match title "^title:.*"
  syn match id  "^id:.*"
  syn match status  "^status:.*"

  hi def link sztodoKeyword Keyword
  hi def link sztodoStatus Identifier
  hi def link tag String
  hi def link id String
  hi def link title String
  hi def link status String

endfunction

call s:DefSzTodoGlobal()
command! -nargs=0 SzTodo :call StartApp()




分享到:
评论

相关推荐

    python写vim script 之 山寨版 dbext

    Python写vim script之山寨版dbext,这个主题主要围绕如何使用Python语言来编写Vim插件,特别是构建一个类似于dbext的功能。dbext是Vim中一个非常实用的数据库扩展,它允许用户在Vim环境下直接操作数据库,执行SQL...

    笨方法学 Vim Script

    Vim Script 中的命令是其强大之处。它们允许你控制文本的操作,比如移动光标、删除文本、复制和粘贴等。例如,`:global` 命令可以用于在整个文件中执行特定操作,`:map` 命令则能创建自定义的键位映射,让复杂的编辑...

    Vimscript的经典教程

    在编程经验方面,虽然本书不是针对初学者,但如果读者之前没有编程经验,书中建议先学习一些基础的编程知识,比如通过阅读《笨方法学Python》等入门书籍,逐步建立编程思维,然后再来学习Vimscript将会更加容易上手...

    python+vim+win

    总的来说,"python+vim+win"的组合为Windows上的Python开发提供了一个强大且灵活的环境。Pythonwin提供了图形化编程和调试工具,而Vim则带来了高效且高度自定义的文本编辑体验。通过熟练掌握这两者,开发者可以在...

    python.vim

    python.vim_3.3

    Python-Pythonmode将Vim变成PythonIDE的一款多合一插件

    Python-mode是针对Vim文本编辑器的一个强大插件,它将Vim转换为一个功能丰富的Python集成开发环境(IDE)。这个插件集成了多种实用功能,以提高Python开发者在Vim中的工作效率。以下是对该插件及其功能的详细说明: ...

    Learn Vimscript the Hard Way

    《Learn Vimscript the Hard Way》是一本专门为那些希望通过实践学习Vimscript编程语言的读者而设计的书籍。Vimscript是Vim编辑器的核心语言,它允许用户自定义编辑器的行为,提高工作效率,并实现复杂的文本操作。...

    python.vim插件.zip

    Python.vim是一个专门为Python开发设计的Vim编辑器插件,它增强了Vim对Python代码的支持,提供了诸如语法高亮、自动完成、代码折叠、跳转到定义等实用功能,极大地提高了Python程序员在Vim环境中的开发效率。...

    基于Vim Script和Shell、Python的Vimplus自动配置程序设计源码

    该项目是一款基于Vim Script、Shell和Python编写的Vimplus自动配置程序源码,包含29个文件,其中包括4个Shell脚本、4个Python脚本、4个PNG图片、2个Markdown文件、2个文本文件、1个YAML文件、1个Git忽略文件、1个...

    mac下vim之python配置步骤

    Mac 下 Vim 之 Python 配置步骤 Vim 是一款功能强大且灵活的文本编辑器,广泛应用于编程、文档编辑等领域。Python 是一种广泛使用的编程语言,广泛应用于人工智能、数据分析、Web 开发等领域。下面我们将介绍如何在...

    Python-Vimapt是一个vim包管理器

    **Python-Vimapt:Vim的强大包管理器** 在编程世界中,包管理器对于组织、安装和更新软件包至关重要,它们简化了开发者的工作流程。在 Vim 编辑器领域,Vimapt 是一个非常实用的包管理工具,它借鉴了 Ubuntu 的 APT...

    基于Vim Script的Java、Python、JavaScript、Shell编程设计源码PowerVim

    PowerVim项目是一款基于Vim Script设计的集成开发环境源码,旨在为Java、Python、JavaScript和Shell编程提供优化支持。该项目包含740个文件,其中Vim脚本文件366个,文本文件154个,Java源代码文件77个,类文件67个...

    Learn_Vimscript_the_Hard_Way.mobi

    learn vimscript the hard way的mobi版。方便用kindle来离线阅读。

    基于Vim Script的PowerVim设计源码,支持Java, Python, JavaScript, Shell多语言

    该项目为基于Vim Script开发的PowerVim插件源码,支持Java、Python、JavaScript和Shell等多种编程语言的编辑。源码总量达740个文件,其中包含366个Vim脚本文件、154个文本文件、77个Java源文件、67个类文件、18个...

    Python_Vim的协完成引擎.zip

    YCM 包含了 Clang 对 C/C++/Objective-C 支持,以及对 Python 的 Jedi 引擎支持,这些都让它成为 Vim 用户的必备工具之一。 要安装 YouCompleteMe,首先你需要确保你的 Vim 已经安装了 Python 支持。在大多数现代 ...

    基于Vim编辑器的Vim Script编程功能设计源码

    本项目是一款基于Vim编辑器的Vim Script编程功能设计源码,包含5113个文件,涵盖多种编程语言如C、Python、Shell、Java、C++、Lua、MATLAB和C#等,文件类型丰富,包括2121个vim脚本文件、1533个配置文件(dump)、...

    linux-在你的VimScript中高亮用户友好的注释

    在Linux开发环境中,Vim Script是一种非常强大的工具,用于自定义编辑器的行为和编写插件。对于提升代码可读性和维护性,注释扮演着至关重要的角色。在Vim Script中,我们通常会使用注释来解释代码的功能、用法或者...

    基于Vim Script的PowerVim插件设计源码

    该项目是一款基于Vim Script开发的PowerVim插件设计源码,总文件量为740个,涵盖了多种编程语言和文件类型。其中,Vim脚本文件366个,文本文件154个,Java源文件77个,类文件67个,模板文件18个,Markdown文件9个,...

Global site tag (gtag.js) - Google Analytics