free software resistance

 the cost of computing freedom is eternal vigilance

### she23.py *originally posted:* jul 2025 she23.py- wrap command will return to character wrap (like older versions) and toggle word wrap on/off this was originally uploaded without a version increase, self.ver was still set to 2.2- this is now fixed. ``` #!/usr/bin/pypy2 # coding: utf-8 # Copyright 2020, 2021, 2022, 2024, 2025 mn, fcr # This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/. import os from sys import argv, stdin from Tkinter import * import tkFileDialog as filedialog class Application(Frame): def ctrlq(self, *args): root.destroy() def set_window_title(self,name = None): if name: self.master.title(name) else: self.master.title("she " + self.ver + " - Untitled - path:" + os.getcwd()) def newfile(self, *args): self.textarea.delete(1.0, END) self.filename = None self.set_window_title() def savefile(self, *args): if self.filename: try: textarea_content = self.textarea.get(1.0,END) with open(self.filename,"w") as f: f.write(textarea_content.encode('utf-8')) except Exception as e : print(e) else: self.saveasfile() def saveasfile(self, *args): try: new_file = filedialog.asksaveasfilename( initialfile = "untitled.txt", defaultextension = ".txt", filetypes = [("All Files", "*.*"), ("Text File", "*.txt"), ("Python file", "*.py"), ("FIG ", "*.fig"), ("FIG PLUS ", "*.fgp"), ("PAVUM", "*.pav"), ("JavaScript", "*.js"), ("HTML Documents", "*.html"), ("CSS Document", "*.css")]) textarea_content = self.textarea.get(1.0,END) with open(new_file, "w") as f: f.write(textarea_content.encode('utf-8')) self.filename = new_file self.set_window_title(self.filename) except Exception as e: print(e) def openfile(self, *args): self.filename = filedialog.askopenfilename( defaultextension = "", filetypes = [("All Files","*.*"), ("Text File","*.txt"), ("Python file","*.py"), ("FIG ","*.fig"), ("FIG PLUS ","*.fgp"), ("PAVUM","*.pav"), ("JavaScript","*.js"), ("HTML Documents","*.html"), ("CSS Document","*.css")]) if self.filename: self.textarea.delete(1.0, END) with open(self.filename, "r") as f: self.textarea.insert(1.0, f.read()) self.set_window_title(self.filename + " - she " + self.ver + " - path:" + os.getcwd()) def about(self, *args): nl = chr(10) text = "# about she " + self.ver + "\n\n# she is a text editor originally based on ej, which lets you run shell commands in the editor. to run the text on the current line, just use ctrl+t.\n\n# copyright 2020, 2021, 2022, 2024, 2025 mn, fcr\n\n# This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\n# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/." self.textarea.insert(INSERT, nl + text + " " + nl) def ctrlt(self, *args): try: sf = self.filename except: sf = "" nl = chr(10) ; from os import popen as po # self.textarea.insert(1.0, "hello" + " " + nl) try: selectflag = 0 sel = [""] sel = self.textarea.get(SEL_FIRST, SEL_LAST).split(nl) selectflag = 1 cmd = sel[0].rstrip() except: cmd = self.textarea.get(1.0,END).split(nl) cmd = cmd[int(self.textarea.index(INSERT).split(".")[0]) - 1] try: first = cmd.split()[0].lower() amp = (chr(32) + cmd.split(nl)[0]).rstrip()[-1] except: first = "" amp = "" if first == "cd": try: second = cmd.split()[1] ; os.chdir(second) ; self.textarea.insert(INSERT, nl + " " + nl) except: pass self.set_window_title("she " + self.ver + " - path:" + os.getcwd()) elif first == "=" + ">": try: second = cmd.split()[1] except: second = "" try: self.hist += ["=" + ">" + chr(32) + os.path.abspath(second)] if len(self.hist) > self.histlimit: self.hist = self.hist[-self.histlimit:] hists = chr(10).join(self.hist) + chr(10) with open(second, "r") as f: self.textarea.delete(1.0, END) self.textarea.insert(1.0, hists) self.textarea.insert(END, f.read()) self.textarea.insert(END, chr(10)) self.filename = second except: self.textarea.insert(INSERT, nl + "unable to open " + second + ", might not exist or wrong folder " + nl) try: uwd = "/".join((second + ".html").split("/")[:-1]) os.chdir(uwd) ; self.textarea.insert(INSERT, nl + " " + nl) except: pass self.set_window_title(second + " - she " + self.ver + " - path:" + os.getcwd()) elif cmd.strip() == "cls": self.textarea.delete(INSERT, END) self.textarea.insert(END, chr(32) + chr(10)) elif first == "appto": try: second = cmd.split()[1] added = "" with open(second, "a") as outfile: for each in sel[1:]: outfile.write((each + nl).encode('utf-8')) outfile.close() added = nl + "= added =" self.textarea.insert(INSERT, added + nl + " " + nl) except: pass elif first == "wrap": try: towrap = "word" towrap = self.textarea["wrap"] if towrap == "word": self.textarea.configure(wrap = CHAR) else: self.textarea.configure(wrap = WORD) except: pass self.textarea.insert(INSERT, nl + " " + nl) elif first == "mk": eno = -1 import sys try: second = cmd.lstrip()[len("mk") + 1:].split("|") except: second = [] try: eno = 0 f = [] if selectflag: selget = sel[1:] else: selget = self.textarea.get(1.0,END).split(nl) bdir = os.getcwd() udir = '/home/' + os.getlogin() + '/she' try: os.chdir('/root/she') udir = '/root/she' except: pass os.chdir(bdir) try: if not udir in sys.path: sys.path.insert(0, udir) import custom from custom import mkcustom reload(custom) from custom import mkcustom f = mkcustom(selget, second) except: f = [udir + '/custom.py error'] os.chdir(bdir) except: pass self.textarea.insert(INSERT, nl + "\n".join(f) + " " + nl) elif first == "sort": try: f = [] if selectflag: selget = sel[1:] else: selget = self.textarea.get(1.0, END).split(nl) selget.sort() for each in selget: f += [each] except: pass self.textarea.insert(INSERT, nl + "\n".join(f) + " " + nl) elif first == "tac": try: f = [] if selectflag: selget = sel[1:] else: selget = self.textarea.get(1.0, END).split(nl) selget.reverse() for each in selget: f += [each] except: pass self.textarea.insert(INSERT, nl + "\n".join(f) + " " + nl) elif first == "uniq": try: f = [] if selectflag: selget = sel[1:] else: selget = self.textarea.get(1.0,END).split(nl) beach = "" for each in selget: if each.strip() != beach.strip(): f += [each] beach = each except: pass self.textarea.insert(INSERT, nl + "\n".join(f) + " " + nl) elif first == "rev": try: f = [] if selectflag: selget = sel[1:] else: selget = self.textarea.get(1.0,END).split(nl) for each in selget: f += [each[::-1]] except: pass self.textarea.insert(INSERT, nl + "\n".join(f) + " " + nl) elif first == "seek": try: second = cmd.lstrip()[len("seek") + 1:].split("|") f = [] if selectflag: selget = sel[1:] else: selget = self.textarea.get(1.0,END).split(nl) for each in selget: for parts in second: if parts.lower() in each.lower(): f += [each] break except: pass self.textarea.insert(INSERT, nl + "\n".join(f) + " " + nl) elif first == "unseek": try: second = cmd.lstrip()[len("unseek") + 1:].split("|") f = [] if selectflag: selget = sel[1:] else: selget = self.textarea.get(1.0, END).split(nl) for each in selget: flag = 1 for parts in second: if parts.lower() in each.lower(): flag = 0 break if flag: f += [each] except: pass self.textarea.insert(INSERT, nl + "\n".join(f) + " " + nl) elif first == "replace": try: second = cmd.lstrip()[len("replace") + 1:].split("|") f = [] rfrom = second[0].replace("\\n", "\n") rfto = second[1].replace("\\n", "\n") if selectflag: selget = sel[1:] else: selget = self.textarea.get(1.0,END).split(nl) for each in "\n".join(selget).replace(rfrom, rfto).split("\n"): f += [each] except: pass self.textarea.insert(INSERT, nl + "\n".join(f) + " " + nl) elif first == "saferbrowse": if self.saferbrowse == 0: self.saferbrowse = 1 self.textarea.insert(INSERT, nl + "saferbrowse on " + nl) else: self.saferbrowse = 0 self.textarea.insert(INSERT, nl + "saferbrowse off " + nl) elif first == "wcl": try: if selectflag: f = sel else: f = self.textarea.get(1.0,END).split(nl)[1:] except: pass self.textarea.insert(INSERT, nl + str(len(f) - 1) + " " + nl) else: try: if amp == "&": if not ">" in cmd.split(nl)[0] or self.saferbrowse == 0: f = os.system(cmd.split(nl)[0].encode('utf-8')) self.textarea.insert(INSERT, nl + " " + nl) if ">" in cmd.split(nl)[0] and self.saferbrowse != 0: self.textarea.insert(INSERT, nl + "saferbrowse is on; run the saferbrowse command to toggle file redirection " + nl) else: if first[0] != "*": if not ">" in cmd.split(nl)[0] or self.saferbrowse == 0: f = po(cmd.split(nl)[0].encode('utf-8')) self.textarea.insert(INSERT, nl + f.read().rstrip() + " " + nl) if ">" in cmd.split(nl)[0] and self.saferbrowse != 0: self.textarea.insert(INSERT, nl + "saferbrowse is on; run the saferbrowse command to toggle file redirection " + nl) except: pass def controls(self): self.menus = Menu(self) root.config(menu=self.menus) file_menu = Menu(self.menus) file_menu.add_command(label = "new file", command = self.newfile) file_menu.add_command(label = "open file", command = self.openfile) file_menu.add_command(label = "save", command = self.savefile) file_menu.add_command(label = "save as", command = self.saveasfile) file_menu.add_separator() file_menu.add_command(label = "quit", command = root.destroy) self.menus.add_cascade(label = "file", menu = file_menu) about_menu = Menu(self.menus) about_menu.add_command(label = "about", command = self.about) self.menus.add_cascade(label = "about", menu = about_menu) self.textarea = Text(self, wrap=WORD) self.menus.configure(font = ("monospace", 14), bg = "#e7e7e7") self.textarea.configure(font = ("monospace", 16), bg = "#e7e7e7") self.textarea.pack({"side": "left", "fill": "both", "expand": "true"}) self.scroll = Scrollbar(self, command = self.textarea.yview) self.textarea.configure(yscrollcommand = self.scroll.set) self.scroll.pack({"side": "right", "fill": "y"}) self.textarea.bind('<' + 'Control-t>', self.ctrlt) self.textarea.bind('<' + 'Control-n>', self.newfile) self.textarea.bind('<' + 'Control-o>', self.openfile) self.textarea.bind('<' + 'Control-s>', self.savefile) self.textarea.bind('<' + 'Control-S>', self.saveasfile) self.textarea.bind('<' + 'Control-b>', self.ctrlt) self.textarea.bind('<' + 'Control-q>', self.ctrlq) def __init__(self, master = None): Frame.__init__(self, master) self.pack({"side": "left", "fill": "both", "expand": "true"}) self.controls() self.ver = "2.3" self.saferbrowse = 1 self.histlimit = 10 self.hist = [] root.title("untitled - she " + self.ver + " - path:" + os.getcwd()) self.master = master self.filename = None pst = "" if not os.isatty(stdin.fileno()): for p in stdin: pst += str(p[:-1]) + chr(10) self.textarea.insert(1.0, pst) try: if argv[1:][0]: self.filename = argv[1:][0] with open(self.filename, "r") as f: self.textarea.insert(1.0, f.read()) self.set_window_title(self.filename + " - she " + self.ver + " - path:" + os.getcwd()) except: pass root = Tk() app = Application(master = root) app.mainloop() try: root.destroy() except: pass ``` license: gpl, version 3 or later => https://freesoftwareresistance.neocities.org