From 50c5db749633fd0e75f7b03e3f44c42234c32a5f Mon Sep 17 00:00:00 2001 From: robert-hh Date: Mon, 15 Sep 2025 16:29:55 +0200 Subject: [PATCH 1/2] pye_core: Cut or copy the current line if no text is highlighted. Signed-off-by: robert-hh --- README.md | 14 +++++++---- additional_documentation/Pyboard Editor.doc | Bin 73728 -> 74240 bytes pye | 24 +++++++++++++----- pye.mpy | Bin 16093 -> 16201 bytes pye.py | 24 +++++++++++++----- pye_core.py | 26 ++++++++++++++------ pye_win | 24 +++++++++++++----- 7 files changed, 82 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 2616268..87d05c0 100644 --- a/README.md +++ b/README.md @@ -68,9 +68,10 @@ shows most of the commands.: |Alt-PgUp & Alt-PgDn|Cycle trough bookmarked locations| |Alt-Home & Alt-End|Cycle trough locations with changes, based on the Undo list| |Ctrl-L or Ctrl-Space|Start highlighting at the current position, or clear the highlight. The highlight can then be extended by moving the cursor| -|Ctrl-X|Cut the highlighted text| -|Ctrl-C or Ctrl-D|Copy the highlighted text| +|Ctrl-X|Cut the highlighted text. If the mark is not set, cut the current line.| +|Ctrl-C|Copy the highlighted text. If the mark is not set, copy the current line.| |Ctrl-V|Insert the copied/cut text.| +|Ctrl-D|Copy text from the Undo buffer to the paste buffer.| |Ctrl-Z|Undo the last change(s)| |Ctrl-Y|Redo the last undo(s), repeating what had been undone by undo| |Ctrl-P|Comment/Uncomment a line or highlighted area| @@ -568,8 +569,11 @@ the list of files in the current dir **2.75** Fix an error with character swap. -**2.76** Cycle through places with changes. +**2.76** Cycle through places with changes. -**2.77** Change key binding for bookmark location to Alt-Ins, using Alt-Home and Alt-End to cycle through -locations with changes. +**2.77** Change key binding for bookmark location to Alt-Ins, using Alt-Home and Alt-End +to cycle through locations with changes. +**2.78** Use Ctrl-D to copy text from the UNDO buffer to the Paste buffer. + +**2.79** Cut or copy the current line if no text is highlighted. diff --git a/additional_documentation/Pyboard Editor.doc b/additional_documentation/Pyboard Editor.doc index 4e2ebf5442fcb685d2d2c77fb7adbecceb922631..248dc69187bca101db86cf48bc9a888a8113fe0d 100644 GIT binary patch delta 4613 zcmZwK4^Y%)9>?+Tv+UvmyNL2fM5GlsLZU<>jyMky%tJE&aAZb^LY`46B9cd(1uDli znq)p5OOA76j&oO@S-FM|<9OzAp5s(wj^mhm)^&{$jQYbuf&otV$FyFAWn(_M^nupZR1WTQOoJJWV2|87WMY=!o zBkpwP%itXYH!h1k=E)B+Cf80G6>F2dzK{{-o?yGe8*j$h72cnkiT2Ol31*5t`5^%>weoG;W4iTTag}*c_-L6 z=eEA@*~y+1^HH!zGd=zpZ2f`OWo^0gv~S??$OYkc|LF9k<+tWDG}TDF%qk6+IVdho zl-Z>bQdR1aYTCI{6lJ8$mCNXGDVJYKlQhcHa#b3no~;J%nPo&B#sir#B=;Fv5y199Ja|?sV+vX|^jw@zV zJ(vHaER#ArF(E1I)``=C9e2CZ=;)H^9C%Uiv+CAk|GkjF`h*BGu0TqIOQwL%;e7Zy zj;T|jN7mL78yMpcDTtb4A4+^TKXbD1DP%vL?3&*C}tPp3B4spkcyfQ|l$0zbxy2vT+{yK)9m?3g?uE^1+MMg6G z3eMJve9mDGbC~Ys!9(pFTVU%$oPqwazYmYrOVWoUYUoumCkHmAM}~y{GHs)gD7)I3 zY@5f&+x*OOyY;RL+mRW6Z`!JlxnSWtsgF;>Me_OlZn?;oQ`T4c z#0&?YC8;9C8=M0j&H|Zi$2pTm+_*7Zrn1T5n4IA<(>_-*E-Z@GqK_#1-uM)kZpCm- zcO|9LDrbKauWi8|Lr=SsL0?Kk@W^;^d3d-i6}g@K-~Ml))vgz;C*L3xXV>GI(lW?z0Y zc7!ghMZDva8cwlT7Ta0NN7=ep<2X_1m|A+)@t!U@y@=}IRtKnH#uc z^HPVc>4*z#-BMk=>F#v_^XW^WEx83Ec_={}PO%VIw{sp(~@GoLLy8qp8HV3=dtS^qW=%760qX;FK zfl9mpUF^L$g@R%#3L4Ok3-}6GF^Ji$sprv(HCTsDcpY!!G~5rc?BGG-1JWX?G>-p* zPmRxU0hOgfVu{pYC3+s@n~b;l*6qd~?89;BH}NDE&SLE$pM^IG33E6BviOo`<2X)0 zzw}JPKltO>_V<<9*i#ynJ@28&RS1~g+8+R%;;Y(y6}V;i<(Cw8G5`)~-o z_z=f%8fS4HeM^~y0UBBeu453P6a+V-FcJw!L>khOjT{u95G5!@8Ol+KDlA4V>d}Bz zcpfic9bQ3a9cynZjcwS8UD$^n^x`l+#4((PR;%;q!vL;e5JaDZ!vigfcH!mecIicr zedFRIExIEf$wV z%b4PmG*00&Xsx}5@8GDX9>Rl2#33F&BqIZv$U!a&P>6EO#XMA?5>;4;8q}i!jaXUF z6t~f6$1CW>>)3&v*oC*T8+*`=Ug!^kBRGmvIE_B^Lw|Ev-`6Sj>5JL+jmwX;=#D`M zzaSiNA{1_fBOVDzM+Wkcj}nxk4CSaq6&9lw^=LpdR-p~;=)gvFVe@jPcn6K0*aQ6; za{vc%1V?ckCvX<$a2|cQgaJ%i!So{M*Sw+?YjCxR+l774vM5pc92baPt;`yF*D_OU zy_3ftv_0Fw9IH}`M#{2m=VahcGBd2Uskk~Xc^HG@_qTx5~1Zm zOM{jJEd^QzuFka?*Jhhn{l`Mh==(Ns@>`GJ-D=TTef!35Zr^x@pJ#FY8%`7E&vY4& z-{&%)_&;%(aX;7cqGd!&h?Wm69X-&Bq18ewg;ocx3|bAe5@;3B3h=FeRq_a{N7ECc$4g%>1RrB{%=I*uiP^I9f%tf@t-~fmV%j zXtijBRtv2ZS|zkXXm!xSphZCo!Xaou&|;v4K#PDD01bZ){*kzN>x%sUcAK%CT#fQ~ zMVfy9n-NS*cbJ*Jc(nG7fffiY4%yJ6panp~UxQyme=!=Mfv;h&L9ZdN0k7e%!QKN6 zb`5n6bizEC`^d(NtxcF~8OS~q(roNjH z9f=rd+NUE2n(&(L<PdX3lK z?TqmM$!i|1(J1eOM!3eeMz^N4CUhD!p*5W~nKhL)ku{Aqi8Y1Wp((5htm&)CtEo%k z2E+FAW&X=1~e^8F$0>Env$B3nvR-`nu?l;q@iqqhGF;e;1v9D_M=U- zUPY?^9M>~V(^8XCQ&JOB(@~RAQ}GHk6*UPp1vLRR{WSRwlYAO@Lt*!$x%T?&W6Y7E fRA`Jf>&=MnICITq%JzOc#t delta 4650 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 D+Ikzc diff --git a/pye b/pye index f6e75b7..a9dd75b 100755 --- a/pye +++ b/pye @@ -21,7 +21,7 @@ ## - Added multi-file support ## -PYE_VERSION = " V2.78 " +PYE_VERSION = " V2.79 " try: import usys as sys except: @@ -1118,12 +1118,24 @@ class Editor: self.cur_line, self.col = cur_line, cur_col ## restore pos self.message = "'{}' replaced {} times".format(pat, count) elif key == KEY_CUT: # delete line or line(s) into buffer - if self.mark is not None: - self.delete_mark(True) + if self.mark is None: + if self.cur_line < self.total_lines - 1: + self.mark = (self.cur_line + 1, 0) + else: + self.mark = (self.cur_line, len(l)) + self.col = 0 + self.delete_mark(True) elif key == KEY_COPY: # copy line(s) into buffer - if self.mark is not None: - self.yank_mark() - self.clear_mark() + col = self.col + if self.mark is None: + if self.cur_line < self.total_lines - 1: + self.mark = (self.cur_line + 1, 0) + else: + self.mark = (self.cur_line, len(l)) + self.col = 0 + self.yank_mark() + self.clear_mark() + self.col = col elif key == KEY_PASTE: ## insert buffer if Editor.yank_buffer: self.col = self.vcol diff --git a/pye.mpy b/pye.mpy index 3d2d556f0fa70013c16703c008ad535543f3d682..19793d83d616cc2654ce57e816be7c769d497e69 100644 GIT binary patch delta 568 zcmcaxd$MkV7^CGzac32#y(*hyRIV}_{9e4V`=*Q629ZVwGloc~H;XsUhj5)h+`Ef6 z&b#U24U~1=Y{nSrbawINL^W@whQ*WDso68_Uo`o>+BK%<3nm{|KgTqE{^aQz*-WeE zO=i)IS2#I$DkoD z9=d8w`=(AV&=vPvIu&GR=}nhFpgBQ6bAS{$1bV;{1t=2Wu=qR$q$3~XO1KV4sN9?~ z`KoRbUpJQ4*Z}N1FY^Hs4 zC$nhAE8Ly4al%cP$PL1cYz;SEJb@;d0ZnjnY}g>t$mXCSPCtuK%khw8? zqf+z#qMI&38^VPfnT3Re8|9xyNi;G$?VCNBMaz!q->k_lT6#?9W=$^9(h^-XYvYug zF8)9xLx64s8OZF^H+i#`GSjP>lW%BkV%j!ia*wtb)2r!|Z)gWF&6vJfOGk#0>DQFW z9=d8wm!?cE&=vRFIR#{A=}nhFpgBQ6bAS{$1QviL3Q#1#VbKnj$OpL+t^*P(ZzoT_ zs++{vIoU!lnrZE%$y4>_Gxkh2)jz;=x_|O_{XVAMeUsY_t}#9CnH+C;pRsAPy-^*b zd2`3c88=-*fFYzGc<-`{2hh~;AW$H`YTwv$( Date: Fri, 10 Oct 2025 15:13:47 +0200 Subject: [PATCH 2/2] Allow using editor as file browser When opening a dir the dir is listed. When viewing a dir listing and positioning the cursor over a file name and pressing Ctrl-O, the file name is used as the default value for the filename prompt. --- pye | 11 ++++++----- pye.mpy | Bin 16201 -> 16133 bytes pye.py | 9 +++++---- pye_core.py | 9 +++++---- pye_win | 11 ++++++----- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/pye b/pye index a9dd75b..b606f37 100755 --- a/pye +++ b/pye @@ -4,7 +4,7 @@ ## Small python text editor based on the ## Very simple VT100 terminal text editor widget ## Copyright (c) 2015 Paul Sokolovsky (initial code) -## Copyright (c) 2015-2021 Robert Hammelrath (additional code) +## Copyright (c) 2015-2025 Robert Hammelrath (additional code) ## Distributed under MIT License ## Changes: ## - Ported the code to boards from micropython.org, Pycom Boards, @@ -1247,7 +1247,7 @@ class Editor: key = self.handle_edit_keys(key, char) if key == KEY_QUIT: - if self.hash != self.hash_buffer(): + if self.hash != self.hash_buffer() and not self.is_dir: res = self.line_edit("File changed! Quit (y/N/f)? ", "N") if not res or res[0].upper() == "N": continue @@ -1294,8 +1294,8 @@ class Editor: if fname: try: self.fname = fname - if fname in (".", "..") or (os.stat(fname)[0] & 0x4000): ## Dir - os.chdir(fname) + if fname in (".", "..", "") or (os.stat(fname)[0] & 0x4000): ## Dir + os.chdir(fname or ".") self.work_dir = os.getcwd() # let the os module do the normalization self.fname = "/" if self.work_dir == "/" else self.work_dir.split("/")[-1] self.content = ["Directory '{}'".format(self.work_dir), ""] + sorted( @@ -1393,7 +1393,8 @@ def pye_edit(content, tab_size=4, undo=50, io_device=None): break del slot[index] elif key == KEY_GET: - f = slot[index].line_edit("Open file: ", "", Editor.file_char) + dfn = slot[index].content[slot[index].cur_line].strip() if slot[index].is_dir else "" + f = slot[index].line_edit("Open file: ", dfn, Editor.file_char) if f is not None: slot.append(Editor(tab_size, undo, io_device)) index = len(slot) - 1 diff --git a/pye.mpy b/pye.mpy index 19793d83d616cc2654ce57e816be7c769d497e69..0a80aa42c9cfd68d05b646c9b0e1122dc845cfbe 100644 GIT binary patch delta 9323 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 Gp7>vx4#B+u diff --git a/pye.py b/pye.py index 8b4ce64..35c3333 100644 --- a/pye.py +++ b/pye.py @@ -1145,7 +1145,7 @@ def edit_loop(self): self.message = "" key = self.handle_edit_keys(key, char) if key == KEY_QUIT: - if self.hash != self.hash_buffer(): + if self.hash != self.hash_buffer() and not self.is_dir: res = self.line_edit("File changed! Quit (y/N/f)? ", "N") if not res or res[0].upper() == "N": continue @@ -1185,8 +1185,8 @@ def get_file(self, fname): if fname: try: self.fname = fname - if fname in (".", "..") or (os.stat(fname)[0] & 0x4000): - os.chdir(fname) + if fname in (".", "..", "") or (os.stat(fname)[0] & 0x4000): + os.chdir(fname or ".") self.work_dir = os.getcwd() self.fname = "/" if self.work_dir == "/" else self.work_dir.split("/")[-1] self.content = ["Directory '{}'".format(self.work_dir), ""] + sorted( @@ -1274,7 +1274,8 @@ def pye_edit(content, tab_size=4, undo=50, io_device=None): break del slot[index] elif key == KEY_GET: - f = slot[index].line_edit("Open file: ", "", Editor.file_char) + dfn = slot[index].content[slot[index].cur_line].strip() if slot[index].is_dir else "" + f = slot[index].line_edit("Open file: ", dfn, Editor.file_char) if f is not None: slot.append(Editor(tab_size, undo, io_device)) index = len(slot) - 1 diff --git a/pye_core.py b/pye_core.py index d832be1..d54fe01 100644 --- a/pye_core.py +++ b/pye_core.py @@ -1245,7 +1245,7 @@ def edit_loop(self): ## main editing loop key = self.handle_edit_keys(key, char) if key == KEY_QUIT: - if self.hash != self.hash_buffer(): + if self.hash != self.hash_buffer() and not self.is_dir: res = self.line_edit("File changed! Quit (y/N/f)? ", "N") if not res or res[0].upper() == "N": continue @@ -1292,8 +1292,8 @@ def get_file(self, fname): if fname: try: self.fname = fname - if fname in (".", "..") or (os.stat(fname)[0] & 0x4000): ## Dir - os.chdir(fname) + if fname in (".", "..", "") or (os.stat(fname)[0] & 0x4000): ## Dir + os.chdir(fname or ".") self.work_dir = os.getcwd() # let the os module do the normalization self.fname = "/" if self.work_dir == "/" else self.work_dir.split("/")[-1] self.content = ["Directory '{}'".format(self.work_dir), ""] + sorted( @@ -1391,7 +1391,8 @@ def pye_edit(content, tab_size=4, undo=50, io_device=None): break del slot[index] elif key == KEY_GET: - f = slot[index].line_edit("Open file: ", "", Editor.file_char) + dfn = slot[index].content[slot[index].cur_line].strip() if slot[index].is_dir else "" + f = slot[index].line_edit("Open file: ", dfn, Editor.file_char) if f is not None: slot.append(Editor(tab_size, undo, io_device)) index = len(slot) - 1 diff --git a/pye_win b/pye_win index 8e5c902..3e832d8 100644 --- a/pye_win +++ b/pye_win @@ -2,7 +2,7 @@ ## Small python text editor based on the ## Very simple VT100 terminal text editor widget ## Copyright (c) 2015 Paul Sokolovsky (initial code) -## Copyright (c) 2015-2021 Robert Hammelrath (additional code) +## Copyright (c) 2015-2025 Robert Hammelrath (additional code) ## Distributed under MIT License ## Changes: ## - Ported the code to boards from micropython.org, Pycom Boards, @@ -1245,7 +1245,7 @@ class Editor: key = self.handle_edit_keys(key, char) if key == KEY_QUIT: - if self.hash != self.hash_buffer(): + if self.hash != self.hash_buffer() and not self.is_dir: res = self.line_edit("File changed! Quit (y/N/f)? ", "N") if not res or res[0].upper() == "N": continue @@ -1292,8 +1292,8 @@ class Editor: if fname: try: self.fname = fname - if fname in (".", "..") or (os.stat(fname)[0] & 0x4000): ## Dir - os.chdir(fname) + if fname in (".", "..", "") or (os.stat(fname)[0] & 0x4000): ## Dir + os.chdir(fname or ".") self.work_dir = os.getcwd() # let the os module do the normalization self.fname = "/" if self.work_dir == "/" else self.work_dir.split("/")[-1] self.content = ["Directory '{}'".format(self.work_dir), ""] + sorted( @@ -1391,7 +1391,8 @@ def pye_edit(content, tab_size=4, undo=50, io_device=None): break del slot[index] elif key == KEY_GET: - f = slot[index].line_edit("Open file: ", "", Editor.file_char) + dfn = slot[index].content[slot[index].cur_line].strip() if slot[index].is_dir else "" + f = slot[index].line_edit("Open file: ", dfn, Editor.file_char) if f is not None: slot.append(Editor(tab_size, undo, io_device)) index = len(slot) - 1