Compare commits

...

26 Commits

Author SHA1 Message Date
Eric Torres
722e4e1222 Remove cptemplate, fedit, quickdel scripts, and all related files. 2020-10-24 16:48:09 -07:00
Eric Torres
3ec6f4991e Fixes to binary finding 2020-09-26 10:02:33 -07:00
Eric Torres
4d7719af2c Use shutil to find fd bin on system path 2020-06-23 22:47:08 -07:00
Eric Torres
6b595f44a3 Use env to account for PATH interpreter precedence 2020-06-22 11:21:19 -07:00
Eric Torres
144190b1c9 Revert "Change interpreter from #!/usr/bin/bash to #!/bin/bash"
This reverts commit 9c776c34001939420b09f04453123de6d17c0d6a.
2020-06-22 11:17:29 -07:00
Eric Torres
bd729e5372 Ignore homebrew package file 2020-06-22 11:16:51 -07:00
Eric Torres
9c776c3400 Change interpreter from #!/usr/bin/bash to #!/bin/bash 2020-06-22 11:06:05 -07:00
Eric Torres
09a53e2681 Remove zsh plugin files 2020-06-22 10:50:33 -07:00
Eric Torres
129ca17ccd Rename zsh widgets to avoid confusion 2020-06-21 23:17:18 -07:00
Eric Torres
3bf21a54e6 Revert "Rename zsh plugins so they are detected by zsh"
This reverts commit 4890ff8aaa7b06e46888bcf67311a17d089c8123.
2020-06-21 22:53:45 -07:00
Eric Torres
4890ff8aaa Rename zsh plugins so they are detected by zsh 2020-06-21 22:49:10 -07:00
Eric Torres
5537227fc0 Don't use absolute path when calling fedit script in plugin 2020-06-21 22:06:16 -07:00
Eric Torres
79ccd05105 Make fedit script OS agnostic with respect to program cmd line flags 2020-06-07 15:24:36 -07:00
Eric Torres
bdf236d067 Fix file permissions for entire repository 2020-06-07 04:38:56 -07:00
Eric Torres
bfdf513154 drivetemp: minor code formatting change 2019-11-03 20:50:05 -08:00
Eric Torres
c377f57173 Split audio helper scripts into its own package 2019-07-07 07:16:57 -07:00
Eric Torres
343df18c83 Pass %(ext)s when filename is provided on command line 2019-06-17 20:49:12 -07:00
Eric Torres
b6d2c0b38b Remove unused shutil import 2019-06-17 20:38:23 -07:00
Eric Torres
a39f4c9c51 General script cleanup 2019-04-17 21:42:19 -07:00
Eric Torres
f2a45a7ca3 Check for KeyboardInterrupt 2019-04-17 18:55:51 -07:00
Eric Torres
61250fed0d Prefix regex strings with 'r' 2019-03-25 14:00:52 -07:00
Eric Torres
af39e1d81e Fix incorrect type being used for temporary file list 2019-03-20 16:46:33 -07:00
Eric Torres
2074672357 Refactoring of code and update of zsh plugin for fedit script 2019-03-20 14:32:29 -07:00
Eric Torres
081d098a54 Minor code and if-statement cleanup 2019-03-20 14:32:10 -07:00
Eric Torres
74c8cd5de5 Store results in a set initially before processing 2019-03-17 10:44:40 -07:00
Eric Torres
ea736c8978 Reimplement quickdel script in python 2019-03-17 01:38:20 -07:00
21 changed files with 11 additions and 545 deletions

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
*.pkg.tar.xz*
helper-scripts
helper-scripts.rb
helper-scripts.spec
PKGBUILD
pkg

View File

@ -1,48 +0,0 @@
#!/usr/bin/bash
# Trim an audio file given a startpoint and an endpoint
# Dependencies: ffmpeg
printHelp() {
cat << EOF
Usage: audiotrim [input file] [start time] [stop time] [output file]
Options:
-h show this help page
EOF
}
while true; do
case "${1}" in
'-h'|'--help')
printHelp
exit
;;
--)
shift
break
;;
-*)
printf '%s\n' "Unknown option: ${1}"
exit 1
;;
*)
break
;;
esac
done
if [[ ! -x '/usr/bin/ffmpeg' ]]; then
printf '%s\n' 'ffmpeg program is not installed' >&2
exit 1
fi
readonly infile="${1}"
readonly starttime="${2}"
readonly stoptime="${3}"
readonly outfile="${4}"
readonly format="${1%.*}"
[[ -z "${infile}" ]] && printf '%s\n' "No file entered." >&2 exit 2
[[ ! -f "${infile}" ]] && printf '%s\n' "Not a file: ${infile}" >&2 exit 3
ffmpeg -i "${infile}" -ss "${starttime}" -to "${stoptime}" -c copy "${outfile:-"${outfile%.*}-trimmed.${format}"}"

View File

@ -1,62 +0,0 @@
#!/usr/bin/bash
# Copy a file from ~/Templates to a given name
#
# Dependencies:
# - fd (soft)
# - fzf
printHelp() {
cat << EOF
Usage: cptemplate [-h,--help] [options] [filename]
Options:
-h, --help print this help page
EOF
}
while true; do
case "${1}" in
'-h'|'--help')
printHelp
exit
;;
--)
shift
break
;;
-*)
printf '%s\n' "Unknown option: ${1}"
exit 1
;;
*)
break
;;
esac
done
# check for existence of fd and fzf binaries
if [[ ! -x '/usr/bin/fzf' ]]; then
printf '%s\n' 'fzf is not installed on the system'
exit 1
fi
declare -a find_opts
template_dir="${HOME}/Templates"
if [[ -x '/usr/bin/fd' ]]; then
find_bin='/usr/bin/fd'
find_opts+=('--print0')
find_opts+=('--type' 'f')
find_opts+=('.' "${template_dir}")
else
find_bin='/usr/bin/find'
find_opts+=("${template_dir}")
find_opts+=('-mindepth' '0')
find_opts+=('-type' 'f')
find_opts+=('-print0')
fi
template_file="$("${find_bin}" "${find_opts[@]}" | fzf --read0 --select-1 --exit-0 --no-mouse)"
[[ -z "${template_file}" ]] && exit 1
cp --interactive --verbose "${template_file}" "${1:-.}"

4
ddusb.py Normal file → Executable file
View File

@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/env python3
"""Wrapper script for using dd to write to a USB drive."""
import argparse
@ -8,7 +8,7 @@ import re
import subprocess
# ========== Constants ==========
COMMENT_PATTERN = "^[#;]"
COMMENT_PATTERN = r"^[#;]"
EXCLUDE_FILE = "/etc/helper-scripts/ddusb-exclude.conf"
E_BLOCKDEVICE_ERROR = 1

View File

@ -1,57 +0,0 @@
#!/usr/bin/python3
"""Download audio using youtube-dl.
Dependencies:
=============
* youtube-dl
"""
import argparse
import pathlib
import shutil
import subprocess
# =========== Constants ==========
YOUTUBE_DL_BIN = shutil.which("youtube-dl")
DEFAULT_FILENAME = f"{pathlib.Path.home()}/Music/%(title)s.%(ext)s"
# ========== Error Codes ==========
E_NOURLS = 2
# ========== Main Script ==========
parser = argparse.ArgumentParser()
parser.add_argument("-b", "--batchfile", help="provide the links from a text file")
parser.add_argument(
"-f", "--format", type=str, default="opus", help="the format to use"
)
parser.add_argument(
"-n", "--filename", type=str, help="downloaded filename (without extension)"
)
parser.add_argument("urls", nargs="*", help="video URLs")
args = parser.parse_args()
dl_opts = [
YOUTUBE_DL_BIN,
"--no-part",
"--no-continue",
"--extract-audio",
f"--audio-format={args.format}",
]
# filename handling
# if -b is used, DEFAULT_FILENAME must take precedence
if args.filename is not None and args.batchfile is None:
dl_opts.append(f"--output={args.filename}")
else:
dl_opts.append(f"--output={DEFAULT_FILENAME}")
# URL handling
if args.batchfile is not None:
dl_opts.append(f"--batch-file={args.batchfile}")
elif args.urls is not None:
dl_opts.extend(args.urls)
else:
print("URLs are required")
exit(E_NOURLS)
subprocess.run(dl_opts)

7
drivetemp.py Normal file → Executable file
View File

@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/env python3
"""Check the temperature of a drive.
Functions:
verify_device_node(query)
@ -54,10 +54,7 @@ def convert_to_celsius(mkel_temp):
# ========== Main Script ==========
parser = argparse.ArgumentParser()
parser.add_argument(
"device",
help="device node to retrieve\
the temperature for",
metavar="dev",
"device", help="device node to retrieve the temperature for", metavar="dev"
)
args = parser.parse_args()

176
fedit.py
View File

@ -1,176 +0,0 @@
#!/usr/bin/python3
"""
Fuzzy-find a file and edit it.
Dependencies
============
* fd
* fzf
"""
import argparse
import os
import shutil
import subprocess
# ========== Constants ==========
# Paths
BOOT_DIR = "/boot"
ETC_DIR = "/etc"
# Exit Codes
E_NOEDITORFOUND = 2
E_NOFILESELECTED = 3
# Commands
FIND_CMD = "/usr/bin/fd"
FIND_OPTS = ["--hidden", "--print0", "--type", "f", "--no-ignore-vcs"]
FZF_CMD = "/usr/bin/fzf"
FZF_OPTS = ["--read0", "--select-1", "--exit-0", "--print0"]
LOCATE_CMD = "/usr/bin/locate"
LOCATE_OPTS = ["--all", "--ignore-case", "--null"]
LOCALE = "utf-8"
# ========== Functions ==========
def select_editor(editor_override=None):
"""Return a possible canonical path to an editor.
Select an editor from one of:
* -e, --editor
* $EDITOR
* Default of vim
In this order
If an editor cannot be resolved, then an Error is raised instead.
:param editor_override: argument to override an editor
:returns: path to one of these editors
:rtype: str
:raises: FileNotFoundError if an editor could not be resolved
"""
editor = None
if editor_override is not None:
editor = shutil.which(editor_override)
elif "EDITOR" in os.environ:
editor = shutil.which(os.environ.get("EDITOR"))
elif shutil.which("vim") is not None:
editor = shutil.which("vim")
if editor is None:
raise FileNotFoundError("An editor could not be resolved")
return editor
def gen_editor_cmd(filename):
"""Generate a command line to run for editing a file based on
permissions.
:param filename: name of file to edit
:type filename: str or path-like object
:returns: command to execute to edit file
:rtype: list
"""
# possible for a race condition to occur here
if os.access(filename, os.W_OK):
return [editor, filename]
else:
return ["sudo", "--edit", filename]
def run_fzf(files):
"""Run fzf on a stream of searched files for the user to select.
:param files: stream of null-terminated files to read
:type files: bytes stream (stdout of a completed process)
:returns: selected file
:rtype: str
"""
selected_file = subprocess.run(
[FZF_CMD] + FZF_OPTS, input=files, stdout=subprocess.PIPE
).stdout
return selected_file.decode(LOCALE).strip("\x00")
def find_files(directory=None):
"""Use a find-based program to locate files, then pass to fzf.
:param directory: directory to search for files
:type directory: str
:returns: path of user-selected file
:rtype: bytes
"""
cmd = [FIND_CMD] + FIND_OPTS
if directory is not None:
cmd.extend(["--", ".", directory])
return subprocess.run(cmd, capture_output=True).stdout
def locate_files(patterns):
"""Use a locate-based program to locate files, then pass to fzf.
:param patterns: patterns to pass to locate
:type patterns: list
:returns: path of user-selected file
:rtype: bytes
"""
cmd = [LOCATE_CMD] + LOCATE_OPTS
cmd.extend(patterns)
return subprocess.run(cmd, capture_output=True).stdout
# ========== Main Script ==========
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("-e", "--editor", help="use a given editor")
parser.add_argument("patterns", type=str, nargs="*", help="patterns to pass to locate")
args = parser.parse_args()
final_find_cmd = [FIND_CMD] + FIND_OPTS
editor = ""
try:
editor = select_editor(args.editor)
except FileNotFoundError as e:
print(e)
exit(E_NOEDITORFOUND)
# If patterns were passed, use locate
# Otherwise check for -d and use fd
if not args.patterns == []:
files = locate_files(args.patterns)
else:
files = find_files(args.dir)
selected_file = run_fzf(files)
if not selected_file == "":
cmd = gen_editor_cmd(selected_file)
subprocess.run(cmd)
else:
exit(E_NOFILESELECTED)

2
fless.sh Normal file → Executable file
View File

@ -1,4 +1,4 @@
#!/usr/bin/bash
#!/usr/bin/env bash
# fless - fuzzy find a file and run less on it
# Dependencies
# - fd (soft)

2
gek.sh Normal file → Executable file
View File

@ -1,4 +1,4 @@
#!/usr/bin/bash
#!/usr/bin/env bash
# Export a key to a given keyfile
echo -n "Enter the name of the output file: "

2
getweather.py Normal file → Executable file
View File

@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/env python3
"""Obtain a weather forecast."""
import argparse

2
lsgroups.sh Normal file → Executable file
View File

@ -1,4 +1,4 @@
#!/usr/bin/bash
#!/usr/bin/env bash
# List all groups in the system
sort <(awk -F ':' '{print $1}' < /etc/group)

2
lsusers.sh Normal file → Executable file
View File

@ -1,4 +1,4 @@
#!/usr/bin/bash
#!/usr/bin/env bash
# List all users on the system
sort --unique <(awk -F ':' '{print $1}' < /etc/passwd)

2
open.sh Normal file → Executable file
View File

@ -1,4 +1,4 @@
#!/usr/bin/bash
#!/usr/bin/env bash
# open - fuzzy find, select, and open a file using xdg-open
#
# Dependencies:

View File

@ -1,96 +0,0 @@
#!/bin/bash
## quickdel - delete any file matching a query
## Dependencies:
## * bash
## * fd
printHelp() {
cat << EOF
Fuzzy find and delete files matching patterns
Usage: quickdel [-h] [-i] [-I] [patterns]
Options:
-d, --directories-only only delete directories
-h, --help print this help page
-i, --no-ignore do not ignore .gitignore and .fdignore
-I, --no--ignore-vcs do not ignore .gitignore
EOF
}
# Pre-run correctness checks
unset files
unset fd_opts
ans=
declare -a files
declare -a fd_opts
declare -r blue='\033[0;34m'
declare -r nocolor='\033[0;0m'
[[ ! -x '/usr/bin/fd' ]] && echo 'fd is not present, cancelling' >&2 && exit 1
while true; do
case "${1}" in
'-d'|'--directories-only')
fd_opts+=('--type' 'd')
shift
continue
;;
'-h'|'--help')
printHelp
exit
;;
'-i'|'--no-ignore')
fd_opts+=('--no-ignore')
shift
continue
;;
'-I'|'--no-ignore-vcs')
fd_opts+=('--no-ignore-vcs')
shift
continue
;;
--)
shift
break
;;
-*)
printf '%s\n' "Unknown option: ${1}" >&2
exit 1
;;
*)
break
;;
esac
done
# Prevent fd from selecting everything
[[ -z "${@}" ]] && printf '%s\n' "No queries entered, cancelling" >&2 && exit 1
for pattern in "${@}"; do
while IFS= read -r -d '' file; do
files+=("${file}")
done < <(fd --hidden --print0 "${fd_opts[@]}" -- "${pattern}")
done
[[ -z "${files[*]}" ]] && printf '%s\n' "No results found" >&2 && exit 1
# List all filenames, pretty print them
for filename in "${files[@]}"; do
if [[ -f "${filename}" ]]; then
printf '%s\n' "${filename}"
elif [[ -d "${filename}" ]]; then
printf '%b%s%b\n' "${blue}" "${filename}" "${nocolor}"
fi
done
printf '%s' "Would you like to delete these files? "
read -r -n 1 ans
if [[ "${ans:-n}" =~ (Y|y) ]]; then
rm --recursive --force -- "${files[@]}"
else
printf '\n%s\n' "Operation cancelled" >&2
exit 1
fi

View File

@ -1,14 +0,0 @@
#compdef dlaudio
# zsh completions for 'dlaudio'
local arguments
arguments=(
{-h,--help}'[show this help message and exit]'
{-b,--batch-dl}'[provide the links from a text file]'
{-f,--format}'[the format to use (default:flac)]'
{-n,--filename}'[the name of the downloaded file (without extension)]'
'*:filename:_files'
)
_arguments -s $arguments

View File

@ -1,13 +0,0 @@
#compdef fedit
local arguments
arguments=(
{-h,--help}'[show this help message and exit]'
{-b,--boot}'[edit a file in /boot]'
{-d,--dir}'[edit a file in a given directory]'
{-E,--etc}'[edit a file in /etc]'
{-e,--editor}'[use a given editor]'
'*:filename:_files'
)
_arguments -s $arguments

View File

@ -1,14 +0,0 @@
#compdef quickdel
# ========== Completions ==========
local arguments
arguments=(
{-d,--directories-only}'[only delete directories]'
{-h,--help}'[print this help page]'
{-i,--no-ignore}'[do not ignore .gitignore and .fdignore]'
{-I,--no-ignore-vcs}'[do not ignore .gitignore]'
'*:filename:_files'
)
_arguments -s $arguments

View File

@ -1,22 +0,0 @@
# Fuzzy cd from anywhere
# Dependencies
# * fzf
# * mlocate
# ========== Shortcuts ==========
cf() {
[[ -z "${*}" ]] && return 1
[[ ! -x /usr/bin/fzf ]] && return 1
dir="$(locate --all --ignore-case --null -- "${@}" | fzf --read0 --select-1 --exit-0)"
[[ -z "${dir}" ]] && return 1
if [[ -f "${dir}" ]]; then
cd "${dir%/*}"
else
cd "${dir}"
fi
}
autoload -Uz cf

View File

@ -1,15 +0,0 @@
# Fuzzy find a file and then edit it
_fedit() {
/usr/bin/fedit && zle reset-prompt
}
_etcedit() {
/usr/bin/fedit --etc && zle reset-prompt
}
zle -N _fedit
bindkey -M viins '^o' _fedit
zle -N _etcedit
bindkey -M viins '^e' _etcedit

View File

@ -1,7 +0,0 @@
# Fuzzy-find a file and open it in less
fless() {
/usr/bin/fless && zle reset-prompt
}
zle -N fless
bindkey -M viins '^n' fless

View File

@ -1,8 +0,0 @@
# Make a directory, then change into it
mkcd() {
[[ ! -d "${1}" ]] && mkdir --parents -- "${1}"
cd "${1}" || exit
}
autoload -Uz mkcd