#!/usr/bin/env zsh # edit all source files of type under a directory local search_strs typeset -A search_strs local k local koff local i typeset -i i local char local input local file_list typeset -a file_list search_strs=( "c" ".*\.(c|h)" "crystal" ".*\.(cr|h)" "css" ".*\.(css|scss)" "elixir" ".*\.(ex|exs)" "go" ".*\.go" "html" ".*\.(html|xhtml)" "markdown" ".*\.md" "ocaml" ".*\.(ml|mli)" "js" ".*\.js" "tex" ".*\.tex" "vim" ".*\.vim" ) [[ $#@ -eq 0 ]] && return [[ $EDITOR == "" ]] && return zmodload zsh/curses || return zcurses init function draw_main() { zcurses clear stdscr width=$COLUMNS zcurses attr stdscr +bold if [[ $width -ge 16 ]]; then zcurses move stdscr 0 $(($width / 2 - 8)) zcurses string stdscr "select a filetype" else zcurses move stdscr 0 0 zcurses string stdscr "sel" fi zcurses attr stdscr -bold i=0 for k in ${(@k)search_strs}; do zcurses move stdscr $((i + 2)) 0 zcurses string stdscr $k i=$((i + 1)) done } trap 'draw_main' WINCH draw_main input="" while true; do zcurses move stdscr $(($#search_strs + 3)) 0 zcurses clear stdscr bot zcurses string stdscr "-: $input" zcurses refresh stdscr char="" sleep 0 zcurses timeout stdscr 100 zcurses input stdscr char # clear [[ $char == "" || $char == "" ]] && input="" && continue # backspace [[ $char == "" && $input != "" ]] && input=${input:0:-1} && continue # tab complete if [[ $char == $'\t' ]]; then seen="false" for k in ${(@k)search_strs}; do [[ $k =~ "^${input}.*$" ]] || continue [[ $seen == "true" ]] && seen="false" && break seen="true" koff=$k done [[ $seen == "true" ]] && input=$koff continue fi # select [[ $char == $'\n' || $char == "" ]] && break # add single alphanum [[ $char =~ "^[a-zA-Z0-9]$" ]] || continue input="$input$char" done zcurses end [[ $input == "" ]] && return file_list=( $(find $@ -regextype posix-extended -regex $search_strs[$input]) ) [[ $#file_list -ne 0 ]] && $EDITOR -- $file_list