Update nano.py

This commit is contained in:
OusmBlueNinja 2023-08-27 18:28:39 -05:00 committed by GitHub
parent 46dc6c47bd
commit 2cccab40f1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,15 +1,18 @@
#["nano", "packages.nano", ["nano"]] #["nano", "packages.nano", ["nano"]]
import os
import curses import os, time
from pygments import highlight from pygments import highlight
from pygments.lexers import PythonLexer from pygments.lexers import PythonLexer
from pygments.formatters import TerminalFormatter from pygments.formatters import TerminalFormatter
def clear():
os.system('cls' if os.name == 'nt' else 'clear')
class TextEditor: class TextEditor:
def __init__(self): def __init__(self):
self.lines = [] self.lines = []
self.file = "" self.file = ""
self.cursor = (0, 0) # (line, column)
def load_file(self, filename): def load_file(self, filename):
try: try:
@ -24,82 +27,108 @@ class TextEditor:
with open(filename, "w") as file: with open(filename, "w") as file:
file.writelines(self.lines) file.writelines(self.lines)
def edit(self, stdscr): def edit(self):
self.stdscr = stdscr while True:
curses.curs_set(1) # Show cursor os.system('cls' if os.name == 'nt' else 'clear')
self.stdscr.clear()
self.display() self.display()
while True: action = input("\nCommands: [e]dit, [b]ulk-edit, [n]ewline, [s]ave, [q]uit: ").lower()
key = self.stdscr.getch()
if key == curses.KEY_UP: if action == "e":
self.move_cursor(-1) self.edit_lines()
elif key == curses.KEY_DOWN: elif action == "n":
self.move_cursor(1)
elif key == curses.KEY_LEFT:
self.move_cursor(0, -1)
elif key == curses.KEY_RIGHT:
self.move_cursor(0, 1)
elif key == ord('\n'):
self.newline() self.newline()
elif key == curses.KEY_BACKSPACE or key == 127: elif action == "s":
self.delete_character()
elif key == 19: # Ctrl + S
filename = input("Enter filename to save: ") filename = input("Enter filename to save: ")
self.save_file(filename) self.save_file(filename)
print(f"File '{filename}' saved.") print(f"File '{filename}' saved.")
elif key == 17: # Ctrl + Q elif action == "q":
print("Exiting the text editor.") print("Exiting the text editor.")
break break
elif key >= 32 and key <= 126:
self.insert_character(chr(key))
elif key == 27: # Escape key
pass
self.stdscr.clear() elif action == 'b':
self.display() try:
self.b_edit_lines()
filename = self.file
self.save_file(filename)
print(f"File '{filename}' saved.")
except KeyboardInterrupt:
self.save_file(filename)
print(f"File '{filename}' saved.")
else:
print("Invalid command.")
def display(self): def display(self):
self.stdscr.addstr(0, 0, "Editing: " + self.file) print("Editing: " + self.file)
termSize = os.get_terminal_size()
colms = termSize[0]
for i, line in enumerate(self.lines): for i, line in enumerate(self.lines):
highlighted_line = highlight(line, PythonLexer(), TerminalFormatter()) highlighted_line = highlight(line, PythonLexer(), TerminalFormatter())
if i == self.cursor[0]: print(f"{i + 1}: {highlighted_line}", end="")
cursor_column = self.cursor[1]
self.stdscr.addstr(i + 1, 0, f"{i + 1}: {highlighted_line[:cursor_column]}{highlighted_line[cursor_column:]}")
else:
self.stdscr.addstr(i + 1, 0, f"{i + 1}: {highlighted_line}")
def move_cursor(self, line_change=0, column_change=0):
new_line = self.cursor[0] + line_change
new_column = self.cursor[1] + column_change
if 0 <= new_line < len(self.lines):
line_length = len(self.lines[new_line])
new_column = max(0, min(new_column, line_length))
self.cursor = (new_line, new_column)
def newline(self): def newline(self):
line, column = self.cursor self.lines.append("\n")
self.lines[line] = self.lines[line][:column] + '\n' + self.lines[line][column:]
self.move_cursor(1, 0)
def delete_character(self): def edit_lines(self):
line, column = self.cursor line_number = int(input("Enter line number to edit: ")) - 1
if column > 0: while line_number >= len(self.lines):
self.lines[line] = self.lines[line][:column - 1] + self.lines[line][column:] self.newline()
self.move_cursor(0, -1) if 0 <= line_number < len(self.lines):
elif line > 0: new_line = input("Enter new text: ")
prev_line_len = len(self.lines[line - 1]) self.lines[line_number] = new_line + "\n"
self.lines[line - 1] = self.lines[line - 1][:-1] + self.lines[line] else:
self.lines.pop(line) print("Invalid line number.")
self.move_cursor(-1, prev_line_len)
def insert_character(self, char): def b_edit_lines(self):
line, column = self.cursor
self.lines[line] = self.lines[line][:column] + char + self.lines[line][column:]
self.move_cursor(0, 1)
line_number = int(input("Enter line number to start: ")) - 1
#print(line_number, len(self.lines))
if line_number <= -1:
print("Invalid line number.")
return
while line_number >= len(self.lines):
self.newline()
#if -1 < line_number < len(self.lines):
#print("Invalid line number.")
#return
clear()
self.display()
while True:
clear()
self.display()
if line_number >= len(self.lines):
self.newline()
print(f"\n{' '*(len(str(line_number))+1)} {highlight(self.lines[line_number], PythonLexer(), TerminalFormatter())}", end="")
new_line = input(f"{line_number+1}: ")
if new_line == "":
new_line = " "
if new_line[0] == ':':
command = new_line.split(" ")
if command[0] == ":h":
print("Commands:\n :q -> save and return to prompt\n :g -> goto line number <:g 11> (goes to line 11)")
time.sleep(5)
clear()
continue
elif command[0] == ":q":
self.save_file("")
break
elif command[0] == ":g":
gotoLine = int(command[1])
line_number = gotoLine -1
continue
self.lines[line_number] = new_line + "\n"
line_number +=1
def nano(args): def nano(args):
if len(args) != 1: if len(args) != 1:
@ -111,4 +140,4 @@ def nano(args):
editor = TextEditor() editor = TextEditor()
editor.file = filename editor.file = filename
editor.load_file(filename) editor.load_file(filename)
curses.wrapper(editor.edit) editor.edit()