Velocity/main.py

124 lines
3.4 KiB
Python
Raw Normal View History

2022-03-19 15:13:28 +00:00
from core import colors, cursors, buffers, modes, utils
from core.buffers import Buffer
from core.components import Components
import traceback
import argparse
import curses
import sys
import os
class Lambda:
def __init__(self, buffer: Buffer):
self.screen = curses.initscr()
self.buffer = buffer
self.cursor = [0, 0]
self.mode = "normal"
self.components = Components()
self.height = self.screen.getmaxyx()[0]
self.width = self.screen.getmaxyx()[1]
self.safe_height = self.height - len(self.components.components["bottom"])
self.config = {"icon": "λ"}
def update_dimensions(self):
2022-03-19 15:41:40 +00:00
# Calculate the entire height and width of the terminal
2022-03-19 15:13:28 +00:00
self.height, self.width = self.screen.getmaxyx()
2022-03-19 15:41:40 +00:00
# Calculate the safe area for the buffer by removing heights & widths of components
2022-03-19 15:13:28 +00:00
self.safe_height = self.height - len(self.components.components["bottom"])
def update(self):
# Update the dimensions
self.update_dimensions()
# Refresh the on-screen components
self.components.render(self)
# Move the cursor
cursors.cursor_move(self.screen, self.cursor)
def start(self):
# Initialise colors
colors.init_colors()
# Change the cursor shape
cursors.cursor_mode("block")
2022-03-19 15:41:40 +00:00
# Don't echo any key-presses
2022-03-19 15:13:28 +00:00
curses.noecho()
# Show a welcome message if lambda opens with no file
if not self.buffer.path:
utils.welcome(self.screen)
# Main loop
self.run()
def run(self):
2022-03-19 15:41:40 +00:00
# The main loop, which runs until the user quits
2022-03-19 15:13:28 +00:00
while True:
# Write the buffer to the screen
# buffers.write_buffer(screen, buffer)
# Update the screen
self.update()
# Wait for a keypress
key = self.screen.getch()
# Handle the key
modes.handle_key(self, key)
# Refresh and clear the screen
self.screen.refresh()
self.screen.clear()
def main():
2022-03-19 15:41:40 +00:00
# Shell arguments
2022-03-19 15:13:28 +00:00
parser = argparse.ArgumentParser(description="Next generation hackable text editor for nerds.")
parser.add_argument("file", metavar="file", type=str, nargs="?",
help="The name of a file for lambda to open")
2022-03-19 15:41:40 +00:00
# Collect the arguments passed into lambda at the shell
2022-03-19 15:13:28 +00:00
args = parser.parse_args()
2022-03-19 15:41:40 +00:00
# Load the file into a Buffer object
2022-03-19 15:13:28 +00:00
buffer = buffers.load_file(args.file)
# Change the escape delay to 25ms
# Fixes an issue where esc takes way too long to press
os.environ.setdefault("ESCDELAY", "25")
2022-03-19 15:41:40 +00:00
# Load lambda with the buffer object
2022-03-19 15:13:28 +00:00
screen = Lambda(buffer)
2022-03-19 15:41:40 +00:00
# Start the screen, this will loop until exit
2022-03-19 15:13:28 +00:00
try:
screen.start()
2022-03-19 15:41:40 +00:00
# KeyboardInterrupt is thrown when <C-c> is pressed (exit)
2022-03-19 15:13:28 +00:00
except KeyboardInterrupt:
2022-03-19 15:41:40 +00:00
# Clean up the screen
2022-03-19 15:13:28 +00:00
curses.endwin()
2022-03-19 15:41:40 +00:00
# Then, just exit
2022-03-19 15:13:28 +00:00
sys.exit()
2022-03-19 15:41:40 +00:00
# Excepts *any* errors that occur
2022-03-19 15:13:28 +00:00
except Exception as exception:
2022-03-19 15:41:40 +00:00
# Clean up the screen
2022-03-19 15:13:28 +00:00
curses.endwin()
2022-03-19 15:41:40 +00:00
# Print the error message and traceback
2022-03-19 15:13:28 +00:00
print(f"{colors.Codes.red}FATAL ERROR:{colors.Codes.end} "
f"{colors.Codes.yellow}{exception}{colors.Codes.end}\n")
print(traceback.format_exc())
2022-03-19 15:41:40 +00:00
# Exit, with an error code
2022-03-19 15:13:28 +00:00
sys.exit(0)
if __name__ == "__main__":
main()