Termux Useful Tweaks
Tags: termux, android, linux, cli
Published: 2022-03-21 11:59:44

## What is termux?
For those who do not know what termux is:

> Termux is an Android terminal emulator and Linux environment app that works directly with no rooting or setup required. A minimal base system is installed automatically - additional packages are available using the APT package manager.

## Basic shortcuts

```txt
Volume Down  -->  Ctrl
Volume Up    -->  Esc
```

So to clean your screen you can press `Volume Down + l` which is the same as if you were in a normal Linux terminal

To exit your terminal you can press `Volume Down + d`

More advanced keyboard settings (terminal) visit [this link](https://wiki.termux.com/wiki/Terminal_Settings) on termux wiki.

## Use [F-droid](https://f-droid.org/en/) instead of google play store
The updated termux version can only be found on  the F-droid repo, read more [here](https://github.com/termux/termux-app/issues/2278)

In my case I had difficulties downloading F-droid directly to my android, so I downloaded it on my computer and started a http server using python to download it directly in my phone:

```sh
aria2c -c https://f-droid.org/F-Droid.apk
python3 -m http.server
```

I had to get my local ip (computer) and type it on my firefox on the phone:

```sh
http://ip:8000
```

There is also another alternative store: https://auroraoss.com/

## Environment variables
Termux has a `$PREFIX` environment variable:
    
    /data/data/com.termux/files/usr

You can use it in some cases to avoid typing all the above path

## Initial install:
First install from F-droid:

```sh
termux termux-api
```

### Backing up termux settings
source: https://wiki.termux.com/wiki/Backing_up_Termux

In this example, a backup of both home and sysroot will be shown. The resulting archive will be stored on your shared storage (/sdcard) and compressed with gzip.

1. Ensure that storage permission is granted:

```sh
termux-setup-storage
```

NOTE: Every time you have any permissions problem revoke termux permissions and run `termux-setup-storare`

2. Backing up files:

```sh
tar -zcf /sdcard/termux-backup.tar.gz -C /data/data/com.termux/files ./home ./usr
```

Backup should be finished without any error. There shouldn't be any permission denials unless the user abused root permissions. If you got some warnings about socket files, ignore them. 

### Restoring

Here will be assumed that you have backed up both home and usr directory into same archive. Please note that all files would be overwritten during the process.

1. Ensure that storage permission is granted:

```sh
termux-setup-storage
```

2. Extract home and usr with overwriting everything. Pass --recursive-unlink to remove any junk and orphaned files. Pass --preserve-permissions to set file permissions as in archive, ignoring the umask value. By combining these extra options you will get installation state exactly as was in archive.

```sh
tar -zxf /sdcard/termux-backup.tar.gz -C /data/data/com.termux/files --recursive-unlink --preserve-permissions
```

Now close Termux with the "exit" button from notification and open it again.

Backup using **termux-backup**: 
In my case I have used this command

    termux-backup ~/storage/shared/Documents/termux-backup.tar.xz

To restore just change "backup" for "restore"

## Fix: repository is under maintenance or down 
This solution comes from [this](https://www.youtube.com/watch?v=kaCkPTX3p2E) youtube video/channel

> The error is as follows:
N: Metadata integrity can't be verified, repository is disabled now.                             
N: Possible cause: repository is under maintenance or down (wrong sources.list URL?).

This issue is caused by bad repo sources or mirrors and because of this the package installations fail with an error saying "repository is under maintenance or down". 
A solution for this issue is to change the mirrors using the `termux-change-repo` command and that is what this video explains.

So, the commands are:

```sh
termux-change-repo
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a7r90p9vye03ulrj4aqb.png)

**Use space to select all the above options** until you reach the next screen as follows:

In my case I chose the second of the list that follows

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lj44ynphqt74ytniy2ns.png)

### Install some useful apps

    pkg update && pkg upgrade
    pkg install termux-tools openssh mpv wget termux-api neovim python iproute2 git

TIP: You can abbreviate "install" just typing "in"

### Copy your public ssh key to your computer

Generate your ssh-key on your android:

    ssh-keygen -b 4096 -t rsa

    ssh-copy-id -i ~/.ssh/id_rsa.pub user@ip

TIP: When generating your ssh keys do not type any password and set your sshd to allow only public key logins, this way you can login easily.

You also need to set a password to your use, just in case you need to access your ssh server without your keys:

    passwd

Discover your termux "user" name:

    whoami
    --> this is mine: u0_a225

You can also get your user name by typing:

    echo $USER

Start your sshd:

    sshd -p 2222

Copy your computer's ssh public key to your android (termux):

    ssh-copy-id -p 2222 -i ~/.ssh/id_rsa.pub u_0a225@yourip

## Using scp
+ https://wiki.termux.com/wiki/Remote_Access

```sh
scp -P 2223 aliases u0_a103@192.168.15.30:~/storage/downloads
scp -P 8022 *.mp3 u0_184@192.168.15.2:~/storage/music
```

## Access your termux using nautilus

Remember to change the port number accordingly!

    sftp://u0_a225@phone/data/data/com.termux/files/home
    sftp://u0_a225@192.168.0.100:8022/data/data/com.termux/files/home


## Some useful aliases (~/.bashrc)

```sh
alias localip='ip addr | grep -Po '\''(?<=inet)\s(?!127)[^/]+'\'
alias vim='/data/data/com.termux/files/usr/bin/nvim'
```

## Set folders

**According to [termux wiki](https://wiki.termux.com/wiki/Termux-setup-storage)**: In order to have access to shared storage (/sdcard or /storage/emulated/0), Termux needs a storage access permission. It is not granted by default and is not requested on application startup since it is not necessary for normal application functioning.

**Storage access permission will not enable write access to the external sdcard and drives connected over USB.**

    termux-setup-storage

## termux style

Having a nice looking terminal for me is something essential, so:

    git clone https://github.com/adi1090x/termux-style
    cd termux-style
    ls
    chmod +x install
    ./install
    termux-style

##  How to use Termux to download YouTube videos
+ https://techwiser.com/how-to-use-termux-to-download-youtube-videos/

```sh
wget -c https://pastebin.com/raw/RijZvset -O install.sh
dos2unix install
chmod u+x install.sh
./install.sh
```

## Setup your python libs in a more sane way:

    pip3 install pipx
    pipx ensurepath # make sure to set path
    pipx install yt-dlp # fix some youtube-dl issues [official site](https://github.com/yt-dlp/yt-dlp)
    pipx install yturl

Then you can:

    alias youtube-dl="/data/data/com.termux/files/home/.local/bin/yt-dlp"

The instalation script:

```sh
#!/data/data/com.termux/files/usr/bin/bash
# 4/05/2017 Gabi Tiplea

echo -e "Updating default packages\n"
apt update && apt -y upgrade

echo -e "Requesting acces to storage\n"
termux-setup-storage
sleep 5

echo -e "Installing python\n"
packages install -y python

echo -e "Installing youtube-dl\n"
yes | pip install youtube-dl

echo -e "Creating the Youtube folder to download the files\n"
mkdir ~/storage/shared/Youtube

echo -e "Creating youtube-dl folder for config\n"
mkdir -p ~/.config/youtube-dl

echo -e "Creating bin folder\n"
mkdir ~/bin

echo -e "Downloading and installing termux-url-opener\n"
wget http://pastebin.com/raw/LhDxGbtY -O ~/bin/termux-url-opener
dos2unix ~/bin/termux-url-opener


echo -e "\n"
echo -e "Copyright 2017 Gabi Tiplea\n"
```

### Install trash-cli

    pipx install trash-cli
    alias rm='echo use trash instead!'

Trash-cli moves your files to `~/.local/share/Trash`

### Set youtube-dl script permissions

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/61manpszc4n3ykro12kx.jpeg)

## Fasd_cd

Fasd (pronounced similar to "fast") is a command-line productivity booster. Fasd offers quick access to files and directories for POSIX shells. It is inspired by tools like autojump, z and v. Fasd keeps track of files and directories you have accessed, so that you can quickly reference them in the command line.

The name fasd comes from the default suggested aliases f(files), a(files/directories), s(show/search/select), d(directories).

Fasd ranks files and directories by "frecency," that is, by both "frequency" and "recency." The term "frecency" was first coined by Mozilla and used in Firefox (link).

```sh
########### aliases para o fasd_cd ##########
# aliases para fasd
alias a='fasd -a' # any
alias s='fasd -si' # show / search / select
alias d='fasd -d' # directory
alias f='fasd -f' # file
alias vf='vim $(fasd -f)'
alias sd='fasd -sid' # interactive directory selection
alias sf='fasd -sif' # interactive file selection
alias z='fasd_cd -d' # cd, same functionality as j in autojump
alias zz='fasd_cd -d -i' # cd with interactive selection
alias v='f -e nvim' # open file with vim
#alias v='f -t -e vim -b viminfo'
alias _!='fc -e "sed -i -e \"s/^/sudo /\""' # sudo last command

```

Also add these lines to yourc .bashrc

```sh
# init configuration of fasd tool ##############
# source: https://github.com/clvv/fasd
eval "$(fasd --init auto)"

fasd_cache="$HOME/.fasd-init-bash"
if [ "$(command -v fasd)" -nt "$fasd_cache" -o ! -s "$fasd_cache" ]; then
	fasd --init posix-alias bash-hook bash-ccomp bash-ccomp-install >| "$fasd_cache"
fi
```

## Better bash-completion

```sh
# ------------------------------------------------------
# FILE         ~/.inputrc
# CREATED      Qui 13/Out/2011 hs 09:39
# LAST CHANGE  2013 Jul 17 14:41:08
# SITE         http://vivaotux.blogspot.com
# TWITTER      http://www.twitter.com/voyeg3r
# EMAIL        <voyeg3r  gmail.com>
# DOWNLOAD     https://gist.github.com/1284081
#
#              key bindings for bash
#
#                  ( O O )
# --------------oOO--(_)--OOo---------------------------

# download
# wget -c https://bitbucket.org/sergio/dotfaster/raw/master/inputrc -O ~/.inputrc

#-------------------------------------------------------
# Use `bind -v` to see current settings
#-------------------------------------------------------

# definir no ~/ .bashrc o local do inputrc
# INPUTRC=~/.inputrc

# Referências
# https://bugs.launchpad.net/ubuntu/+source/base-files/+bug/103986
# http://superuser.com/questions/222390/making-bash-tab-completion-more-like-cmd-exe
# http://brettterpstra.com/2011/09/25/quick-tip-some-inputrc-fun/

# pesquisar sobre as opções 'shopt' do bash
# pesquisar as opções 'cmdhist' 'nocaseglob' 'nocasematch'
# By default, C-x C-r is bound to re-read-init-file.

# start-kbd-macro - C-x (
# Begin saving the characters typed into the current keyboard macro.
# end-kbd-macro - C-x )
# Stop saving the characters typed into the current keyboard macro and store the definition.
# call-last-kbd-macro - C-x e

# Adding this to your /etc/inputrc or ~/.inputrc will result in a character
# # being appended to any file-names returned by completion, in much the same
# # way as ls -F works.
set visible-stats on
set blink-matching-paren on
set bell-style visible

set convert-meta off
set input-meta on
set output-meta on
set show-mode-in-prompt on

# https://unix.stackexchange.com/questions/112406/how-do-i-switch-to-vi-editing-mode-in-readline
set vi-ins-mode-string (ins)\1\e[5 q\2
set vi-cmd-mode-string (cmd)\1\e[1 q\2
## to change to vi mode:   set -o vi | set -o emacs

# Be more intelligent when autocompleting by also looking at the text after
# the cursor. For example, when the current line is "cd ~/src/mozil", and
# the cursor is on the "z", pressing Tab will not autocomplete it to "cd
# ~/src/mozillail", but to "cd ~/src/mozilla". (This is supported by the
# Readline used by Bash 4.)
set skip-completed-text on

$if Bash
    # Search history back and forward using page-up and page-down
    "\e[5~": history-search-backward
    "\e[6~": history-search-forward
    # Cycle through ambiguous completions instead of list (option bellow)
    "\C-i": menu-complete
    # Binding Shift-Tab to go backward is a little tricker:
    "\e[Z": "\e-1\C-i"
    # control-x-p to edit path
	"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
	# prepare to type a quoted word -- insert open and close double quotes
	# and move to just after the open quote
	"\C-x\"": "\"\"\C-b"
	"\C-x'": "''\C-b"
	# insert option macro (if you forgot option in previous cmd type Alt-o)
	"\eo": "\C-p\C-a\ef "
	# show help for a commad with alt-h
	"\eh": "\C-a\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d\C-e"
    # Completion
    set match-hidden-files off
    set completion-query-items 350
    set completion-ignore-case on
    set show-all-if-ambiguous on
    set show-all-if-unmodified  on
	set page-completions off
	set visible-stats on
	set completion-map-case on
    # do history expansion when space entered
    #Space: magic-space
$endif
$include /etc/inputrc

$if exists("&wildignorecase")
    set wildignorecase
$endif

# put in your ~/.bashrc
# complete -d cd mkdir rmdir
```

## Bash prompt
I have found an amazing projet that gives you a great bash prompt: 

https://github.com/1Tech-X/termux-PS1

## Bashrc file "~/.bashrc"

```sh
# Last Change: Thu, 20 Jan 2022 14:22
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# http://www.caliban.org/bash/

#                  ( O O )
#   +===========oOO==(_)==OOo==============+
#   |                                      |
#   |     °v°   Sergio Luiz Araujo Silva   |
#   |    /(_)\  Linux User #423493         |
#   |     ^ ^   voyeg3r   gmail.com       |
#   +======================================+
#
# References: https://github.com/fnichol/bashrc/blob/master/bashrc

INPUTRC=~/.inputrc

EDITOR='/data/data/com.termux/files/usr/bin/nvim'

# avoid ctrl-s freeze your terminal
stty stop ""

# protegendo arquivos contra sobrescrita
#set -o noclobber

# bash completion to sudo command
complete -cf sudo
complete -cf man
complete -cf gksu
complete -d cd mkdir rmdir
# autocomplete ssh commands
complete -W "$(echo `cat ~/.bash_history | egrep '^ssh ' | sort | uniq | sed 's/^ssh //'`;)" ssh
complete -A file -X '!*.@(Z|gz|tgz)' gunzip

[ -f ~/.vim/git-completion.bash ] && source ~/.vim/git-completion.bash

function gm() {
	git commit -am "$1" && git push
}

function vif() {
	local fname
	cd ~/.dotfiles
	fname=$(fzf) || return
	vim "$fname"
}

[ -f ~/.bash_aliases ] && . ~/.bash_aliases


htmldecode() { : "${*//+/ }"; echo -e "${_//&#x/\x}" | tr -d ';'; }
urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }

alias='$EDITOR ~/.bashrc ; source ~/.bashrc'
alias allcomm='whatis `compgen -c` | less' # list all possible commands
alias x='extract'
alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'
alias proz='proz -v -f -s'
alias xclip='xclip -selection c'
alias config-date='sudo ntpdate -u -b bonehed.lcs.mit.edu'
alias aria2c='aria2c -x5 -c'
alias 4shared='cadaver http://webdav.4shared.com/'
alias compilalivro='make clean; make && make show'
#alias updatelivro='hg push ssh://hg@bitbucket.org/sergio/learn-english'
alias less='less -r'
alias ls="ls --color=auto"
alias dir="dir --color=auto"
alias lsd="ls -d */"
alias grep="grep --color=auto"
alias dmesg='dmesg --color'
#alias rm='mv -t ~/.local/share/Trash/files'
alias syncode='cd ~/.vim && git push -u origin master'
alias ssh="ssh -C"
alias scp='scp -r '
alias gril="grep -ril"
alias youtube-dl="youtube-dl -t"
alias xterm='/usr/bin/xterm -ls -bg black -fg white -cr -fs 11 white -hc white rightbar'
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
alias lvim='/data/data/com.termux/files/usr/bin/nvim -c "normal '\''0"'
alias cdesk="cd ${HOME}/Desktop"
alias iso2utf='iconv -f iso-8859-1 -t utf-8'
alias utf2iso='iconv -f utf-8 -t iso-8859-1'
alias path='echo -e ${PATH//:/\\n}'
alias vim='/data/data/com.termux/files/usr/bin/nvim'
command -v apt-proz >/dev/null && INSTALLER="apt-proz" || INSTALLER="apt-get"
#alias update='sudo apt-proz update'
alias upgrade='sudo apt-proz update && sudo apt-proz upgrade'
alias acs='apt-cache search'
alias install='sudo apt-proz -y install'

# Listen to Air Traffic Control, used to be scripts.
alias GIG='mplayer http://rio.radioetvweb.com.br:8246'
alias GRU='mplayer http://rio.radioetvweb.com.br:8298'
alias POA='mplayer http://rio.radioetvweb.com.br:8282'
alias CGH='mplayer http://rio.radioetvweb.com.br:8300'
alias classic='mplayer http://80.237.154.83:8120'

# watch aljazeera
alias alj='rtmpdump -v -r "rtmp://aljazeeraflashlivefs.fplive.net/aljazeeraflashlive-live/aljazeera_eng_med" | mplayer -'

shopt -s histverify                    # verifica comandos do histórico
shopt -s checkwinsize                  # ajusta janela redimensionada
shopt -s hostcomplete
shopt -s extglob
[ ${BASH_VERSINFO[0]} -ge 4 ] && shopt -s globstar
shopt -s cdspell                       # fix wrong type keys
shopt -s dirspell
shopt -s autocd

# convert text to lowcase
lower() { echo "${@}" | awk '{print tolower($0)}' ;}
upper() { echo "${@}" | awk '{print toupper($0)}' ;}
expandurl() { curl -sIL $1 | awk '/^Location/ || /^Localização/ {print $2}' ; }
calc(){ echo "scale=2;$@" | bc;}
ff () { find . -type f -iname '*'"$@"'*' ; }
mkcd() { mkdir -p "$@" && cd $_; }
gsend() { git commit -am "$1" && git push ;}
gst() { git status;}
decToBin () { echo "ibase=10; obase=2; $1" | bc; }
decTohex () { bc <<< "obase=16; $1"; }
biggest (){ du -k * | sort -nr | cut -f2 | head -20 | xargs -d "\n" du -sh; }
top10 () { history | awk '{print $2}' | sort | uniq -c | sort -rn | head ; }
beep () { echo -e -n \\a ; }
dict() { curl "dict://dict.org/d:${1%%/}";}

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# trying to fix sound in gnash flash
export SDL_AUDIODRIVER=alsa
export AUDIODEV=plug:dmix

# don't put duplicate lines in the history. See bash(1) for more options
export HISTCONTROL=ignoredups
# ... and ignore same sucessive entries.
export HISTCONTROL=ignoreboth
export HISTIGNORE="&:ls:pwd:[bf]g:ssh *:exit"
export LS_COLORS=$LS_COLORS:"*.wmv=01;35":"*.wma=01;35":"*.flv=01;35":"*.m4a=01;35":"*.mp3=01;35":"*.mp4=01;35"

function add_ls_colors { export LS_COLORS="$LS_COLORS:$1"; }
#export LS_COLORS=
add_ls_colors "*.ps=00;35:*.eps=00;35:*.pdf=00;35:*.svg=00;35"
add_ls_colors "*.jpg=00;35:*.png=00;35:*.gif=00;35"
add_ls_colors "*.bmp=00;35:*.ppm=00;35:*.tga=00;35"
add_ls_colors "*.xbm=00;35:*.xpm=00;35:*.tif=00;35"
add_ls_colors "*.png=00;35:*.mpg=00;35:*.avi=00;35"
## Archive files
add_ls_colors "*.tar=00;31:*.tgz=00;31:*.arj=00;31"
add_ls_colors "*.taz=00;31:*.lzh=00;31:*.zip=00;31"
add_ls_colors "*.z=00;31:*.Z=00;31:*.gz=00;31"
add_ls_colors "*.bz2=00;31:*.deb=00;31:*.rpm=00;31"
## Fixes
add_ls_colors "*.com=00;00:"


# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
	debian_chroot=$(cat /etc/debian_chroot)
fi

if [[ "$(id -un)" != "root" ]]; then
	PS1='`[ $? = 0 ] && echo "\[\033[01;34m\]✔\[\033[00m\]"\
	|| echo "\[\033[01;31m\]✘\[\033[00m\]"` [\A] \[\033[01;32m\]\u:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
	# prompt para o root
	#PS1='\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
	PS1='`[ $? = 0 ] && echo "\[\033[01;34m\]✔\[\033[00m\]" ||\
	echo "\[\033[01;31m\]✘\[\033[00m\]"` [\A] \[\033[01;31m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
fi

export prompt_command='echo -ne "\033]0;"`hostname -i`"\007"'

getextension () {
	echo "Full filename: $(basename ${1})"
	echo "Extension: ${1##*.}"
	echo "without extension: ${1%.*}"
}

getaudio () {
	# dependences: libmp3lame-dev libmad0-dev and compile sox
	# http://michalfapso.blogspot.com.br/2012/01/using-google-text-to-speech.html

	var="${@}"
	echo "${@}" > teste.txt

	filename="${var// /_}.mp3"
	speak.pl en teste.txt "$filename"
	rm -rf "$filename".tmp && rm -f teste.txt
	echo "[sound:${filename}]" | xclip -selection c
	mpg123 "$filename"
}

eng2audio () {
	# see this: https://gist.github.com/michalfapso/3110049/raw
	# http://michalfapso.blogspot.com.br/2012/01/using-google-text-to-speech.html
	# http://mostovenko.blogspot.com.br/2012/04/voicing-messages-in-python-or-fun-with.html
	# versão no snipt: https://snipt.net/voyeg3r/

# how truncate string  --> echo ${var:start:end}
# removendo o último caractere de uma variável   ${var:0:-1}
#   vou precisar truncar a string::::: echo "Sua string contém "${#var}" caracteres"
if   ping -q -c2 www.google.com >/dev/null ; then
	FILENAME="${@:?Usage: $0 give me some words to speech}"
	FILENAME=`awk '{print tolower($0)}' <<< "$FILENAME"`
	url="http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q="
	wget -q -U Mozilla -O "${FILENAME// /_}.mp3" "${url}${FILENAME// /+}+' '"
	[ -f "${FILENAME// /_}.mp3" -a ! -s "${FILENAME// /_}.mp3" ] && { rm -f "${FILENAME// /_}.mp3" ; echo 'error!'; }
	command -v mpg123 > /dev/null && mpg123 -q "${FILENAME// /_}.mp3"
	echo "[sound:${FILENAME// /_}.mp3]" | xclip -selection c
fi
}

mp4tomp3 () {
	# http://stackoverflow.com/questions/5365090/removing-extension-from-file-without-knowing-it
	command -v ffmpeg > /dev/null || sudo apt-get install -y ffmpeg
	command -v lame > /dev/null || sudo apt-get install -y gstreamer0.10-plugins-ugly

	local var="${1%.*}"                              # strip extension
	local newname="${var// /_}.mp3"                  # get rid space and add mp3 extension
	ffmpeg -i "$1" -f mp3 -ab 320000 -vn "$newname"
}

youtube-mp3 () {
# put thins function in your ~/.bashrc

${1:?"error: I need a youtube link"}

  # testing existence of programs
  NEEDED_COMMANDS="youtube-dl ffmpeg"
  missing_counter=0
  for needed_command in $NEEDED_COMMANDS; do
	  if ! hash "$needed_command" >/dev/null 2>&1; then
		  printf "Command not found in PATH: %s\n" "$needed_command" >&2
		  ((missing_counter++))
	  fi
  done
  if ((missing_counter > 0)); then
	  sudo apt-get install -y $NEEDED_COMMANDS
  fi

  # geting video and converting with ffmpeg
  youtube-dl --restrict-filenames -x --audio-format=mp3 --audio-quality 320k  "${1}"
}

geturls () {
	# source: http://stackoverflow.com/questions/2804467/spider-a-website-and-return-urls-only
	${1?"Usage: geturls Link"}
	wget -q "$1" -O - | \
		tr "\t\r\n'" '   "' | \
		grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \
		sed -e 's/^.*"\([^"]\+\)".*$/\1/g'
	}

backup() {
	file=${1:?"error: I need a file to backup"}

	timestamp=$(date '+%Y-%m-%d-%H:%M:%S')
	backupdir=~/backups

	[ -d ${backupdir} ] || mkdir -p ${backupdir}
	cp -a ${file} ${backupdir}/$(basename ${file}).${timestamp}
	return $?
}

#diskusage() {
# du -ks "$@" | sort -nr | \
# awk '{ \
# if ($1 > 1048576) printf("%8.2fG", $1/1048576) ; \
#   else if ($1 > 1024) printf("%8.2fM", $1/1024) ; \
#   else printf("%8.2fK", $1) ; \
#   sub($1, "") ; print \
# }'
#}

getmp3 (){
	${1?"Usage: getmp3 Link"}
	for i in "`wget -q "$1" -O - | grep -i -o 'http://.*\.mp3'`"; do
		wget -c "$i"
	done
}

compact() {
	# source: http://jfmitre.com/2012/10/compactando-arquivos-no-terminal-do.html
	# compact arquivo_compactado.EXTENSÃO lista de arquivos para compactar
	if [ "$#" -ge "1" ]; then
		case "$1" in
			*.[tT][aA][rR].[bB][zZ]|*.[tT][bB][zZ])
				local file="$1"; shift; tar jcvf "$file" "$@" ;;
			*.[tT][aA][rR].[bB][zZ]2|*.[tT][bB][zZ]2)
				local file="$1"; shift; tar jcvf "$file" "$@" ;;
			*.[tT][aA][rR].[gG][zZ]|*.[tT][gG][zZ])
				local file="$1"; shift; tar zcvf "$file" "$@" ;;
			*.[gG][tT][gG][zZ])
				local file="$1"; shift; tar zcvf "$file" "$@" ;;
			*[bB][zZ]2)
				shift; bzip2 -z -k "$@"  ;;
			*.[rR][aA][rR])
				local file="$1"; shift; rar a -r "$file"  "$@" ;;
			*[gG][zZ])
				shift; gzip -r "$@"  ;;
			*.[tT][aA][rR])
				local file="$1"; shift; tar cvf "$file" "$@" ;;
			*.[zZ][iI][pP])
				local file="$1"; shift; zip -r "$file" "$@" ;;
			*.7[zZ])
				local file="$1"; shift; 7z a -r "$file" "$@" ;;
			*.[xX][zZ])
				local file="$1"; shift; tar Jcvf "$file" "$@" ;;
			*)    echo "don't know how to compact '$i' ..." ;;
		esac
	else
		echo "Insufficient arguments."
		fi ; }

	extract() {
		# agradeça esta função ao J.F.Mitre
		# http://jfmitre.com/2010/11/descompactando-arquivos-no-terminal-do.html
		for i in "$@";  do
			if [ -f "$i" ]; then
				case "$i" in
					*.[tT][aA][rR].[bB][zZ]|*.[tT][bB][zZ])   tar xjvf "$i" ;;
					*.[tT][aA][rR].[bB][zZ]2|*.[tT][bB][zZ]2) tar xjvf "$i" ;;
					*.[tT][aA][rR].[gG][zZ]|*.[tT][gG][zZ])   tar xzvf "$i" ;;
					*.[gG][tT][gG][zZ])                       tar xzvf "$i" ;;
					*.[bB][zZ]2)                              bunzip2 "$i" ;;
					*.[rR][aA][rR])                           rar x -o+ "$i" ;;
					*.[gG][zZ])                               gunzip "$i" ;;
					*.[tT][aA][rR])                           tar xvf "$i" ;;
					*.[zZ][iI][pP])                           unzip -o "$i" ;;
					*.Z)                                      uncompress "$i" ;;
					*.7[zZ])                                  7z x "$i" ;;
					*)                                        echo "don't know how to extract '$i' ..." ;;
				esac
			else
				echo "$i is not a valid file"
			fi
		done
	}

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
	. /etc/bash_completion
fi

# Evita histórico com linhas duplicadas
export HISTCONTROL=ignoredups

# configuração do path
if [ -d /usr/local/texlive/2013/bin/i386-linux ] ; then
	PATH=/usr/local/texlive/2013/bin/i386-linux:$PATH
	PATH=/usr/local/texlive/2013/texmf-dist/doc/man:$PATH
fi

[ -d $PREFIX/bin ] && PATH=$PREFIX/bin:$PATH

# para chamar o pythonrc
PYTHONSTARTUP="$HOME/.pythonstartup"
export PYTHONSTARTUP

shell () {
	ps | grep `echo $$` | awk '{ print $4 }'
}

groove-dl-cli(){ python2.7 /usr/share/groove-dl/groove.py "$@" ;}

up () {
	# Created at: 2012/06/19 10:37:26
	# Go up directory tree X number of directories
	# source: http://orangesplotch.com/bash-going-up/
	# see explanation at link above, worth!
	# I found this here: http://askubuntu.com/questions/110922/climb-up-the-directory-tree-faster
	# put this function to your ~/.bashrc
	# binding this function to key see below
	# http://stackoverflow.com/questions/4200800/in-bash-how-do-i-bind-a-function-key-to-a-command

	COUNTER="$@";
	# default $COUNTER to 1 if it isn't already set
	if [[ -z $COUNTER ]]; then
		COUNTER=1
	fi
	# make sure $COUNTER is a number
	if [ $COUNTER -eq $COUNTER 2> /dev/null ]; then
		nwd=`pwd` # Set new working directory (nwd) to current directory
		# Loop $nwd up directory tree one at a time
		until [[ $COUNTER -lt 1 ]]; do
			nwd=`dirname $nwd`
			let COUNTER-=1
		done
		cd $nwd # change directories to the new working directory
	else
		# print usage and return error
		echo "usage: up [NUMBER]"
		return 1
	fi
}

myip (){
	clear
	echo
	DEV=`awk '/UG/ {print $NF}' <(/sbin/route -n)`
	#DEV=`awk '/eth/ {print $1}' <(netstat -i)` # indentifica o device
	IPLOCAL=`hostname -I`
	MEUIP=`awk '/inet end/ {print $3}' <(/sbin/ifconfig $DEV)`
	IPEXTERNO=`curl --connect-timeout 4 -s sputnick-area.net/ip`
	echo "        IP LOCAL: .....${IPLOCAL:-'off-line'}"
	echo "        NETMASK: ......`awk -F':' '/Mas/ {print $4}' <(/sbin/ifconfig $DEV)`"
	echo "        MAC ADDRESS: ..`awk '/HW/ {print $7}' <(/sbin/ifconfig $DEV)`"
	echo "        ROUTER: .......`awk '/UG/ {print $2}' <(/sbin/route -n)`"
	echo "        IP EXTERNO: ...${IPEXTERNO}"
	echo
	read -sn 1 -p "     Pressione uma tecla para continuar..."
	clear
}

_getdomainnameonly(){
	local f="${1,,}"
	# remove protocol part of hostname
	f="${f#http://}"
	f="${f#https://}"
	f="${f#ftp://}"
	f="${f#scp://}"
	f="${f#scp://}"
	f="${f#sftp://}"
	# remove username and/or username:password part of hostname
	f="${f#*:*@}"
	f="${f#*@}"
	# remove all /foo/xyz.html*
	f=${f%%/*}
	# show domain name only
	echo "$f"
}

ping(){
	local array=( "-n -c 4 -i 0.2 -W1" "$@"  )              # get all args in an array
	local len=${#array[@]}          # find the length of an array
	local host=${array[$len-1]}     # get the last arg
	local args=${array[@]:0:$len-1} # get all args before the last arg in $@ in an array
	#local _ping="/bin/ping"
	local c=$(_getdomainnameonly "$host")
	[ "$t" != "$c" ] && echo "Sending ICMP ECHO_REQUEST to \"$c\"..."
	# pass args and host
	#$_ping $args $c # improving script
	command ping $args $c
}

host(){
	local array=( $@ )
	local len=${#array[@]}
	local host=${array[$len-1]}
	local args=${array[@]:0:$len-1}
	#local _host="/usr/bin/host"
	local c=$(_getdomainnameonly "$host")
	[ "$t" != "$c" ] && echo "Performing DNS lookups for \"$c\"..."
	#$_host $args $c
	command host $args $c
}

export LESS="-P ?c<- .?f%f:Standard input.  ?n:?eEND:?p%pj\%.. .?c%ccol . ?mFile %i of %m  .?xNext\ %x.%t   Press h for help"
man() { # wrapper para o comando 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 "$@"
	}

apt-history () {
case "$1" in
	install)
		cat /var/log/dpkg.log | grep 'install '
		;;
	upgrade|remove)
		cat /var/log/dpkg.log | grep $1
		;;
	rollback)
		cat /var/log/dpkg.log | grep upgrade | \
			grep "$2" -A10000000 | \
			grep "$3" -B10000000 | \
			awk '{print $4"="$5}'
					;;
				*)
					cat /var/log/dpkg.log
					;;
			esac
		}

# set o vim como editor padrão
export EDITOR=vim
export VISUAL=vim

CDPATH=.:..:~:~/docs/img:~/docs:~/bin:~/tmp

export PROMPT_COMMAND="history -a"
export HISTFILESIZE=2000

# desabilitando a biblioteca pango para o firefox
export MOZ_DISABLE_PANGO=1

# http://ubuntuforums.org/archive/index.php/t-80289.html
export FLASH_GTK_LIBRARY=libgtk-x11-2.0.so.0

if [ -d /var/lib/gems/1.8 ]; then
	export PATH=/var/lib/gems/1.8/bin:$PATH
fi

# Instalacao das Funcoes ZZ (www.funcoeszz.net)
#export ZZOFF=""  # desligue funcoes indesejadas
#export ZZPATH="/home/sergio/bin/funcoeszz"  # script
#source "$ZZPATH"

# Instalacao das Funcoes ZZ (www.funcoeszz.net)
#source /usr/bin/funcoeszz
#export ZZPATH=/usr/bin/funcoeszz

if [ -d ~/anaconda ] ; then
	# added by Anaconda 1.8.0 installer
	# "source activate ~/anaconda"
	# http://va.mu/dkRc
	export PATH="/home/sergio/anaconda/bin:$PATH"
fi

# init configuration of fasd tool ##############
# source: https://github.com/clvv/fasd
eval "$(fasd --init auto)"

fasd_cache="$HOME/.fasd-init-bash"
if [ "$(command -v fasd)" -nt "$fasd_cache" -o ! -s "$fasd_cache" ]; then
	fasd --init posix-alias bash-hook bash-ccomp bash-ccomp-install >| "$fasd_cache"
fi

source "$fasd_cache"
unset fasd_cache
# interactive fasd
alias zi="fasd -e cd -i"
alias a='fasd -a'        # any
alias s='fasd -si'       # show / search / select
alias d='fasd -d'        # directory
alias f='fasd -f'        # file
alias sd='fasd -sid'     # interactive directory selection
alias sf='fasd -sif'     # interactive file selection
alias z='fasd_cd -d'     # cd, same functionality as j in autojump
alias zz='fasd_cd -d -i' # cd with interactive selection
#### end configuration of fasd tool ##############

#[ -f ~/.fzf.bash ] && source ~/.fzf.bash
#source ~/.shortcuts
```