前言
ipython可以方便的进行一些操作,而我们在使用source insight编写程序的时候有遇到批量规律性数据输入或编辑,有没有方法直接借助ipython来进行。当然source insight也支持内部宏处理。
方法
1、第一个问题是面临参数传递的问题,需要把source insight当前编辑的文件和光标所在行信息传递给ipython,考虑采用环境变量传递参数。设置环境变量 iFile、iFileLineCount、iFileLine,分别用于传输文件路径、文件总行数、光标所在行信息。
2、第二个问题是source insight 调用 ipython,查询宏帮助知道RunCmdLine宏可以实现这个功能。
具体source insight宏如下:
//source insight 对应的宏
//功能:获取文件路径
//作者:枣枣123
macro GetFileDir(sz)
{
i = 1
szDir = sz
iLen = strlen(sz)
if(iLen == 0)
return ""
while( i <= iLen)
{
if(sz[iLen-i] == "\\")
{
szDir = strmid(sz,0,iLen-i)
break
}
i = i + 1
}
return szDir
}
//功能:调用Ipython并带对应的初始化代码
//作者:枣枣123
macro RunIPython()
{
hbuf = GetCurrentBuf()
file=GetBufName(hbuf) //获取文件路径
lineCount=GetBufLineCount(hbuf) //总行数
ln = GetBufLnCur(hbuf) //获取偏移量
dir = GetFileDir(file); //文件路径
PutEnv("iFile",file) //设置环境变量用于传递参数到python环境
PutEnv("iFileLineCount",lineCount)//总行数
PutEnv("iFileLine",ln) //设置环境变量用于传递参数到python环境
PutEnv("iFileDir",dir) //设置文件路径环境变量
RunCmdLine("ipython -i E:\init.py",dir,0)
}
3、第三个问题是需要 有一个定位到待编辑文件的print函数,编写iPrint函数、iReplace函数实现对应供。
4、ipython运行的时候最好自动执行对应的初始化工作,加载相关自定义函数。ipython -i init.py方式启动,可以预先执行对应的脚本。
python脚本如下:
import os
import sys
file=open(str(os.getenv("iFile")), mode='r+')
lineCount=int(os.getenv("iFileLineCount"),10)
line=int(os.getenv("iFileLine"),10)
content=file.read()
# 定位到光标所在行首
post=0
curLine=0
for i in range(lineCount):
if curLine==line:
break
else:
ret = content.find("\n", post)
if ret == -1:
break
else:
post = ret + 1
curLine=curLine+1
print("文本偏移:post")
print("文本缓存:content")
print('''帮助:source insight 中光标移动到对应的行,调用宏呼出ipython,即可在对应的位置用下面指令插入数据,
或修改数据
iPrint(str):用于插入字符
iReplace(followLines,str1,str2):用于替换光标接下来followLines行的字符串,str1被str2替换
iPrintExit();用于保存修改
print(content):显示文本缓存内容
''')
def iPrint(str):
global content
global post
content=content[:post]+str+content[post:]
post+=len(str)
print(str,end="")
def iReplace(followLines,str1,str2):
global content
global post
# 定位到后面n行的位置
index = post
for i in range(followLines):
ret = content.find("\n", index)
if ret == -1:
break
else:
index = ret+1
contentTemp=content[post:index]
print("post={0},index={1},文本如下:\r\n{2}".format(post,index,contentTemp))
contentTemp=contentTemp.replace(str1,str2)
print("替换后的文本:\r\n{0}".format(contentTemp))
flag=input("是否确认替换Y/N")
if flag=="Y":
content = content[:post] + contentTemp + content[index:]
print("替换成功,调用iPrintExit()立即保存退出")
def iPrintExit():
global file
file.seek(0)
file.write(content)
file.close()
print("保存退出")
5、source insight内绑定宏命令到快捷键 Ctrl+P
效果演示
打开source insight工程
按上面设置的快捷键呼出iPython界面,输入代码。
执行结果如下图
保存退出更新源文件
说明
只是一种尝试,暂时编写了打印输出功能和替换功能,应当可以编写更复杂的脚本实现复杂的功能,或许有其它更好的方法。