# fzf



https://github.com/junegunn/fzf

https://github.com/junegunn/fzf/wiki

https://sim590.github.io/fr/outils/fzf/#extension-de-la-complétion

https://github.com/junegunn/fzf/wiki/examples

https://github.com/junegunn/fzf/blob/master/ADVANCED.md



### Installation:

```bash
$ brew install fzf

# To install useful key bindings and fuzzy completion:
$ $(brew --prefix)/opt/fzf/install
```

##### Syntaxe:

| Token     | Match type                 | Description                          |
| --------- | -------------------------- | ------------------------------------ |
| `sbtrkt`  | fuzzy-match                | Items that match `sbtrkt`            |
| `'wild`   | exact-match (quoted)       | Items that include `wild`            |
| `^music`  | prefix-exact-match         | Items that start with `music`        |
| `.mp3$`   | suffix-exact-match         | Items that end with `.mp3`           |
| `!fire`   | inverse-exact-match        | Items that do not include `fire`     |
| `!^music` | inverse-prefix-exact-match | Items that do not start with `music` |
| `!.mp3$`  | inverse-suffix-exact-match | Items that do not end with `.mp3`    |

Options

    Search mode
    		-e, --exact
              Enable exact-match
    
    		-i     Case-insensitive match (default: smart-case match)
    
    		 +i     Case-sensitive match



### Utilisation 1:

```bash
~/Documents/Scripts_Raspberry master*                                                                             19s 17:46:16
$ find . | fzf
```

puis on entre des mots-clé pour affiner la recherche.

<img src="/Users/bruno/Documents/docs/docs/Linux/fzf2.png" alt="fzf2" style="zoom:50%;" />



### Utilisation 2:

```bash
~/Documents/Scripts_Raspberry master*          
$ nano $(fzf)
```

On filtre: 'led

<img src="/Users/bruno/Documents/docs/docs/Linux/fzf.png" alt="fzf" style="zoom:50%;" />



**Return** ouvre le fichier dans nano.

On peut ouvrir plusieurs fichiers dans nano:

```bash
~/Documents/Scripts_Raspberry master*                                                
$ nano $(fzf -m)
```

puis **Tab** pour sélectionner plusieurs fichiers et **Return** pour les ouvrir.



### Fuzzy completion

Déclencheur: ** puis <Tab>



##### Utilisation 3 (complétion de cd):

```bash
~/Documents/Scripts_Raspberry master*                                                                                 18:00:32
$ cd **
```

Puis **Tab**

<img src="/Users/bruno/Documents/docs/docs/Linux/fzf3.png" alt="fzf3" style="zoom:50%;" />

Puis **Return**

```bash
~/Documents/Scripts_Raspberry master*
$ cd SiriControl/

~/Documents/Scripts_Raspberry/SiriControl master*                             
$
```

La complétion marche aussi avec la <u>commande ssh</u>: les serveurs sont tirés de /etc/hosts et de ssh/config.



### Utilisation 4 (kill):

Taper **kill** puis **Espace** puis **Tab**

```bash
$ kill<espace>
```

<img src="/Users/bruno/Documents/docs/docs/Linux/fzf4.png" alt="fzf4" style="zoom:50%;" />

**Tab** pour sélectionner les process à tuer puis **Return**:

```bash
~/Documents/Scripts_Raspberry/SiriControl master*                                          
$ kill 266 311
```



### Utilisation 5 (complétion de cat):

```bash
~/Documents/Scripts_Raspberry master*                                                       
$ cat **
```

Puis **Tab**

<img src="/Users/bruno/Documents/docs/docs/Linux/fzf5.png" alt="fzf5" style="zoom:100%;" />

Puis **Return**

```bash
~/Documents/Scripts_Raspberry master*                                                       
$ cat pir/pir2.py
```

La complétion marche aussi avec les variables d'environnement.

```bash
$ unset **<Tab>
$ unalias **<Tab>
$ export **<Tab>
```



### Utilisation 6 (complétion de nano):

```bash
~/Documents/Scripts_Raspberry master*                                                      
$ nano /opt/**
```

Puis **Tab**

<img src="/Users/bruno/Documents/docs/docs/Linux/fzf6.png" alt="fzf6" style="zoom:100%;" />

Puis **Return**

```bash
~/Documents/Scripts_Raspberry master*                                                       
$ nano /opt/homebrew/etc/httpd/httpd.conf
```



Lancer la fuzzy recherche dans le répertoire parent:

```bash
~/Documents/Scripts_Raspberry master*                                                      
$ nano ../**
```



### Options:

```bash
fzf --height 40% --layout reverse --info inline --border \
    --preview 'bat --style=numbers --color=always --line-range :500 {}' --preview-window right \
    --color 'fg:#bbccdd,fg+:#ddeeff,bg:#334455,preview-bg:#223344,border:#778899'
```

```bash
# .zshrc

export FZF_ALT_C_OPTS="--preview 'tree -C {} | head -200'"
#export FZF_DEFAULT_COMMAND="find ."
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow'
# --preview "bat --style=numbers --color=always --line-range :500 {}" --preview="head -$LINES {}"
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border'

```





https://bluz71.github.io/2018/11/26/fuzzy-finding-in-bash-with-fzf.html

https://curatedgo.com/r/fzf-is-a-junegunnfzf/index.html

https://thevaluable.dev/practical-guide-fzf-example/

https://pragmaticpineapple.com/four-useful-fzf-tricks-for-your-terminal/

https://reposhub.com/linux/shell-applications/lincheney-fzf-tab-completion.html

 

### Python

#### Activer un venv:

```bash
function activate-venv() {
  local selected_env
  selected_env=$(ls ~/.venv/ | fzf)

  if [ -n "$selected_env" ]; then
    source "$HOME/.venv/$selected_env/bin/activate"
  fi
}
```



### Git

#### Git commit history 

```bash
git log --oneline | fzf --preview 'git show --name-only {1}'
```





### Navigateurs

#### Recherche dans l'historique de Firefox:

```bash
cd ~/Library/Application\ Support/Firefox/Profiles/*.default-release
sqlite3 places.sqlite "SELECT url FROM moz_places" | fzf
```

#### Recherche dans les bookmarks de chrome:

```bash

b() {
     bookmarks_path=~/Library/Application\ Support/Google/Chrome/Default/Bookmarks

     jq_script='
        def ancestors: while(. | length >= 2; del(.[-1,-2]));
        . as $in | paths(.url?) as $key | $in | getpath($key) | {name,url, path: [$key[0:-2] | ancestors as $a | $in | getpath($a) | .name?] | reverse | join("/") } | .path + "/" + .name + "\t" + .url'

    jq -r "$jq_script" < "$bookmarks_path" \
        | sed -E $'s/(.*)\t(.*)/\\1\t\x1b[36m\\2\x1b[m/g' \
        | fzf --ansi \
        | cut -d$'\t' -f2 \
        | xargs open
}
```

#### Recherche dans l'historique de Safari:

```bash
function sbh() {
  local cols sep
  cols=$(( COLUMNS / 3 ))
  sep='{::}'

  cp -f ~/Library/Safari/History.db /tmp/h

  sqlite3 -separator $sep /tmp/h \
    "select substr(id, 1, $cols), url
     from history_items order by visit_count_score desc" |
  awk -F $sep '{printf "%-'$cols's  \x1b[36m%s\x1b[m\n", $1, $2}'  |
  fzf --ansi --multi | sed 's#.*\(https*://\)#\1#' | xargs open
}

fzf-safari-browser-history()
{
  local cols sep
  columns=$(( COLUMNS / 3 ))
  separator='{::}'
  sqlite3 -separator $separator $HOME/Library/Safari/History.db \
          "select distinct substr(title, 1, $columns), url from history_items 
           inner join history_visits on history_items.id = history_visits.history_item
           order by history_visits.visit_time desc;" |
  awk -F $separator '{printf "%-'$columns's  \x1b[36m%s\x1b[m\n", $1, $2}' |
  fzf --ansi --multi | sed 's#.*\(https*://\)#\1#' | xargs open -a safari
}

```



### Terminal

#### Kill process:

```bash
kill -9 $(ps aux | fzf | awk '{print $2}')
```

#### File preview

```bash
fzf --preview 'bat --style=numbers --color=always --line-range :500 {}'
```



```bash
fd . '/opt/homebrew' | fzf --height=90% --reverse --preview 'cat {}' --query '_log'
```



### Docker

```bash
# Select a docker container to start and attach to
function da() {
  local cid
  cid=$(docker ps -a | sed 1d | fzf -1 -q "$1" | awk '{print $1}')

  [ -n "$cid" ] && docker start "$cid" && docker attach "$cid"
}
```

```bash
# Select a running docker container to stop
function ds() {
  local cid
  cid=$(docker ps | sed 1d | fzf -q "$1" | awk '{print $1}')

  [ -n "$cid" ] && docker stop "$cid"
}
```

```bash
# Select a docker container to remove
function drm() {
  local cid
  cid=$(docker ps -a | sed 1d | fzf -q "$1" | awk '{print $1}')

  [ -n "$cid" ] && docker rm "$cid"
}
# Same as above, but allows multi selection:
function drm() {
  docker ps -a | sed 1d | fzf -q "$1" --no-sort -m --tac | awk '{ print $1 }' | xargs -r docker rm
}
```

```bash
# Select a docker image or images to remove
function drmi() {
  docker images | sed 1d | fzf -q "$1" --no-sort -m --tac | awk '{ print $3 }' | xargs -r docker rmi
}
```



### Homebrew Cask

```bash
# Install or open the webpage for the selected application 
# using brew cask search as input source
# and display a info quickview window for the currently marked application 
install() {
    local token
    token=$(brew search --casks "$1" | fzf-tmux --query="$1" +m --preview 'brew info {}')
                    
    if [ "x$token" != "x" ]                                                                
    then             
        echo "(I)nstall or open the (h)omepage of $token"
        read input                             
        if [ $input = "i" ] || [ $input = "I" ]; then    
            brew install --cask $token                   
        fi                                                                                    
        if [ $input = "h" ] || [ $input = "H" ]; then                                         
            brew home $token                     
        fi                                           
    fi                             
}                                              
```



#### fzf-brew

```bash
antigen bundle thirteen37/fzf-brew

fbi: Fuzzy brew install
fbui: Fuzzy brew uninstall
fci: Fuzzy cask install
fcui: Fuzzy cask uninstall
```

https://github.com/thirteen37/fzf-brew?tab=readme-ov-file
