Make a bar constructor function
[khome.git] / home / lib / login_functions.sh
index a0738d9..97de4b9 100644 (file)
@@ -1,5 +1,31 @@
 #
 
+## open : string -> unit
+##
+## Fork xdg-open so we don't block current terminal session when opening
+## things like pdf files. For example:
+##
+##    open book.pdf
+##
+open() {
+    (xdg-open "$1" &) &
+}
+
+## notify_done : unit -> unit
+notify_done() {
+    local -r _status_code="$?"
+    local -r _program="$1"
+    local _timestamp
+    _timestamp="$(timestamp)"
+    local -r _msg="$_timestamp [$_program] done "
+    if [[ "$_status_code" -eq 0 ]]
+    then
+        notify-send -u normal "$_msg OK: $_status_code"
+    else
+        notify-send -u critical "$_msg ERROR: $_status_code"
+    fi
+}
+
 ## p : string -> unit
 p() {
     awk \
@@ -7,6 +33,7 @@ p() {
         '
             BEGIN {_s = tolower(_s)}
 
+            # TODO fzf/dmenu select instead of searching:
             /^[a-zA-Z]/ && tolower($1) ~ _s && NF >= 2 {
                 n++
                 s = $1
@@ -32,6 +59,19 @@ p() {
 
                 printf "%s", p # XXX Intentionally avoiding newline in the result.
             }
+
+            END {
+                if (n == 1) {
+                    exit 0
+                } else if (n == 0) {
+                    printf "[ERROR] Found nothing.\n" > "/dev/stderr"
+                    exit 1
+                } else if (n > 1) {
+                    # TODO fzf-select which of the records the user (ahem, me) wants.
+                    printf "[WARNING] Found more than one record.\n" > "/dev/stderr"
+                    exit 0
+                }
+            }
         ' \
         ~/._p/p \
         | xsel -i -b -t 30000
@@ -328,14 +368,15 @@ _yt() {
     local -r uri="$2"
     local -r opts="$3"
 
-    local -r id=$(youtube-dlc --get-id "$uri")
-    local -r title=$(youtube-dlc --get-title "$uri" | sed 's/[^А-Яа-яA-Za-z0-9._-]/_/g')
+    local -r yt=youtube-dl
+    local -r id=$("$yt" --get-id "$uri")
+    local -r title=$("$yt" --get-title "$uri" | sed 's/[^А-Яа-яA-Za-z0-9._-]/_/g')
     local -r dir="${base_dir}/${title}--${id}"
 
     mkdir -p "$dir"
     cd "$dir" || kill -INT $$
     echo "$uri" > 'uri'
-    youtube-dlc $opts -c --write-description --write-info-json "$uri"
+    "$yt" $opts -c --write-all-thumbnails --write-description --write-info-json "$uri"
 }
 
 yt_audio() {
@@ -363,7 +404,7 @@ gh_clone() {
     mkdir -p "$gh_dir"
     cd "$gh_dir" || kill -INT $$
     gh_fetch_repos "$gh_user_type" "$gh_user_name" \
-    | jq --raw-output '.[] | select(.fork | not) | .git_url' \
+    | jq --raw-output '.[] | select(.fork | not) | .clone_url' \
     | parallel -j 25 \
     git clone {}
 }
@@ -384,6 +425,40 @@ gh_clone_repo() {
     git clone "$1"
 }
 
+bar() {
+    local -r len="${1:-79}" # 1st arg or 79.
+    local -r char="${2:--}" # 2nd arg or a dash.
+    for _ in {1.."$len"}; do
+        printf '%c' "$char";
+    done
+}
+
+daily_todo_file_template() {
+cat << EOF
+===============================================================================
+$(date '+%F %A')
+===============================================================================
+
+
+backlog
+-------------------------------------------------------------------------------
+EOF
+}
+
+todo() {
+    local date
+    date="$(date +%F)"
+    local -r dir="$DIR_TODO/daily"
+    local -r file="$dir/$date.txt"
+
+    mkdir -p "$dir"
+    if [ ! -f "$file" ]
+    then
+        daily_todo_file_template > "$file"
+    fi
+    cd "$DIR_TODO" && "$EDITOR" "$file"
+}
+
 work_log_template() {
 cat << EOF
 $(date '+%F %A')
This page took 0.029527 seconds and 4 git commands to generate.