Move p to file and add interactive selection
[khome.git] / home / bin / p
CommitLineData
ffdb69ae
SK
1#! /bin/bash
2
3set -eo pipefail
4
5PROG=$0
6
7find() {
8 local -r name="$1"
9 local -r file="$2"
10
11 awk \
12 -v _s="$name" \
13 '
14 BEGIN {_s = tolower(_s)}
15
16 /^[a-zA-Z]/ && tolower($1) ~ _s && NF >= 2 {
17 n++
18 s = $1
19 p = $NF
20 if (NF == 2) {
21 e = ""
22 u = ""
23 } else if (NF == 3) {
24 e = $2
25 u = ""
26 } else {
27 e = $2
28 u = $3
29 } # TODO What would NF > 4 mean?
30
31 printf("%d [O] s:\"%s\", e:\"%s\", u:\"%s\"\n", n, s, e, u) > "/dev/stderr"
32 if (match(u, "@")) {
33 tmp = e
34 e = u
35 u = tmp
36 printf("%d [C] s:\"%s\", e:\"%s\", u:\"%s\"\n", n, s, e, u) > "/dev/stderr"
37 }
38 printf("%d s:\"%s\" e:\"%s\" u:\"%s\" %s\n", n, s, e, u, p)
39 }
40 ' \
41 "$file"
42}
43
44main() {
45 local -r default_file="$HOME"/._p/p
46 local -r usage="Usage: $PROG [FILE] NAME"
47 local name file records i meta data datum
48
49 case "$#" in
50 0)
51 echo "$usage" >&2
52 return 1;;
53 1)
54 file="$default_file"
55 name="$1";;
56 2)
57 file="$1"
58 name="$2";;
59 *)
60 echo "$usage" >&2
61 return 1;;
62 esac
63
64 records=$(find "$name" "$file")
65 meta=$(echo "$records" | awk '{print($1, $2, $3, $4)}')
66 data=$(echo "$records" | awk '{print($1, $5)}')
67
68 # XXX Even an empty result will count as one line after echo, so need to filter:
69 case "$(echo "$records" | grep -vc '^$')" in
70 0)
71 echo '[ERROR] Found nothing.' >&2
72 exit 1;;
73 1)
74 datum="$data";;
75 *)
76 i=$(echo "$meta" | column -t | fzf | awk '{print $1}')
77 datum=$(echo "$data" | awk -v i="$i" 'NR == i');;
78 esac
79
80 # XXX Intentionally avoiding newline:
81 echo "$datum" | awk '{printf "%s", $2}' | xsel -i -b -t 30000
82
83}
84
85main "$@"
This page took 0.02528 seconds and 4 git commands to generate.