108 lines
2.6 KiB
Python
Executable File
108 lines
2.6 KiB
Python
Executable File
#!/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)
|