bash e no zsh mas tem usuários que podem ter alguns problemas com o zsh (eu mesmo já tive), então resolvi fazer essa dica para implementar funções mais avançadas aos moldes que vemos no zsh.Parte da dica citada acima vai servir de base, então vale uma lida lá antes de tentar essa aqui. Primeiro comece instalado os pacotes:
Após isso, faça backup do seu ~/.bashrc:
Agora abra o seu
~/.bashrc atual, apague o conteúdo e coloque esse aqui (depois de editado, dê um source ~./bashrc):# ~/.bashrc
# =========================
# INTERATIVO
# =========================
case $- in
*i*) ;;
*) return;;
esac
# =========================
# HISTÓRICO
# =========================
HISTCONTROL=ignoreboth
HISTSIZE=10000
HISTFILESIZE=20000
shopt -s histappend
shopt -s checkwinsize
# =========================
# PROMPT
# =========================
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
esac
# =========================
# CORES LS
# =========================
if [ -x /usr/bin/dircolors ]; then
eval "$(dircolors -b)"
alias ls='ls --color=auto'
fi
# =========================
# ALIASES EXTERNOS
# =========================
[ -f ~/.bash_aliases ] && . ~/.bash_aliases
# =========================
# ZOXIDE
# =========================
eval "$(zoxide init bash)"
# =========================
# FZF
# =========================
export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border --info=inline"
[ -f /usr/share/doc/fzf/examples/key-bindings.bash ] && \
source /usr/share/doc/fzf/examples/key-bindings.bash
zi() {
local dir
dir=$(zoxide query -l | fzf --height 40% --layout=reverse --border --preview 'ls -la {}') && cd "$dir"
}
# =========================
# FZF - HISTÓRICO EXATO
# =========================
fzf-history-widget-exact() {
local selected
selected=$(history | tac | sed 's/^[ ]*[0-9]*[ ]*//' | \
FZF_DEFAULT_OPTS="$FZF_DEFAULT_OPTS --exact" fzf)
if [ -n "$selected" ]; then
READLINE_LINE="$selected"
READLINE_POINT=${#READLINE_LINE}
fi
}
# escolha o atalho (recomendado Alt+F)
bind -x '"\ef": fzf-history-widget-exact'Não esqueça que o zoxide precisa "aprender" o seu histórico caso você tenha instalado o recurso agora:
cat ~/.bash_history \
| sed 's/^: [0-9]*:[0-9]*;//' \
| grep -E '^cd ' \
| sed 's/^cd //' \
| while read -r dir; do
dir="${dir/#\~/$HOME}"
[ -d "$dir" ] && zoxide add "$dir"
doneO funcionamento é o mesmo mostrado na dica citada acima. Lembrando que o zoxide é um "cd melhorado com busca" onde você digita parte da pasta que você já entrou e ele mostra uma lista; se a pasta for completa, já entra direto desde que já tenha sido acessada anteriormente. Se digitar só "zi" sem as aspas você cai direto na pesquisa e conforme vai digitando as opções vão diminuindo conforme ficar mais completo o nome de onde você quer ir.
Agora o fzf é um "procurador de histórico" e procura por tudo que você já tenha digitado em termos de comando. No terminal, apertando CTRL+R você vai para uma listagem onde conforme vai digitando a listagem vai diminuindo; chegando onde quer, enter.
Dá até pra combinar palavras:
Agora uma espécie de suggestions, onde você digita parte de um comando inicial e usando as teclas de setas pra cima e pra baixo mostra as opções complementares de comandos já efetuados. Por exemplo, se você digitar sem as aspas "sudo apt-mark" e usar as setas de direção TODAS as entradas de comandos já digitadas e presentes no histórico (~/.bash_history) que tenham a opção de início "sudo apt-mark" aparecerão conforme o uso das setas. Crie o arquivo ~./inputrc:
Coloque dentro:
$include /etc/inputrc
# command history search
"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char
# extended auto-completation with tab
set show-all-if-ambiguous on
set completion-ignore-case on
# colors
set colored-completion-prefix on
set colored-stats on
# misc
set blink-matching-paren on
set mark-symlinked-directories onSalve e feche o arquivo, reinicie a sessão e pronto. Esse recurso não "antecipa" o comando mas é melhor do que ficar procurando com as teclas de setas; e ainda temos o fzf e zoxide que fornece indiretamente essa opção.
O ~/.inputrc é interessante ter pois ele dá cores ao uso do TAB para complementar o comando e para deixar tudo mais completo, no seu ~/.bashrc coloque isso aqui DEPOIS do esac do Interativo:
# enable bash completion in interactive shells
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fiVai ficar assim:
E para evitar que comandos muito curtos (como o z, zi, cd ~/ e tal) entrem no histórico, coloque isso no seu ~/.basrc na parte de histórico, que fica aqui:
# =========================
# HISTÓRICO
# =========================
HISTCONTROL=ignoreboth
HISTSIZE=10000
HISTFILESIZE=20000
shopt -s histappend
shopt -s checkwinsize
export HISTIGNORE="ls:cd ~/*:clear:quit:z*:zi*"Essa linha (de exemplo) vai impedir que linhas começando por:
- ls
- cd ~/
- clear
- quit
- z
- zi
entrem no histórico. Se quiser colocar mais itens é só acrescentar os mesmos, mantendo os itens dentro das aspas e separando-os por dois pontos. E se você quiser limpar o seu histórico com os itens mostrados:
grep -vE '^(ls|cd ~\/|clear|quit)\b' ~/.bash_history > /tmp/bash_history_clean && \
mv /tmp/bash_history_clean ~/.bash_history && \
history -c && \
history -rE outra vez você pode inserir novos itens dentro de:
(ls|cd ~\/|clear|quit)
mantendo a seleção dentro dos parênteses e separados por | (aquele caracter usado com o grep).
Terminal bash quase "profissa"...
