bin
This commit is contained in:
		
							
								
								
									
										4
									
								
								bin/.bin/0x0
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										4
									
								
								bin/.bin/0x0
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | curl -F"file=@$@" https://0x0.st | tee >(xclip -sel clip) | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								bin/.bin/disc
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										8
									
								
								bin/.bin/disc
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | #!/bin/sh | ||||||
|  |  | ||||||
|  | tmux ls -F \#S | grep disc && \ | ||||||
|  | 	tmux attach -t disc \ | ||||||
|  | || \ | ||||||
|  | 	tmux new-session -s disc 'scli --save-history' \; \ | ||||||
|  | 		split-window -h -l 75% 'aerc' \; \ | ||||||
|  | 		split-window -v 'weechat' \; \ | ||||||
							
								
								
									
										141
									
								
								bin/.bin/emailbook
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										141
									
								
								bin/.bin/emailbook
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,141 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | VERSION="0.2.1" | ||||||
|  | usage() { | ||||||
|  |     echo "emailbook $VERSION"' | ||||||
|  | A minimalistic address book for e-mails only. | ||||||
|  |  | ||||||
|  | Usage: emailbook FILE [OPTIONS] | ||||||
|  |  | ||||||
|  | Prints all values in FILE if no option is given. | ||||||
|  |  | ||||||
|  | Options: | ||||||
|  | -a, --add [KEY] VALUE  Add KEY/VALUE pair to FILE. If KEY is omitted, | ||||||
|  |                        VALUE is used as key, too. | ||||||
|  | [-s, --search] QUERY   Search FILE for entries with keys or values containing QUERY. | ||||||
|  | -k, --key QUERY        Like `--search` but limit search to keys/aliases. | ||||||
|  | -v, --value QUERY      Like `--search` but limit search to values. | ||||||
|  | -p, --parse SOURCE     Parse stdin for e-mail addresses in header and add them to FILE. | ||||||
|  |                        SOURCE might be either --from, --to , --cc, --bcc, or --all. | ||||||
|  | -h, --help             Show this help. | ||||||
|  | -V, --version          Print version. | ||||||
|  | ' | ||||||
|  | } | ||||||
|  |  | ||||||
|  | checkfilename() { | ||||||
|  |     [ $QUIET ] || [ -e "$filename" ] \ | ||||||
|  |         || echo "File $filename not found. Creating it." 1>&2 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | keyexists() { | ||||||
|  |     escaped=$(echo "$*" | sed 's/[][\.|$(){}?+*^]/\\&/g') | ||||||
|  |     # also check display name with/without double quotes | ||||||
|  |     quotestoggled=$(echo "$*" | sed -E 's/^"([^"]+)"( +<[^>]+>)/\1\2/;t;s/^([^"]+?)( +<[^>]+>)/"\1"\2/') | ||||||
|  |     quotestoggledescaped=$(echo "$quotestoggled" | sed 's/[][\.|$(){}?+*^]/\\&/g') | ||||||
|  |     grep -q -E "^$escaped( :|\$)" "$filename" 2> /dev/null \ | ||||||
|  |         || grep -q -E "^$quotestoggledescaped( :|\$)" "$filename" 2> /dev/null | ||||||
|  | } | ||||||
|  |  | ||||||
|  | addentry() { | ||||||
|  |     if keyexists "$1"; then | ||||||
|  |         [ $QUIET ] || echo "! $1 (skipped)" | ||||||
|  |     else | ||||||
|  |         [ "$2" ] && line="$1 : $2" || line="$1" | ||||||
|  |         [ $QUIET ] || echo "+ $line" | ||||||
|  |         echo "$line" >> "$filename" | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | add() { | ||||||
|  |     checkfilename | ||||||
|  |     case $# in | ||||||
|  |     1|2) addentry "$@" ;; | ||||||
|  |     *) echo "Expected one or two arguments after -a!"; exit 1 ;; | ||||||
|  |     esac | ||||||
|  | } | ||||||
|  |  | ||||||
|  | addfromstdin() { | ||||||
|  |     # Skip lines without "@", skip lines containing no-reply (or similar), | ||||||
|  |     # strip \r, strip leading spaces, do the following replacements: | ||||||
|  |     # "'John Doe'" <xxx> → "John Doe" <xxx> | ||||||
|  |     # 'John Doe' <xxx> → John Doe <xxx> | ||||||
|  |     # "john.doe@example.com" <john.doe@example.com> → <john.doe@example.com> | ||||||
|  |     # "<john.doe@example.com>" <john.doe@example.com> → <john.doe@example.com> | ||||||
|  |     # john.doe@example.com → <john.doe@example.com> | ||||||
|  |     grep '@' \ | ||||||
|  |         | grep -v -i -E '\bnot?[_-]?reply' \ | ||||||
|  |         | sed 's/\r$//' \ | ||||||
|  |         | sed -E 's/^ +//g' \ | ||||||
|  |         | sed -E "s/(\"?)'([^'\"]+)'(\"?)/\1\2\3/" \ | ||||||
|  |         | sed -E 's/^"<?([^">]*)>?" +<\1>/<\1>/' \ | ||||||
|  |         | sed -E 's/^[^<>@ ]*@[^<>@ ]+$/<\0>/' \ | ||||||
|  |         | sort -u \ | ||||||
|  |         | while read -r line; do addentry "$line"; done | ||||||
|  | } | ||||||
|  |  | ||||||
|  | searchall() { | ||||||
|  |     # show entries with matching alias first | ||||||
|  |     searchbyalias "$*" | ||||||
|  |     searchbyvalueonly "$*" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | searchbyalias() { | ||||||
|  |     grep -i -E "$* :" "$filename" | sed -E 's/^[^:]+:\s*//' | ||||||
|  | } | ||||||
|  |  | ||||||
|  | searchbyvalue() { | ||||||
|  |     sed -E 's/^[^:]+:\s*//' "$filename" | grep -i -E "$*" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | searchbyvalueonly() { | ||||||
|  |     # exclude matches found by searchbyalias | ||||||
|  |     grep -i -E -v "$* :" "$filename" | sed -E 's/^[^:]+:\s*//' | grep -i -E "$*" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | parsefields() { | ||||||
|  |     # Find header fields starting with $1 (p.e. 'To:') plus following lines | ||||||
|  |     # starting with a space. Split entries at commas except when quoted. Skip | ||||||
|  |     # empty lines. Decode encoded strings. Squeeze double spaces. | ||||||
|  |     sed -E '/^\r?$/Q' - \ | ||||||
|  |         | sed -E -n "/^$1:/{:a ; \$!N ; s/\n\s+/ / ; ta ; P ; D}" \ | ||||||
|  |         | sed -E "s/^$1:\\s*//" \ | ||||||
|  |         | grep -v -P '[\x80-\xFF]' \ | ||||||
|  |         | awk -vFPAT='([^,"]*)("[^"]+")?([^,]*)?' -vOFS='\n' \ | ||||||
|  |           '{for(i=1;i<=NF;i++) printf("%s\n",$i)}' \ | ||||||
|  |         | sed -E -e '/^ *$/d' \ | ||||||
|  |         | perl -CS -MEncode -ne 'print decode("MIME-Header", $_)' \ | ||||||
|  |         | sed -E -e 's/  +/ /g' \ | ||||||
|  |         | addfromstdin | ||||||
|  | } | ||||||
|  |  | ||||||
|  | parse() { | ||||||
|  |     checkfilename | ||||||
|  |     case "$1" in | ||||||
|  |     --all)  parsefields '(From|To|Cc|CC|Bcc)' ;; | ||||||
|  |     # TODO: Include References, In-Reply-To, Reply-To, Return-Path? | ||||||
|  |     --from) parsefields 'From' ;; | ||||||
|  |     --to)   parsefields 'To' ;; | ||||||
|  |     --cc)   parsefields '(Cc|CC)' ;; | ||||||
|  |     --bcc)  parsefields 'Bcc' ;; | ||||||
|  |     esac | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | case "$1" in | ||||||
|  | -h|--help|'') usage; exit ;; | ||||||
|  | -V|--version) echo "$VERSION"; exit ;; | ||||||
|  | esac | ||||||
|  |  | ||||||
|  | filename="$1"; shift | ||||||
|  |  | ||||||
|  | case "$1" in | ||||||
|  | -q|--quiet) shift; QUIET=1 ;; | ||||||
|  | esac | ||||||
|  |  | ||||||
|  | case "$1" in | ||||||
|  | -a|--add)     shift; add "$@" ;; | ||||||
|  | -s|--search)  shift; searchall "$*" ;; | ||||||
|  | -k|--key)     shift; searchbyalias "$*" ;; | ||||||
|  | -v|--value)   shift; searchbyvalue "$*" ;; | ||||||
|  | -p|--parse)   shift; parse "$@" ;; | ||||||
|  | *)            searchall "$*" ;; | ||||||
|  | esac | ||||||
		Reference in New Issue
	
	Block a user