aboutsummaryrefslogtreecommitdiffstats
path: root/.config/init/funcs/srcopen
blob: f4bd7735811cc4bcb404175716462407463493c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/env zsh
# edit all source files of type under a directory

local search_map
typeset -A search_map
local keys
typeset -a keys
local k
local koff
local i
typeset -i i
local char
local input
local file_list
typeset -a file_list

search_map=(
	"c"        "\.(c|h)"
	"crystal"  "\.cr"
	"css"      "\.(css|scss)"
	"elixir"   "\.(ex|exs)"
	"go"       "\.go"
	"html"     "\.(html|xhtml)"
	"markdown" "\.md"
	"ocaml"    "\.(ml|mli)"
	"js"       "\.js"
	"tex"      "\.tex"
	"vim"      "\.vim"
)

{
	printf "%s\0" ${(k)search_map} | sort -z | head -c -1
	printf "\n"
} | IFS=$'\0' read -r -A keys

[[ $#@ -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

	for i in {1..$#keys}; do
		zcurses move stdscr $((1 + i)) 0
		zcurses string stdscr $keys[$i]
	done
}

trap 'draw_main' WINCH

draw_main

input=""

while true; do
	zcurses move stdscr $(($#search_map + 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_map}; 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 == "" || $search_map[$input] == "" ]] && return

{
	find $@ \
		-regextype posix-extended \
		-regex "^(/[^.]|[^/])*$search_map[$input]\$" \
		-print0 \
	| head -c -1
	printf "\n"
} | IFS=$'\0' read -r -A file_list

[[ $#file_list -ne 0 ]] && $EDITOR -- $file_list