ambevar-dotfiles/.shell.d/funs_rc

937 lines
22 KiB
Plaintext
Raw Normal View History

## -*- mode:sh -*- #
################################################################################
## Shell -- Functions.
2012-12-05 19:18:06 +01:00
## Date 2012-12-05
################################################################################
## Colored man pager.
man()
{
env \
LESS_TERMCAP_mb=$(printf "\e[1;31m") \
LESS_TERMCAP_md=$(printf "\e[1;31m") \
LESS_TERMCAP_me=$(printf "\e[0m") \
LESS_TERMCAP_se=$(printf "\e[0m") \
LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
LESS_TERMCAP_ue=$(printf "\e[0m") \
LESS_TERMCAP_us=$(printf "\e[1;32m") \
man "$@"
}
## Make directories and change into the first one.
mkcd () {
mkdir -p "$@"
cd "$1"
}
## Quick search.
search()
{
find . -iname "*$1*"
}
## Cut last n lines in file, 10 by default.
cuttail()
{
local nlines=${2:-10}
sed -n -e ":begin ; 1,${nlines}!{P;N;D} ; N ; b begin" $1
}
## Cut first n lines in file, 10 by default.
cuthead()
{
local nlines=${2:-10}
sed -n -e "1,${nlines}!p" $1
}
## Move filenames to lowercase.
## Use ranger + bulkrename + vim/emacs (+ TwindleCase) for more flexibility.
renamelower()
{
local file
local filename
local dirname
for file ; do
filename=${file##*/}
case "$filename" in
*/*) dirname="${file%/*}" ;;
*) dirname="." ;;
esac
local nf=$(echo $filename | tr A-Z a-z)
local newname="${dirname}/${nf}"
if [ "$nf" != "$filename" ]; then
mv "$file" "$newname"
echo "lowercase: $file --> $newname"
else
echo "lowercase: $file not changed."
fi
done
}
## Swap 2 filenames around.
renameswap()
{
local TEMPFILE="$(mktemp)"
mv "$1" "$TEMPFILE"
mv "$2" "$1"
mv "$TEMPFILE" "$2"
}
## Network operations
2012-12-05 19:18:06 +01:00
if [ -n "$(command -v nmap)" ]; then
network-map()
{
echo "$1"
for SCANIP in $( nmap -sL "$1" | grep -i "\([[:digit:]]\+\.\)\{3,\}[[:digit:]]\+" | awk '{print $5}' ); do
sudo nmap -oX - -n -sT -T Normal -O -sR -I -F -P0 "$SCANIP"
echo
done
}
fi
netspeed ()
{
local INTERFACE="eth0"
if [ -n "$1" ]; then
INTERFACE="$1"
fi
if [ ! -d "/sys/class/net/${INTERFACE}" ]; then
echo "Error: no such interface (${INTERFACE})"
return
fi
local RX_BEFORE=$(cat /sys/class/net/${INTERFACE}/statistics/rx_bytes)
local TX_BEFORE=$(cat /sys/class/net/${INTERFACE}/statistics/tx_bytes)
sleep 1
local RX_AFTER=$(cat /sys/class/net/${INTERFACE}/statistics/rx_bytes)
local TX_AFTER=$(cat /sys/class/net/${INTERFACE}/statistics/tx_bytes)
local RX_RESULT=$(((${RX_AFTER:-0}-${RX_BEFORE:-0})/1024))
local TX_RESULT=$(((${TX_AFTER:-0}-${TX_BEFORE:-0})/1024))
echo "RX $RX_RESULT KiB/s"
echo "TX $TX_RESULT KiB/s"
}
## CPU usage
##
## A typical CPU array is (on Linux Kernel 3.0)
## cpu 158150 0 52354 18562746 1472 0 10198 0 0 0
##
## The meanings of the columns are as follows, from left to right:
##
## user: normal processes executing in user mode
## nice: niced processes executing in user mode
## system: processes executing in kernel mode
## idle: twiddling thumbs
## iowait: waiting for I/O to complete
## irq: servicing interrupts
## softirq: servicing softirqs
## ... (see 'man 5 proc' for further details)
##
## Only the first 4 values are interesting here.
cpuusage()
{
local cpuarray
local f1
local f2
local f3
local f4
cpuarray="$(grep 'cpu ' /proc/stat)"
f1=$(echo $cpuarray | cut -f3 -d' ')
f2=$(echo $cpuarray | cut -f4 -d' ')
f3=$(echo $cpuarray | cut -f5 -d' ')
f4=$(echo $cpuarray | cut -f6 -d' ')
local totalA=$(($f1+$f2+$f3+$f4))
local idleA=$f4
sleep 0.4
cpuarray="$(grep 'cpu ' /proc/stat)"
f1=$(echo $cpuarray | cut -f3 -d' ')
f2=$(echo $cpuarray | cut -f4 -d' ')
f3=$(echo $cpuarray | cut -f5 -d' ')
f4=$(echo $cpuarray | cut -f6 -d' ')
local totalB=$(($f1+$f2+$f3+$f4))
local idleB=$f4
local totaldiff=$((${totalB:-0}-${totalA:-0}))
if [ $totaldiff -eq 0 ]; then
echo 0
else
echo "$((100 - 100 * ($idleB-$idleA) / $totaldiff ))"
fi
}
2012-12-05 18:39:38 +01:00
## Wget batch DL
wget_batch ()
{
if [ $# -ne 2 ]; then
echo "Usage: $0 <ext> <uri>"
return
fi
wget -r -l1 --no-parent -A$1 $2
}
## Webcam
webcam ()
{
## With mplayer.
mplayer -fps 30 -tv driver=v4l2:width=640:height=480:device=/dev/video0 tv:// -flip
}
## Vim-only: search the vim reference manual for a keyword.
## Usage: :h <keyword>
2012-12-05 19:18:06 +01:00
if [ -n "$(command -v vim)" ]; then
:h()
{
vim --cmd ":silent help $@" --cmd "only";
}
fi
## Set file/directory owner and permissions.
## Usage: sanitize [FOLDER]
sanitize()
{
local WORKDIR="$PWD"
if [ $# -eq 1 ]; then
WORKDIR="$1"
fi
local FMASK=$(umask -S | sed 's/x//g')
local DMASK=$(umask -S)
find "$WORKDIR" -exec chown -R ${UID}:${GID} {} \;
find "$WORKDIR" -type d -exec chmod ${DMASK} {} \;
find "$WORKDIR" -type f -exec chmod ${FMASK} {} \;
}
asciify()
{
2013-01-21 15:33:01 +01:00
_printhelp()
{
2013-01-21 15:33:01 +01:00
cat <<EOF
Usage: $1 FILES
Convert non-ASCII characters to their ASCII equivalent.
EOF
}
if [ $# -eq 0 ]; then
echo "Missing arguments."
2013-01-21 15:33:01 +01:00
_printhelp $0
return
fi
for i; do
2012-08-07 15:21:57 +02:00
sed -i \
2012-10-10 15:11:58 +02:00
-e 's/[áàâä]/a/g' \
-e 's/[éèêë]/e/g' \
2012-10-10 15:11:58 +02:00
-e 's/[íìîï]/i/g' \
-e 's/[óòôö]/o/g' \
-e 's/[úùûü]/u/g' \
-e 's/[ýỳŷÿ]/y/g' \
-e 's/[ÁÀÂÄ]/A/g' \
-e 's/[ÉÈÊË]/E/g' \
-e 's/[ÍÌÎÏ]/I/g' \
-e 's/[ÓÒÔÖ]/O/g' \
-e 's/[ÚÙÛÜ]/U/g' \
-e 's/[ÝỲŶŸ]/Y/g' \
-e 's/[ñ]/n/g' \
-e 's/[œ]/oe/g' \
-e 's/[Œ]/Oe/g' \
-e 's/[æ]/ae/g' \
-e 's/[Æ]/Ae/g' \
-e 's/[ç]/c/g' \
-e 's/[Ç]/C/g' \
-e 's/[ß]/ss/g' \
-e 's/[«»„“”‚‘’]/"/g' \
-e 's/[©]/(C)/g' \
-e 's/[®]/(R)/g' \
-e 's/[™]/(TM)/g' \
-e 's/[¥]/Y/g' \
-e 's/[Ð]/D/g' \
-e 's/[ŀ]/l/g' \
-e 's/[Ŀ]/L/g' \
-e 's/[€]/euro/g' \
-e 's/[¢]/cent/g' \
-e 's/[£]/pound/g' \
-e 's/[µ]/mu/g' \
-e 's/[²]/^2/g' \
-e 's/[³]/^3/g' \
-e 's/[¡]/!/g' \
-e 's/[¿]/?/g' \
-e 's/[]/-/g' \
-e 's/[…]/.../g' \
-e 's/[≤]/<=/g' \
-e 's/[≥]/>=/g' \
-e 's/[±]/+\/-/g' \
-e 's/[≠]/!=/g' \
-e 's/[⋅]/./g' \
-e 's/[×]/x/g' \
-e 's/[÷]/\//g' \
-e 's/[↓]/|/g' \
-e 's/[↑]/^/g' \
-e 's/[←]/<=/g' \
-e 's/[→]/=>/g' \
"$i"
done;
}
blind-append()
{
2013-01-21 15:33:01 +01:00
_printhelp()
{
2013-01-21 15:33:01 +01:00
cat <<EOF
Usage: $1 FILE [STRING]
Append to all STRING found in FILE a secret phrase being prompted. If STRING is
omitted, secret phrase will be appended to the end of the file. If FILE does
not exist, it will be created and secret phrase will be inserted. STRING will be
ignored.
This requires 'read -s'. It will not work for Bourne Shell.
EOF
}
if [ $# -gt 2 ] || [ $# -lt 1 ]; then
echo "Wrong number of arguments."
2013-01-21 15:33:01 +01:00
_printhelp $0
return
fi
local FILE="$1"
local STRING=""
local DUMMY
if [ $# -eq 2 ]; then
STRING="$2"
fi
echo -n "Secret: "
read -s DUMMY
echo ""
if [ ! -e "$FILE" ] || [ -z "$STRING" ]; then
echo "$DUMMY" >> "$FILE"
echo "Secret appended to ${FILE} at the end."
return
fi
if [ $# -eq 1 ]; then
echo "$DUMMY" >> "$FILE"
else
sed -i "s/${STRING}/${STRING}${DUMMY}/g" "${FILE}"
fi
echo "Secret appended to ${FILE}."
return
}
## Term properties
termcolors256()
{
x=$(tput op)
y=$(printf %76s)
for i in {0..256}; do
o=00$i
echo -e "${o:${#o}-3:3} $(tput setaf $i;tput setab $i)${y// /=}$x"
done
}
2013-01-21 15:33:01 +01:00
## Will not work for Bourne Shell.
termcolors()
{
# The test text. Must be 3 letters.
T='Doh'
echo -e "\n 40m 41m 42m 43m\
44m 45m 46m 47m";
for FGs in ' m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' ' 32m' \
'1;32m' ' 33m' '1;33m' ' 34m' '1;34m' ' 35m' '1;35m' \
' 36m' '1;36m' ' 37m' '1;37m';
do FG=${FGs// /}
echo -en " $FGs \033[$FG $T "
for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
do echo -en "$EINS \033[$FG\033[$BG $T \033[0m";
done
echo;
done
echo
}
termprop()
{
infocmp -1 | sed -nu 's/^[ \000\t]*//;s/[ \000\t]*$//;/[^ \t\000]\{1,\}/!d;/acsc/d;s/=.*,//p'| column -c80
}
termsupport()
{
for T in `find "/usr/share/terminfo" -type f -printf '%f\n'`;do
echo "$T `tput -T $T colors`"
done | sort -nk2
}
2012-12-05 19:18:06 +01:00
if [ -n "$(command -v highlight)" ] ; then
hlt-viewer ()
{
2013-01-21 15:33:01 +01:00
_printhelp()
{
2013-01-21 15:33:01 +01:00
cat<<EOF
Usage: $1
Highlight themes viewer for 256-colors terminals.
highlight is a tool for listing printing. This script displays a preview for
every highlight's theme. Press ENTER to display next preview. Press anything
else then ENTER to quit.
EOF
}
if [ $# -gt 0 ]; then
2013-01-21 15:33:01 +01:00
_printhelp "$0"
return
fi
2013-01-21 15:33:01 +01:00
local SAMPLE="$(cat <<EOF
void function(char* pointer, int &ref)
{
int integer=3;
2013-01-21 15:33:01 +01:00
char* string="Hello!";
// Line comment
for ( i=0; i<10; i++)
{
2013-01-21 15:33:01 +01:00
printf("Sum: %d\n", i*( integer+14 ) );
}
2013-01-21 15:33:01 +01:00
}
EOF
)"
unset DUMMY
for i in $(highlight -w | grep -v "\s\|^$"); do
echo "******************** $i ********************"
2013-01-21 15:33:01 +01:00
highlight -S c -O xterm256 <(echo "$SAMPLE") -s "$i"
read DUMMY
if [ -n "$DUMMY" ]; then
return
fi
done
}
fi
## Extractor -- Useless when using 'atool'.
2012-12-05 19:18:06 +01:00
if [ ! -n "$(command -v atool)" ]; then
extract ()
{
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.tar.xz) tar xvJf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*.xz) unxz $1 ;;
*.exe) cabextract $1 ;;
*) echo "\`$1': unrecognized file compression" ;;
esac
else
echo "\`$1' is not a valid file"
fi
}
fi
## WARNING: use this function with caution. It may drastically improve
## compression of some PDF files, but in some case, the output filesize will be
## greater! You should not use it over PDF files embedding pictures as well.
pdfcompress ()
{
if [ $# -lt 1 -o $# -gt 2 ]; then
echo "Usage: pdfcompress PDFFILE [DESTFILE]"
return
fi
if [ ! -f "$1" ]; then
echo "$1 is not a valid PDF file!"
fi
local INPUTFILE="$1"
if [ -z "$2" ]; then
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="${INPUTFILE%%.*}-COMPRESSED.pdf" "${INPUTFILE}"
rm -rf "${INPUTFILE}"
mv "${INPUTFILE%%.*}-COMPRESSED.pdf" "${INPUTFILE}"
else
local OUTPUTFILE="$2"
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="${OUTPUTFILE}" "${INPUTFILE}"
fi
}
## Extract a range of pages from a PDF.
2012-09-26 16:28:56 +02:00
pdfextract ()
{
if [ $# -ne 4 ]; then
echo "Usage: $0 PDFFILE FIRSTPAGE LASTPAGE DESTFILE"
return
fi
if [ ! -f "$1" ]; then
echo "$1 is not a valid PDF file!"
fi
gs -sDEVICE=pdfwrite -dNOPAUSE -dSAFER -dSAFER -dFirstPage=$2 -dBATCH -dLastPage=$3 -sOutputFile=$4 $1
}
## Resize input PDF to an A4 output PDF.
pdfresize ()
{
if [ $# -ne 2 ]; then
echo "Usage: $0 <input> <output>"
return
fi
gs -q -o $2 -sDEVICE=pdfwrite -sPAPERSIZE=a4 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel=1.4 $1
}
archive ()
{
2013-01-21 15:33:01 +01:00
_printhelp()
{
2013-01-21 15:33:01 +01:00
cat <<EOF
Usage: $1 [-m METHOD] [-v] FILES|FOLDERS
Create an archive from a single or multiples files/folders.
-h: Display this help.
-m: Choose compression method.
* gz: gzip (default).
* xz: LZMA.
-v: Exclude VCS data. (GNU tar only).
EOF
}
local OPTION_VCS=""
local OPTION_METHOD=""
while getopts ":hm:v" opt; do
case $opt in
h)
2013-01-21 15:33:01 +01:00
_printhelp "$0"
return 1
;;
m)
OPTION_METHOD="${OPTARG}"
;;
v)
OPTION_VCS="--exclude-vcs"
;;
?)
2013-01-21 15:33:01 +01:00
_printhelp "$0"
return 1
;;
:)
echo "Missing argument."
echo "Use $0 -h for help."
return 1
;;
esac
done
local ARCEXT
local ARCOPT
case $OPTION_METHOD in
"gz")
ARCEXT="tar.gz"
ARCOPT="z"
;;
"xz")
ARCEXT="tar.xz"
ARCOPT="J"
;;
*)
ARCEXT="tar.gz"
ARCOPT="z"
;;
esac
shift $(($OPTIND - 1))
local ARCPATH
local ARCSOURCE
local ARCNAME
if [ $# -eq 1 ]; then
ARCPATH="$(dirname $(readlink -f "$1"))"
ARCSOURCE="$(basename $(readlink -f "$1"))"
ARCNAME="${ARCSOURCE}-$(date +%y-%m-%d-%H%M%S).${ARCEXT}"
(cd "$ARCPATH" && \
tar -${ARCOPT} -cf "$ARCNAME" "$ARCSOURCE" ${OPTION_VCS})
else
ARCSOURCE="$(basename $PWD)"
ARCNAME="$(basename "$ARCSOURCE")-$(date +%y-%m-%d-%H%M%S).${ARCEXT}"
if [ $# = 0 ];then
(cd "$PWD/.." && \
tar -${ARCOPT} -cf "$ARCNAME" "$ARCSOURCE" ${OPTION_VCS})
else
## Note for zsh: do NOT initialize an array with "myarray=()".
local FILELIST
for i; do
FILELIST=(${FILELIST[*]} "$i")
done
tar -${ARCOPT} -cf "$ARCNAME" ${FILELIST[*]} ${OPTION_VCS}
fi
fi
}
## Git compare
git-compare()
{
if [ $# -ne 1 ]; then
echo "Wrong number of argument."
return
fi
comm -3 <(git ls-files | sort) <(find "$1" -type f ! -path "*.git/*" | sed 's/^[^\/]*\///g' | sort)
}
## This function will clean TeX/LaTeX project folders recursively.
texclean ()
{
if [ -z "$1" ]; then
WORKDIR="$PWD"
else
WORKDIR="$1"
fi
## WARNING: removing .idx files is messy in a .git folder.
find "$WORKDIR" -type f \( \
-name "*.aux" -o \
2012-11-12 21:16:41 +01:00
-name "*.glg" -o \
-name "*.glo" -o \
-name "*.gls" -o \
-name "*.ilg" -o \
-name "*.ind" -o \
-name "*.lof" -o \
-name "*.log" -o \
2013-02-01 14:36:14 +01:00
-name "*.maf" -o \
-name "*.mtc" -o \
-name "*.mtc?" -o \
-name "*.nav" -o \
-name "*.out" -o \
-name "*.snm" -o \
2013-02-01 14:36:14 +01:00
-name "*.synctex" -o \
-name "*.synctex.gz" -o \
-name "*.tns" -o \
2012-11-12 21:16:41 +01:00
-name "*.toc" -o \
-name "*.xdy" \) \
-print \
-delete
}
## Clean current folder
vcsclean()
{
local WORKDIR
if [ -z "$1" ]; then
WORKDIR="$PWD"
else
WORKDIR="$1"
fi
local CHOICE
2013-01-21 15:33:01 +01:00
unset CHOICE
echo "This will clean current folder from all VCS control files."
echo -n "Proceed ? [y/N] "
read CHOICE
CHOICE=$(echo $CHOICE | tr '[:upper:]' '[:lower:]')
if [ "$CHOICE" = "y" ]; then
## First clean the folders.
find "$WORKDIR" \( \
-path "*/.git/*" -o \
-path "*/.bzr/*" -o \
-path "*/.cvs/*" -o \
-path "*/.hg/*" -o \
-path "*/.svn/*" \) \
-delete
## Remove the empty vcs folder.
find "$WORKDIR" -type d \( \
-name ".bzr" -o \
-name ".cvs" -o \
-name ".git" -o \
-name ".hg" -o \
-name ".svn" \) \
-delete
echo "VCS files cleaned."
fi
}
## LSOF stats. Print number of open files per process.
lsofstat()
{
local LSOFOUT=$(lsof|awk '{print $1}')
for i in $(echo $LSOFOUT |sort -u);do
echo -n "$i "
echo $LSOFOUT | grep ^$i | wc -l
done
}
## Executable info
xinf()
{
if [ $# -ne 1 ]; then
echo "Give an executable in PATH as parameter."
return
fi
local xpath="$(type $1 | cut -d' ' -f3)"
ls -l "$xpath"
file "$xpath" | cut -d':' -f2 | cut -b 2-
}
2013-01-26 19:08:29 +01:00
## BAD CODE. This function will try to find an input binary file in the content
## of binary files in current folder. It does not work on big file because
## 'find' and 'grep' have an argument length limit.
bindatasearch()
{
2013-01-26 19:08:29 +01:00
echo "Deprecated function."
return
if [ $# -ne 2 ] -; then
echo "Usage: $0 FILECHUNK BIGFILE"
return
fi
2013-01-26 19:08:29 +01:00
if [ $(du -b Cover.jpg | awk '{print $1}') -gt 1048576 ]; then
echo "[$1] file size must not exceed 1MB."
return
fi
2013-01-26 19:08:29 +01:00
## The awk command suppresses first column, spaces and line breaks.
2013-01-26 19:08:29 +01:00
local SOURCE
SOURCE=$(od -tx8 "$1" | awk '($1="")1 gsub ( /\s/,"") { printf ("%s", $0) }')
local FILEDUMP
FILEDUMP=$(od -tx8 "$1" | awk '($1="")1 gsub ( /\s/,"") { printf ("%s", $0) }')
# grep -q "$SOURCE" <(echo "$FILEDUMP")
## This special, not well-known syntax allows us to execute a set of
## functions upon the result of find. Since everything MUST be between
## simple quotes, we cannot use external variables directly. So we pass the
## $SOURCE variable as argument. The underscore at the end allows the use of
2013-01-26 19:08:29 +01:00
## arguments. Note it will not work
# find "$TARGET" -type f -exec sh -c '
# # FILEDUMP=$(od -tx8 "$1" | awk '"'"'($1="")1 gsub ( /\s/,"") { printf ("%s", $0) }'"'"')
# # grep -q "$2" <(echo $FILEDUMP)
2013-01-26 19:08:29 +01:00
# # [ $? -eq 0 ] && echo "$1"
# ' _ {} "$SOURCE" \;
}
## Xrandr
xmulti ()
{
if [ $# -ne 1 ]; then
echo "Wrong number of argument."
return
fi
xrandr --output "$1" --auto --right-of $(xrandr | sed -n "/current/{n;p;q}" | cut -f1 -d" ")
}
xmultioff ()
{
if [ $# -ne 1 ]; then
echo "Wrong number of argument."
return
fi
xrandr --output "$1" --off
}
2012-12-05 19:18:06 +01:00
## Format C using 'indent'. Alternative to indent: astyle, uncrustify.
formatc()
{
if [ -z "$(command -v indent)" ]; then
echo "Please install 'indent'"
return
fi
2013-02-24 11:48:09 +01:00
_formatc_dir()
{
find "$1" -type f \
-name "*.[ch]" \
-print \
-exec indent -i4 -ppi4 -bli0 -cli4 -nut {} \;
## Remove backup files.
find "$1" -type f \( \
-name "*.[ch]~" -o \
-name "*.[ch]~[0-9]*~" \) \
-delete
}
if [ $# -eq 0 ]; then
echo "Working on current dir"
_formatc_dir "$PWD"
return
fi
2013-02-24 11:48:09 +01:00
for i ; do
echo "[$i]"
2013-02-24 11:48:09 +01:00
if [ -d "$i" ]; then
_formatc_dir "$i"
else
indent -i4 -ppi4 -bli0 -cli4 -nut "$i"
rm -f "$i~" "$i~[0-9]*~"
fi
done
}
## LaTeX quick compiler. It adds the preambule -- and the \end{document} --
## automatically.
ltx()
{
if [ $# -ne 1 ]; then
echo "Usage: $0 FILE"
return
fi
local PREAMBLE
local END
## One line is mandatory.
PREAMBLE='\documentclass[10pt,a4paper]{article}\usepackage[utf8]{inputenc}\usepackage[T1]{fontenc}\usepackage{amsmath,amssymb,amsfonts}\usepackage{geometry}\usepackage{lmodern}\usepackage{marvosym}\usepackage{textcomp}\DeclareUnicodeCharacter{20AC}{\EUR{}}\DeclareUnicodeCharacter{2264}{\leqslant}\DeclareUnicodeCharacter{2265}{\geqslant}\begin{document}\input'
END='\end{document}'
pdflatex -file-line-error-style -interaction nonstopmode -jobname="${1%.tex}" "$PREAMBLE" "$1" "$END"
}
2013-02-17 11:58:49 +01:00
ediff()
{
emacs -q -l ~/.emacs-light --eval "(ediff \"$1\" \"$2\")"
}
2013-02-19 23:23:25 +01:00
crun()
{
2013-02-20 12:33:10 +01:00
if [ $# -lt 1 ]; then
echo "Usage: $0 FILE [GCC_OPTS]"
2013-02-19 23:23:25 +01:00
return
fi
2013-02-20 12:33:10 +01:00
local INPUT
local GCC_OPTS
local FILE
INPUT="$1"
shift
GCC_OPTS="-O0 -Wall -Wextra -Wshadow -pthread"
if [ $# -ne 0 ]; then
GCC_OPTS="$@"
fi
2013-02-19 23:23:25 +01:00
FILE=$(mktemp)
2013-02-20 12:33:10 +01:00
echo "==> gcc \"$INPUT\" -o \"$FILE\" $GCC_OPTS"
## Zsh compatibility. We need it otherwise word splitting of parameter like
## TC_SAMPLE will not work.
local STATUS
STATUS="$(set -o | grep 'shwordsplit' | awk '{print $2}')"
[ "$STATUS" = "off" ] && set -o shwordsplit
gcc "$INPUT" -o "$FILE" $GCC_OPTS
## Restore Zsh previous options. This will not turn off shwordsplit if it
## was on before calling the function.
[ "$STATUS" = "off" ] && set +o shwordsplit
echo "==> $FILE"
2013-02-19 23:23:25 +01:00
"$FILE"
rm "$FILE"
}
2013-02-22 22:43:22 +01:00
git-check()
{
while IFS= read -r FOLDER; do
if [ -z "$(cd "${FOLDER%/*}" && git status -uno | grep "nothing to commit")" ]; then
echo "${FOLDER%/*}"
fi
done <<EOF
$(find . -type d -name ".git")
EOF
}
##==============================================================================
## Pacman functions
##==============================================================================
[ -n "$(command -v pacman)" ] && . "${SHELL_DIR}/funs_pacman"
##==============================================================================
## FreeBSD functions
##==============================================================================
[ "$(uname)" = FreeBSD ] && . "${SHELL_DIR}/funs_freebsd"
##==============================================================================
## TeXlive functions
##==============================================================================
## TeXlive
if [ -d "/usr/local/texlive" ]; then
2012-12-05 19:18:06 +01:00
## WARNING: it is important to set umask properly, otherwise users might
## not have authorization to use the packages.
## This is bad pratice to write args without double quotes, but since we
## are sure there is no space in TeX Live packages, it is OK here.
tli ()
{
sudo sh -c 'umask 022 && tlmgr install $0 $@' "$@"
}
tlr ()
{
sudo sh -c 'umask 022 && tlmgr remove $0 $@' "$@"
}
fi
##==============================================================================
## Transcoding functions
##==============================================================================
[ -n "$(command -v ffmpeg)" ] && . "${SHELL_DIR}/funs_transcode"