109 lines
2.6 KiB
Plaintext
Raw Normal View History

2020-10-23 11:21:59 -07:00
#!/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()
except fzf.FZFError as e:
print(e)
exit(e.exit_code)
2020-10-23 11:21:59 -07:00
if selected_file != "":
cmd = editor.gen_editor_cmd(selected_editor, selected_file)
subprocess.run(cmd)
else:
exit(error.E_NOFILESELECTED)