2822|5

165

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

初学micropython,写个editor练练手: [复制链接]

 先来个效果图:


使用方法
putty串口设置:

cmd:
1. import editor
2. editor.edit("sd.cpp")
仅实现了四个方向键,del,ctrl-s保存,ctrl-x退出,支持tab输入
不支持utf8。
虽说内存紧张,打开个几k的文件还是没有压力的。

注意:
数据有价,脚本无情。
没有严格测试...


代码:
链接已隐藏,如需查看请登录或者注册


console.py
  1. import sys
  2. class Console:
  3.         def __init__(self):
  4.                 pass
  5.         def SetColor(self,f,b):
  6.                 s="\033[%(fg)d;%(bg)dm"%{'fg':f,'bg':b}
  7.                 sys.stdout.write(s)
  8.         def ClearSetting(self):
  9.                 s="\033[0m"
  10.                 sys.stdout.write(s)
  11.         def ClearScreen(self):
  12.                 s="\033[2J"
  13.                 sys.stdout.write(s)
  14.         def ClearToEnd(self):
  15.                 s="\033[K"
  16.                 sys.stdout.write(s)
  17.         def HideCursor(self):
  18.                 s="\033[?25l"
  19.                 sys.stdout.write(s)
  20.         def ShowCursor(self):
  21.                 s="\033[?25h"
  22.                 sys.stdout.write(s)
  23.         def SetCursor(self,x,y):
  24.                 x=x+1
  25.                 y=y+1
  26.                 s="\033[%(x)d;%(y)dH"%{'x':x,'y':y}
  27.                 sys.stdout.write(s)
  28.         def Write(self,s):
  29.                 sys.stdout.write(s)
  30.         def Read(self):
  31.                 return sys.stdin.buffer.read(1).decode()
  32.                 #return sys.stdin.read(1)
复制代码


editor.py
  1. from linelist import *
  2. from console import *
  3. class FileIo:
  4.         def __init__(self):
  5.                 self.f=None
  6.         def open(self,s,opt):
  7.                 self.f=open(s,opt)
  8.         def load(self):
  9.                 self.f.seek(0)
  10.                 return self.f.readlines()
  11.         def seek(self,n):
  12.                 self.f.seek(n)
  13.         def close(self):
  14.                 self.f.close()
  15.         def write(self,s):
  16.                 self.f.write(s)
  17.         def flush(self):
  18.                 self.f.flush()

  19. class Editor:
  20.         def __init__(self):
  21.                 self.w=50
  22.                 self.h=20
  23.                 self.path=None
  24.                 self.console = Console()
  25.                 self.cursor_x = 0
  26.                 self.cursor_y = 0
  27.                 self.cursorToStrIndex =0;
  28.                 self.curLine = None;
  29.                 self.firstDispLine = None
  30.                 self.lines = LineList()
  31.                 self.isModified=0
  32.                 self.enableDebug=0
  33.         def edit(self,s):
  34.                 self.console.ClearScreen()
  35.                 self.console.ClearSetting()
  36.                 self.path=s
  37.                 self.lines.h = None
  38.                 self.lines.t = None
  39.                 file = FileIo()
  40.                 file.open(s,"r")
  41.                 buf=file.load()
  42.                 for i in range(len(buf)):
  43.                         self.lines.add(buf[i])
  44.                 file.close()
  45.                 self.lines.add("")
  46.                 self.curLine = self.lines.h;
  47.                 self.firstDispLine = self.lines.h;
  48.                 self.updateTitle()
  49.                 self.updateEdit()
  50.                 self.cursor_x = 0
  51.                 self.cursor_y = 1
  52.                 self.cursorToStrIndex =0;
  53.                 self.console.SetCursor(self.cursor_y,self.cursor_x)
  54.                 self.isModified=0
  55.                 self.loop()
  56.         def doSave(self):
  57.                 #RENAME(SAVE AS) NOT SUPPORT
  58.                 file = FileIo()
  59.                 file.open(self.path,"w")
  60.                 file.seek(0)
  61.                 it = self.lines.h
  62.                 while (it is not None):
  63.                         file.write(it.s)
  64.                         it = it.n
  65.                 file.flush()
  66.                 file.close()
  67.                 self.isModified=0
  68.                 self.updateTitle()
  69.                 self.dbgPrint("file saved")
  70.         def updateTitle(self):
  71.                 if(self.isModified==0):
  72.                         self.updateLine(0,0,self.path)
  73.                 else:
  74.                         self.updateLine(0,0,self.path+"*")
  75.         def updateEdit(self):
  76.                 it = self.firstDispLine
  77.                 linenumber=0
  78.                 while (it is not None):
  79.                         self.updateLine(linenumber+1,0,it.s)
  80.                         it = it.n
  81.                         linenumber+=1;
  82.                         if(linenumber==self.h):
  83.                                 break
  84.                        
  85.         def updateLine(self,y,x,s):
  86.                 self.console.SetCursor(y,x)
  87.                 self.console.ClearToEnd()
  88.                 cursor_pos=x
  89.                 str_pos=0
  90.                 while(str_pos<len(s) and cursor_pos<self.w):
  91.                         c=s[str_pos]
  92.                         if(c=='\r'):
  93.                                 self.console.SetColor(30,47)
  94.                                 self.console.Write('r');
  95.                                 self.console.SetColor(37,40)
  96.                                 str_pos+=1
  97.                                 cursor_pos+=1
  98.                         elif(c=='\n'):
  99.                                 self.console.SetColor(30,47)
  100.                                 self.console.Write('n');
  101.                                 self.console.SetColor(37,40)
  102.                                 str_pos+=1
  103.                                 cursor_pos+=1
  104.                         elif(c=='\t'):
  105.                                 n=self.w-cursor_pos
  106.                                 nn=0
  107.                                 self.console.SetColor(93,47)
  108.                                 while(n>0 and nn<4):
  109.                                         self.console.Write('.')
  110.                                         cursor_pos+=1
  111.                                         n-=1
  112.                                         nn+=1;
  113.                                 self.console.SetColor(37,40)
  114.                                 str_pos+=1
  115.                         elif(c<'\x20' or c>'\x7e'):
  116.                                 self.console.SetColor(30,47)
  117.                                 self.console.Write('?');
  118.                                 self.console.SetColor(37,40)
  119.                                 str_pos+=1
  120.                                 cursor_pos+=1
  121.                         else:
  122.                                 self.console.Write(c);
  123.                                 str_pos+=1
  124.                                 cursor_pos+=1
  125.         def dbgPrint(self,s,n=0):
  126.                 if(self.enableDebug):
  127.                         self.console.SetCursor(self.h+2+n,0)
  128.                         self.console.ClearToEnd()
  129.                         self.updateLine(self.h+2+n,0,s)
  130.                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  131.         def loop(self):
  132.                 state=0
  133.                 while(True):
  134.                         c=self.console.Read()
  135.                         if(state==0):
  136.                                 if(c=='\033'):
  137.                                         state=1
  138.                                 elif(c=='\x7f'):
  139.                                         self.dbgPrint("key Delete")
  140.                                         self.KeyDelete()
  141.                                 elif(c=='\x08'):
  142.                                         self.dbgPrint("key Backspace")
  143.                                 elif(c=='\x09'):
  144.                                         self.dbgPrint("key Tab")
  145.                                         self.KeyTab();
  146.                                 elif(c=='\x0d'):
  147.                                         self.dbgPrint("key Enter")
  148.                                         self.KeyEnter()
  149.                                 elif(c=='\x03'):
  150.                                         self.dbgPrint("key Ctrl-C")
  151.                                 elif(c=='\x13'):
  152.                                         self.dbgPrint("key Ctrl-S")
  153.                                         self.KeyCtrlS()
  154.                                 elif(c=='\x18'):
  155.                                         self.dbgPrint("key Ctrl-X")
  156.                                         self.KeyCtrlX()
  157.                                 elif(c>='\x20' and c<'\x7f'):
  158.                                         self.KeyNormal(c)
  159.                         elif(state==1):
  160.                                 if(c=='['):
  161.                                         state=2
  162.                                 else:
  163.                                         state=0
  164.                         else:
  165.                                 if(c=='A'):
  166.                                         self.dbgPrint("key Up")
  167.                                         self.KeyUp()
  168.                                 if(c=='B'):
  169.                                         self.dbgPrint("key Down")
  170.                                         self.KeyDown()
  171.                                 if(c=='C'):
  172.                                         self.dbgPrint("key Right")
  173.                                         self.KeyRight()
  174.                                 if(c=='D'):
  175.                                         self.dbgPrint("key Left")
  176.                                         self.KeyLeft()
  177.                                 if(c=='L'):
  178.                                         self.dbgPrint("key Insert")
  179.                                 if(c=='H'):
  180.                                         self.dbgPrint("key Home")
  181.                                 if(c=='I'):
  182.                                         self.dbgPrint("key PageUp")
  183.                                 if(c=='F'):
  184.                                         self.dbgPrint("key End")
  185.                                 if(c=='G'):
  186.                                         self.dbgPrint("key PageDown")
  187.                                 if(c=='M'):
  188.                                         self.dbgPrint("key F1")
  189.                                 if(c=='N'):
  190.                                         self.dbgPrint("key F2")
  191.                                 if(c=='O'):
  192.                                         self.dbgPrint("key F3")
  193.                                 if(c=='P'):
  194.                                         self.dbgPrint("key F4")
  195.                                 if(c=='Q'):
  196.                                         self.dbgPrint("key F5")
  197.                                 if(c=='R'):
  198.                                         self.dbgPrint("key F6")
  199.                                 if(c=='S'):
  200.                                         self.dbgPrint("key F7")
  201.                                 if(c=='T'):
  202.                                         self.dbgPrint("key F8")
  203.                                 if(c=='U'):
  204.                                         self.dbgPrint("key F9")
  205.                                 if(c=='V'):
  206.                                         self.dbgPrint("key F10")
  207.                                 if(c=='W'):
  208.                                         self.dbgPrint("key F11")
  209.                                 if(c=='X'):
  210.                                         self.dbgPrint("key F12")
  211.                                 state=0
  212.         def KeyNormal(self,c):
  213.                 self.curLine.s=self.curLine.s[:self.cursorToStrIndex]+c+self.curLine.s[self.cursorToStrIndex:]
  214.                 if(self.isModified==0):
  215.                         self.isModified=1
  216.                         self.updateTitle()
  217.                 self.cursorToStrIndex+=1
  218.                 if(self.cursor_x==self.w-1):
  219.                         self.cursor_x=1
  220.                         self.updateLine(self.cursor_y,0,self.curLine.s[self.cursorToStrIndex-1:])
  221.                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  222.                 else:
  223.                         self.cursor_x+=1
  224.                         self.updateLine(self.cursor_y,self.cursor_x-1,self.curLine.s[self.cursorToStrIndex-1:])
  225.                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  226.         def KeyTab(self):
  227.                 self.curLine.s=self.curLine.s[:self.cursorToStrIndex]+'\t'+self.curLine.s[self.cursorToStrIndex:]
  228.                 if(self.isModified==0):
  229.                         self.isModified=1
  230.                         self.updateTitle()
  231.                 self.cursorToStrIndex+=1
  232.                 if(self.cursor_x>=self.w-4):
  233.                         self.cursor_x=4
  234.                         self.updateLine(self.cursor_y,0,self.curLine.s[self.cursorToStrIndex-1:])
  235.                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  236.                 else:
  237.                         self.cursor_x+=4
  238.                         self.updateLine(self.cursor_y,self.cursor_x-4,self.curLine.s[self.cursorToStrIndex-1:])
  239.                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  240.         def KeyLeft(self):
  241.                 if(self.cursorToStrIndex>=2):
  242.                         c1=self.curLine.s[self.cursorToStrIndex-1]
  243.                         c2=self.curLine.s[self.cursorToStrIndex-2]
  244.                         if(c1=='\t'):
  245.                                 if(self.cursor_x<=4):
  246.                                         if(c2=='\t'):
  247.                                                 self.cursor_x=4
  248.                                         else:
  249.                                                 self.cursor_x=1
  250.                                         self.updateLine(self.cursor_y,0,self.curLine.s[self.cursorToStrIndex-2:])
  251.                                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  252.                                 else:
  253.                                         self.cursor_x-=4
  254.                                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  255.                         else:
  256.                                 if(self.cursor_x<=1):
  257.                                         if(c2=='\t'):
  258.                                                 self.cursor_x=4
  259.                                         else:
  260.                                                 self.cursor_x=1
  261.                                         self.updateLine(self.cursor_y,0,self.curLine.s[self.cursorToStrIndex-2:])
  262.                                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  263.                                 else:
  264.                                         self.cursor_x-=1
  265.                                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  266.                         self.cursorToStrIndex-=1
  267.                 elif(self.cursorToStrIndex==1):
  268.                         self.cursor_x=0
  269.                         self.updateLine(self.cursor_y,0,self.curLine.s)
  270.                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  271.                         self.cursorToStrIndex-=1
  272.         def KeyRight(self):
  273.                 if(len(self.curLine.s)==0):
  274.                         return
  275.                 if(self.cursorToStrIndex<len(self.curLine.s)):
  276.                         c=self.curLine.s[self.cursorToStrIndex]
  277.                 else:
  278.                         return
  279.                 if(c=='\n'):# or c=='\r'): #NOTE!!
  280.                         return
  281.                 elif(c=='\t'):
  282.                         if(self.cursor_x+4>self.w-1):
  283.                                 self.cursor_x = 4
  284.                                 self.cursorToStrIndex+=1
  285.                                 self.updateLine(self.cursor_y,0,self.curLine.s[self.cursorToStrIndex-1:])
  286.                                 self.console.SetCursor(self.cursor_y,self.cursor_x)
  287.                         else:
  288.                                 self.cursor_x+=4
  289.                                 self.cursorToStrIndex+=1
  290.                                 self.console.SetCursor(self.cursor_y,self.cursor_x)
  291.                 else:
  292.                         if(self.cursor_x+1>self.w-1):
  293.                                 self.cursor_x = 1
  294.                                 self.cursorToStrIndex+=1
  295.                                 self.updateLine(self.cursor_y,0,self.curLine.s[self.cursorToStrIndex-1:])
  296.                                 self.console.SetCursor(self.cursor_y,self.cursor_x)
  297.                         else:
  298.                                 self.cursor_x+=1
  299.                                 self.cursorToStrIndex+=1
  300.                                 self.console.SetCursor(self.cursor_y,self.cursor_x)
  301.         def KeyUp(self):
  302.                 if(self.curLine == self.lines.h):
  303.                         return
  304.                 else:
  305.                         if(self.cursor_y<=1):
  306.                                 self.cursor_x=0
  307.                                 self.cursorToStrIndex=0
  308.                                 self.curLine=self.curLine.p
  309.                                 self.firstDispLine = self.firstDispLine.p
  310.                                 self.updateEdit()
  311.                                 self.console.SetCursor(self.cursor_y,self.cursor_x)
  312.                         else:
  313.                                 self.updateLine(self.cursor_y,0,self.curLine.s)
  314.                                 self.cursor_y-=1
  315.                                 self.cursor_x=0
  316.                                 self.cursorToStrIndex=0
  317.                                 self.curLine=self.curLine.p
  318.                                 self.console.SetCursor(self.cursor_y,self.cursor_x)
  319.         def KeyDown(self):
  320.                 if(self.curLine == self.lines.t):
  321.                         return
  322.                 else:
  323.                         if(self.cursor_y>=self.h):
  324.                                 self.cursor_x=0
  325.                                 self.cursorToStrIndex=0
  326.                                 self.curLine=self.curLine.n
  327.                                 self.firstDispLine = self.firstDispLine.n
  328.                                 self.updateEdit()
  329.                                 self.console.SetCursor(self.cursor_y,self.cursor_x)
  330.                         else:
  331.                                 self.updateLine(self.cursor_y,0,self.curLine.s)
  332.                                 self.cursor_y+=1
  333.                                 self.cursor_x=0
  334.                                 self.cursorToStrIndex=0
  335.                                 self.curLine=self.curLine.n
  336.                                 self.console.SetCursor(self.cursor_y,self.cursor_x)
  337.         def KeyDelete(self):
  338.                 if(self.cursorToStrIndex<len(self.curLine.s)):
  339.                         c=self.curLine.s[self.cursorToStrIndex]
  340.                 else:
  341.                         return
  342.                 if(c!='\n'):
  343.                         self.curLine.s=self.curLine.s[:self.cursorToStrIndex]+self.curLine.s[1+self.cursorToStrIndex:]
  344.                         if(self.isModified==0):
  345.                                 self.isModified=1
  346.                                 self.updateTitle()
  347.                         self.updateLine(self.cursor_y,self.cursor_x,self.curLine.s[self.cursorToStrIndex:])
  348.                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  349.                 else:
  350.                         self.curLine.s=self.curLine.s[:-1]
  351.                         if(self.isModified==0):
  352.                                 self.isModified=1
  353.                                 self.updateTitle()
  354.                         if(self.curLine.n!=None):
  355.                                 self.curLine.s+=self.curLine.n.s
  356.                                 self.lines.erase(self.curLine.n)
  357.                                 self.updateLine(self.cursor_y,self.cursor_x,self.curLine.s[self.cursorToStrIndex:])
  358.                                 it=self.curLine.n;
  359.                                 y=self.cursor_y+1;
  360.                                 while ((it is not None) and y<=self.h):
  361.                                         self.updateLine(y,0,it.s)
  362.                                         y+=1
  363.                                         it = it.n
  364.                                 while(y<=self.h):
  365.                                         self.updateLine(y,0,"")
  366.                                         y+=1
  367.                                 self.console.SetCursor(self.cursor_y,self.cursor_x)
  368.         def KeyEnter(self):
  369.                 a=self.curLine.s[:self.cursorToStrIndex]
  370.                 b=self.curLine.s[self.cursorToStrIndex:]
  371.                 a+='\x0a'#note!!
  372.                 self.curLine.s=a
  373.                 self.lines.insert(self.curLine,b)
  374.                 if(self.isModified==0):
  375.                         self.isModified=1
  376.                         self.updateTitle()
  377.                 if(self.cursor_y>=self.h):
  378.                         self.cursor_x=0
  379.                         self.cursorToStrIndex=0
  380.                         self.curLine=self.curLine.n
  381.                         self.firstDispLine = self.firstDispLine.n
  382.                         self.updateEdit()
  383.                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  384.                 else:
  385.                         self.cursor_y+=1
  386.                         self.cursor_x=0
  387.                         self.cursorToStrIndex=0
  388.                         self.curLine=self.curLine.n
  389.                         self.updateEdit()
  390.                         self.console.SetCursor(self.cursor_y,self.cursor_x)
  391.         def KeyCtrlS(self):
  392.                 if(self.isModified==1):
  393.                         self.doSave();
  394.         def KeyCtrlX(self):
  395.                 self.console.ClearSetting()
  396.                 self.console.ClearScreen()
  397.                 self.console.SetCursor(0,0)
  398.                 import sys
  399.                 sys.exit(0)
  400. def edit(s):
  401.         editor = Editor()
  402.         editor.edit(s)
  403. def edit_debug(s):
  404.         editor = Editor()
  405.         editor.enableDebug=1
  406.         editor.edit(s)


复制代码



linelist.py
  1. class Line:
  2.         def __init__(self,str=""):
  3.                 self.s = str
  4.                 self.n = None
  5.                 self.p = None

  6. class LineList(object):
  7.         def __init__(self):
  8.                 self.h = None
  9.                 self.t = None
  10.         def add(self,a):
  11.                 nd = Line(a)
  12.                 if(self.h == None):
  13.                         self.h = nd;
  14.                 if(self.t != None):
  15.                         self.t.n = nd;
  16.                 nd.p = self.t;
  17.                 nd.n = None;
  18.                 self.t = nd;
  19.         def insert(self,a,b):
  20.                 nd = Line(b)
  21.                 if(a.n == None):
  22.                         self.add(b);
  23.                 else:
  24.                         c=a.n;
  25.                         nd.p = a;
  26.                         nd.n = c;
  27.                         a.n = nd;
  28.                         c.p = nd;
  29.         def erase(self,a):
  30.                 if(a.p == None):
  31.                         self.h = a.n;
  32.                 elif(a.n == None):
  33.                         self.t = a.p;
  34.                 else:
  35.                         a1 = a.p;
  36.                         a2 = a.n;
  37.                         a1.n = a2;
  38.                         a2.p = a1;
  39.         def isBegin(self,a):
  40.                 if(self.h == a):
  41.                         return True;
  42.                 else:
  43.                         return False;
  44.         def isEnd(self,a):
  45.                 if(self.t == a):
  46.                         return True;
  47.                 else:
  48.                         return False;

复制代码









]3ABY6)5]$_WP$6]W46~81T.png (18.09 KB, 下载次数: 0)

]3ABY6)5]$_WP$6]W46~81T.png

1@OE[%G2Y`0@9WA@4T1%E$G.png (12.55 KB, 下载次数: 0)

1@OE[%G2Y`0@9WA@4T1%E$G.png

最新回复

我搞错了,需要输入一个已经存在的文件,如果文件不存在会报错。  详情 回复 发表于 2018-6-26 10:24

赞赏

1

查看全部赞赏

点赞 关注
 
 

回复
举报

1903

帖子

0

TA的资源

版主

沙发
 
不错啊,看看了
 
 
 

回复

1万

帖子

24

TA的资源

版主

板凳
 
这个程序是怎么用的?

点评

三个文件复制进去然后 或者  详情 回复 发表于 2018-6-26 09:09
 
 
 

回复

165

帖子

0

TA的资源

一粒金砂(中级)

4
 
dcexpert 发表于 2018-6-25 21:52
这个程序是怎么用的?

三个文件复制进去然后

  1. >>> import editor
  2. >>> editor.edit("这里是文件路径")
复制代码

或者

  1. >>> from editor import edit
  2. >>> edit("这里是文件路径")
复制代码



 
 
 

回复

1万

帖子

24

TA的资源

版主

5
 
我运行后提示出错了


 
 
 

回复

1万

帖子

24

TA的资源

版主

6
 
我搞错了,需要输入一个已经存在的文件,如果文件不存在会报错。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表