source insight技巧,调用iPython辅助输入

source insight技巧,调用iPython辅助输入

前言

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界面,输入代码。
在这里插入图片描述执行结果如下图
在这里插入图片描述保存退出更新源文件
在这里插入图片描述

说明

只是一种尝试,暂时编写了打印输出功能和替换功能,应当可以编写更复杂的脚本实现复杂的功能,或许有其它更好的方法。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读