Velocity/main.py
2022-03-19 16:34:48 +00:00

114 lines
3.1 KiB
Python

from core import colors, cursors, buffers, modes, utils
from core.buffers import Buffer
from core.components import Components
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):
# Calculate the entire height and width of the terminal
self.height, self.width = self.screen.getmaxyx()
# Calculate the safe area for the buffer by removing heights & widths of components
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)
def start(self):
# Change the escape key delay to 25ms
# Fixes an issue where the "esc" key takes way too long to press
os.environ.setdefault("ESCDELAY", "25")
# Initialise colors
colors.init_colors()
# Change the cursor shape
cursors.cursor_mode("block")
# Don't echo any key-presses
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):
# The main loop, which runs until the user quits
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():
# Shell arguments
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")
# Collect the arguments passed into lambda at the shell
args = parser.parse_args()
# Load the file into a Buffer object
buffer = buffers.load_file(args.file)
# Load lambda with the buffer object
screen = Lambda(buffer)
# Start the screen, this will loop until exit
try:
screen.start()
# KeyboardInterrupt is thrown when <C-c> is pressed (exit)
except KeyboardInterrupt:
# Clean up the screen
curses.endwin()
# Then, just exit
sys.exit()
# Excepts *any* errors that occur
except Exception as exception:
utils.fatal_error(exception)
if __name__ == "__main__":
main()