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

python写vim script 之 山寨版 dbext

    博客分类:
  • vim
阅读更多
山寨版 dbext
需要有python支持的vim,windows版的gvim已经有python支持
需要安装python2.4(其他版本好像不行)
pymssql,cx_oracle.

"==================================================
" File:         SzDbext.vim
" Brief:        山寨版dbext
" Authors:      shrek<shrek.wang AT gmail DOT com>
" Last Change:  2009-01-20 22:33:06
" Version:      0.00000000000000000000000000000002
" Licence:      LGPL
"
"
" Usage: 1:修改SzDbext.vim中的数据库连接参数
"        2:放到 plugin 目录下
"        3:编辑任竟文件
"        4:用v命令选中文本块
"        4: ,,  查询选定的sql
"           ,dt 查询选定文本的表结构
"           ,lt 列出包含选定文本的表
"
" Todo: 1:将数据库的连接参数用vim变量独立出来 
"       2:支持ddl


let g:selection=-1
python profile={}

function! GetDbOption()
python << EOF
from vim import *

aa=dict(host="192.168.0.280",user="**",password="**",database="data1")
bb=dict(host="192.168.0.281",user="**",password="**",database="sat2")
cc=dict(host="192.168.0.282",user="**",password="**",database="data3")

array=[aa,bb,cc]
selection=eval("g:selection")
if int(selection) < 0 :
  for index,item in enumerate(array):
    print str(index) + ": "+item["host"]+":  "+item["database"]
  command("let g:selection=input('please enter a selection')")
  selection=eval("g:selection")
  profile=array[int(selection)]
  print profile


EOF
endfunction


function! GetVisualBlock() range
    let save = @"
    silent normal gvy
    let vis_cmd = @"
    let @" = save
    return vis_cmd
endfunction 

function! SwitchToSQLResult()
  let s:cur_buf = bufnr("%")
  let s:szdb_result_buf=bufnr("SzdbResult")
  if bufwinnr(s:szdb_result_buf) > 0
    exec bufwinnr(s:szdb_result_buf) . "wincmd w"
    %d
  else
    exec 'silent! botright split SzdbResult' 
    exec "e SzdbResult"
    exec "set nowrap"
  endif

endfunction

function! QueryVisualSQL() range
python << EOF
import vim 
vb=vim.eval("GetVisualBlock()")
lines=vb.split("\n")
sql=""
for line in lines:
  sql=sql+line+" "
vim.command('call QuerySQL("'+sql+'")')
EOF
endfunction

function! QuerySQL(sql) 
python << EOF
import vim 
if not profile:
  vim.command("call GetDbOption()")
  
conn=""
if profile.has_key("sid") :
  import cx_Oracle
  dns_tns=cx_Oracle.makedsn(profile["host"],1521,profile["sid"])
  conn = cx_Oracle.connect(profile["user"], profile["password"], dns_tns)
else :
  import pymssql
  conn = pymssql.connect(host=profile["host"],user=profile["user"], \
    password=profile["password"],database=profile["database"])


cur = conn.cursor()

sql=vim.eval("a:sql")
cur.execute(sql)

columns,maxlens=[],[]
vim.command("call SwitchToSQLResult()")
if cur.description:
  for column in cur.description:
    columns.append(column[0])
    maxlens.append(0)

  resultset=[columns]
  for row in cur.fetchall():
    for index,field in enumerate(row):
      if (len(str(field))>maxlens[index]):
        maxlens[index]=len(str(field))
    resultset.append(row)

  for index,field in enumerate(columns):
    if (len(str(field))>maxlens[index]):
      maxlens[index]=len(str(field))

  headline=""
  for item in maxlens:
    headline=headline+"+"+("-"*item)+"--"
  headline=headline+"+"

  for rowindex,row in enumerate(resultset):
    line=""
    for index,field in enumerate(row):
      line=line+"| "+str(field).replace("\n","").ljust(maxlens[index]+1)
    if rowindex<2: vim.current.buffer.append(headline)
    vim.current.buffer.append( line+"|")
  vim.current.buffer.append( headline)
vim.current.buffer[0]="Host:"+profile["host"]+"  Database:"+profile["database"]
vim.current.buffer.append("affected "+str(cur.rowcount)+" rows.")
conn.commit()
cur.close()
conn.close()
EOF
  redraw! 
  exec bufwinnr(s:cur_buf) . "wincmd w"
endfunction

function! QueryTables()
python << EOF
import vim
vb=vim.eval("GetVisualBlock()")
if profile.has_key("sid"):
  sql="select  table_name   from   user_tables where table_name like '%"+vb.upper()+"%'"
else:
  sql="SELECT name FROM  sysobjects Where  name like '%"+vb+"%' and type = 'U' order by name"
vim.command('call QuerySQL("'+sql+'")')
EOF
endfunction

function! DescTable() 
python << EOF
import vim
vb=vim.eval("GetVisualBlock()")

if profile.has_key("sid"):
  sql="select column_name,data_type from user_tab_columns where table_name = '"+vb.upper()+"'"
else:
  sql="""Select col.[name]  as '字段名', type.[name] as '类型' , col.[length]as '长度' \ 
      From syscolumns as col   \
      Left Join systypes as type on col.xtype = type.xtype \ 
      where col.id = (Select id From sysobjects Where name = '"""+vb+"')"

vim.command('call QuerySQL("'+sql+'")')
EOF
endfunction

map <silent>,, :call QueryVisualSQL()<cr>
map <silent>,dt :call DescTable()<cr>
map <silent>,lt :call QueryTables()<cr>



分享到:
评论

相关推荐

    笨方法学 Vim Script

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

    Vimscript的经典教程

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

    python+vim+win

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

    vim数据库插件dbext_420

    *dbext* *dbext.vim* *db_ext* *db_ext.vim* *database-extension* *pgsql* *mysql* *asa* *ase* *ingres* *interbase* *sqlite* *sqlsrv* *ora* *db2* 1. Overview |dbext-overview| 2. Installation |...

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

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

    python.vim

    python.vim_3.3

    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个...

    Python-Vimapt是一个vim包管理器

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

    mac下vim之python配置步骤

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

    基于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中,我们通常会使用注释来解释代码的功能、用法或者...

Global site tag (gtag.js) - Google Analytics