#!/usr/bin/env python3 """ Fuzzy-find a file and edit it. Dependencies ============ * fd * fzf """ import argparse import subprocess from sys import platform import file_scripts.fzf as fzf import file_scripts.editor as editor import file_scripts.search as search import file_scripts.error as error # ========== Constants ========== # ----- Paths ----- BOOT_DIR = "/boot" ETC_DIR = "/etc" # ========== Functions ========== # ========== Main Script ========== if __name__ == "__main__": # This script doesn't support Windows if platform == "win32": sys.exit(error.E_INTERRUPT) parser = argparse.ArgumentParser() parser.add_argument( "-b", "--boot", action="store_const", const=BOOT_DIR, dest="dir", help="edit a file in /boot", ) parser.add_argument( "-d", "--dir", dest="dir", type=str, help="edit a file in a given directory" ) parser.add_argument( "-E", "--etc", action="store_const", const=ETC_DIR, dest="dir", help="edit a file in /etc", ) parser.add_argument( "-I", "--no-ignore", action="append_const", const=search.EXTRA_FIND_OPTS["no_ignore"], dest="extra_find_opts", help="do not respect .(git|fd)ignore files", ) parser.add_argument( "-i", "--no-ignore-vcs", action="append_const", const=search.EXTRA_FIND_OPTS["no_ignore_vcs"], dest="extra_find_opts", help="do not respect .gitignore files", ) parser.add_argument("-e", "--editor", help="use a given editor") parser.add_argument( "patterns", type=str, nargs="*", help="patterns to pass to locate" ) args = parser.parse_args() user_opts = [] if args.extra_find_opts is None else args.extra_find_opts user_opts.extend(search.DEFAULT_FIND_OPTS) selected_editor = None try: selected_editor = editor.select_editor(args.editor) except FileNotFoundError as e: print(e) exit(error.E_NOEDITORFOUND) # If patterns were passed, use locate # Otherwise check for -d and use fd files = ( search.find_files(opts=user_opts, directory=args.dir) if not args.patterns else search.locate_files(args.patterns) ) try: selected_file = fzf.select_file_with_fzf(files) except KeyboardInterrupt: exit(error.E_INTERRUPT) except fzf.FZFError: exit(error.E_NOFILESELECTED) if selected_file != "": cmd = editor.gen_editor_cmd(selected_editor, selected_file) subprocess.run(cmd) else: exit(error.E_NOFILESELECTED)