notes·de·pit - Mot-clé - linuxParfois j'apprends à pêcher à des gens qui n'aiment pas le poisson2023-06-13T11:41:09+02:00PiTurn:md5:45526db4e4cfb511098640352c276065Dotclearfzf, fuzzy finder ou comment faire des recherches plus efficaces dans son terminalurn:md5:c0e3e9320d984859824ab4d57524fb6c2021-06-08T17:04:00+02:002021-06-08T16:19:35+02:00PiTMes doigts dans le clavieralternativesdebianlinuxpratique<p><img src="https://blog.namok.be/public/images/divers/2021/98__magnifying_glass____vii_by_salihagir_d2nyby1-fullview.jpg" alt="98__magnifying_glass____vii_by_salihagir_d2nyby1-fullview.jpg, juin 2021" style="margin: 0 auto; display: block;" /></p>
<p><code>fzf</code> pour <em>command line fuzzy finder</em>… qui ne veut rien dire pour moi<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2021/06/08/fzf%2Cfuzzy-finder-ou-comment-faire-des-recherches-plus-efficaces-dans-son-terminal#fn:f1" rel="footnote">1</a></sup> mais
continuez de lire, c'est pratique.</p>
<p><em>First at all</em>, ça s'installe d'un simple coup de <code>apt install fzf</code>.</p>
<p><a href="https://github.com/junegunn/fzf">Sur la page du projet</a>, on peut voir que c'est un <strong>filtre unix</strong> qui
peut utiliser toutes sortes de listes. Pas uniquement une liste de fichiers,
mais aussi l'historique, une liste de processus, de noms de domaines…</p>
<p><code>fzf</code> lit la liste à partir de l'entrée standard <code>STDIN</code> et affiche l'élément sélectionné (ou les éléments sélectionnés) sur la sortie standard (<code>STDOUT</code>).</p>
<pre><code class="language-bash">
find * -type f | fzf [-m]
fzf
</code></pre>
<p>cet exemple envoie la liste de tous les fichiers du répertoire courant (sans les
fichiers cachés) à la commande fzf et la recherche peut commencer. Sans
paramètre la commande <code>fzf</code> a ce comportement par défaut.</p>
<p>Par défaut le recherche est étendue (<em>extended search mode</em>) et se fait en
entrant des mots séparés par des espaces. Certains caractères sont spéciaux et
signifient : <code>^</code> au début de la chaine, <code>$</code> à la fin, <code>!</code> inverse et <code>'</code> pour
<em>exact match</em>.</p>
<p>Par exemple : <code>^music mp3$ 'exact oui !non</code> retourne les éléments
qui commence par « music », se termine par « mp3 », contiennent la chaine
« exact », les lettres de « oui » et pas celles de « non ».</p>
<p><img src="https://blog.namok.be/public/images/divers/2021/fzf/fzf-1.gif" alt="fzf-1.gif, juin 2021" style="margin: 0 auto; display: block;" /></p>
<ul>
<li><code>[Up]</code> et <code>[Down]</code> pour voyager dans la liste ; </li>
<li><code>[Enter]</code> pour sélectionner l'élément ;</li>
<li>l'option <code>-m</code> permet de faire une recherche multiple. La sélection se fait avec la touche <code>[Tab]</code> et la validation avec <code>[Enter]</code> ;</li>
<li>l'option <code>-e</code> (<em>exact match</em>) désactive la recherche étendue.</li>
</ul>
<p>Il est possible de faire une recherche dans l'historique tout aussi facilement</p>
<pre><code class="language-bash">
history | fsf +s --tac
</code></pre>
<ul>
<li><code>+s</code> ne trie pas la liste ;</li>
<li><code>--tac</code> la montre dans l'ordre inverse.</li>
</ul>
<p>Plutôt que d'envoyer sur <em>STDOUT</em> (ce qui n'est pas pratique), il est possible
de rediriger la commande avec un bon vieil <code>xargs</code> :</p>
<p><img src="https://blog.namok.be/public/images/divers/2021/fzf/fzf-2.gif" alt="fzf-2.gif, juin 2021" style="margin: 0 auto; display: block;" /></p>
<p>… ou d'utiliser un sous-shell <code>vim -o $(fzf)</code>.</p>
<p>Plutôt que d'utiliser un sous-shell, il est possible d'utiliser <strong><code>**[Tab]</code></strong> pour lancer <code>fzf</code> à partir d'un répertoire.</p>
<pre><code class="language-bash">
vim /elsewhere/**[Tab]
cd /**[Tab]
</code></pre>
<p><img src="https://blog.namok.be/public/images/divers/2021/fzf/fzf-4.gif" alt="fzf-4.gif, juin 2021" style="margin: 0 auto; display: block;" /></p>
<p>Pour que le lancement de <code>fzf</code> se fasse avec <code>**[Tab]</code>, il faut éduquer bash en ajoutant ceci à son <code>.bashrc</code>.</p>
<pre><code class="language-bash">
source /usr/share/bash-completion/completions/fzf
</code></pre>
<p>La <em>magie des deux étoiles</em> fonctionne également pour une liste d'hôtes accédés en <code>ssh</code> ou pour des identifiants de processus (<em>pid</em>). Essayez:</p>
<pre><code class="language-bash">
ssh [Tab]
ssh **[Tab]
kill -9 [Tab]
</code></pre>
<p>Pour les personnes qui le préfèrent, il existe des touches de raccourcis (<em>key
binding</em>) que l'on peut définir en incluant le fichier d'exemple (ou en écrivant
le sien).</p>
<pre><code class="language-bash">
source /usr/share/doc/fzf/examples/key-bindings.bash
</code></pre>
<p>… par défaut <code>[Ctrl-T]</code> lancera <code>fzf</code>.</p>
<p><code>[Ctrl-r]</code> remplacera la recherche dans l'historique par une recherche dans
l'historique avec <code>fzf</code>. Beaucoup plus facile.</p>
<p><code>[Alt-c]</code> permettra de faire un changement de répertoire (<code>cd</code>) vers le répertoire sélectionné par <code>fzf</code>.</p>
<p>Il est maintenant temps de s'occuper des paramètres que l'on peut passer à la
commande. En voici quelques uns issus de la présentation officielle que je
trouve pratiques.</p>
<ul>
<li><code>--height 50%</code> pour limiter la hauteur de fzf à 50% du terminal ; </li>
<li><code>--multi</code> (<code>-m</code>) en mode multi-sélection ;</li>
<li><code>--inline-info</code> pour gagner une ligne, la recherche et le nombre de fichiers se trouvent sur la même ligne ; </li>
<li><code>--preview cat {}</code> pour afficher une fenêtre de prévisualisation du fichier. La documentation propose un peu mieux avec: </li>
</ul>
<pre><code class="language-bash">
--preview '[[ $(file --mime {}) =~ binary ]] && echo {} is a binary file \
|| cat {} 2>/dev/null | head -300`
</code></pre>
<ul>
<li><code>--preview-window='hidden'</code> qui n'affiche pas la fenêtre de prévisualisation… <em>heu !</em></li>
<li>… <code>--bind='f2:toggle-preview'</code> qui associe à la touche <code>[F2]</code> l'affichage, ou pas, de la prévisualisation ;</li>
</ul>
<p><img src="https://blog.namok.be/public/images/divers/2021/fzf/fzf-5.gif" alt="fzf-5.gif, juin 2021" style="margin: 0 auto; display: block;" /></p>
<ul>
<li><code>--bind='ctrl-a:select-all+accept</code> en combinaison avec <code>--multi</code> bien sûr ;</li>
</ul>
<p>…ce qui peut s'ajouter dans son fichier de configuration <em>bash</em> (ou autre <em>shell</em>):</p>
<pre><code class="language-bash">
export FZF_DEFAULT_OPTS="--height 50% \
--multi \
--inline-info \
--preview '[[ \$(file --mime {}) =~ binary ]] \
&& echo {} is a binary file \
|| bat --color=always --style=plain,changes {} \
2>/dev/null | head -300 ' \
--preview-window='hidden' \
--bind='f2:toggle-preview,ctrl-a:select-all+accept'"
</code></pre>
<p>Si l'on veut une prévisualisation d'un répertoire, cela peut se faire <em>via</em> : </p>
<pre><code class="language-bash">
export FZF_ALT_C_OPTS="--preview 'tree -C {} | head -100'"
</code></pre>
<p>Si vous avez des <em>tips and tricks</em>, n'hésitez pas à les partager…</p>
<p><br/></p>
<p><em>Sources, la <a href="https://github.com/junegunn/fzf">page officielle du projet</a> et la <a href="https://www.youtube.com/watch?v=qgG5Jhi_Els">vidéo associée</a> ainsi que <a href="https://sim590.github.io/fr/outils/fzf/">cet article</a>.</em><br />
<em>Crédit photo <a href="https://www.deviantart.com/salihagir/art/98-Magnifying-Glass-VII-161165305">salihagir</a>.</em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p><a href="https://blog.namok.be/?post/2021/06/08/deepl.com">deepl</a> traduit <em>fuzzy finder</em> par « détecteur de fausses pistes » ou encore « chercheur de flou ». <a href="https://blog.namok.be/?post/2021/06/08/fzf%2Cfuzzy-finder-ou-comment-faire-des-recherches-plus-efficaces-dans-son-terminal#fnref:f1" rev="footnote">↩</a></p>
</li>
</ol>
</div>
tmux à l'usage d'un profurn:md5:f155fb22d2c87d3ed06de5e04a0a573a2020-12-03T14:14:00+01:002020-12-03T20:19:43+01:00PiTMes doigts dans le clavieresiinutilelinuxlogiciellibre<p><img src="https://blog.namok.be/public/images/divers/2020/cadres_by_thoum_d2458vb.jpg" alt="cadres_by_thoum_d2458vb.jpg, déc. 2020" style="margin: 0 auto; display: block;" /></p>
<p><a href="https://github.com/tmux/tmux/wiki"><code>tmux</code></a> est un multiplexer de terminal — oui, ce billet est un tout petit
peu technique — permettant d'ouvrir une session sur une machine et de s'en
détacher en laissant la session ouverte (un peu comme <code>screen</code>).</p>
<p>Dans l'usage quotidien<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2020/12/03/tmux-a-l-usage-d-un-prof#fn:f1" rel="footnote">1</a></sup> de ma machine, j'utilise régulièrement un terminal
et j'ai un répertoire par « activité » : un répertoire pour tel cours, un
répertoire pour telle organisation… Un peu comme tout le monde j'imagine excepté
les personnes qui <em>mettent tout sur le bureau</em> !</p>
<p>Lorsque je me consacre à un cours par exemple, je peux être dans le répertoire
du cours pour trouver un énoncé, dans un autre terminal, être dans le répertoire
pour les corrections… j'utilise donc plusieurs terminaux pour un même cours.
Comme je travaille tantôt sur un cours, tantôt sur un autre cours et que j'ai
plusieurs bureaux virtuels, ça devient vite désorganisé.</p>
<p>Pendant tout un temps, je retenais que le premier bureau, c'est pour tel cours,
le second pour un autre, le cinquième pour les navigateurs internet, le sixième
pour la communication instantanée et mail, etc. Depuis quelques temps,
j'utilise <code>tmux</code> pour les terminaux et je conserve cette habitude de laisser
dans mon bureau virtuel 6 le mail et irc et dans le 5, les navigateurs internet.</p>
<p><code>tmux</code> me permet d'ouvrir une session par cours. Dans cette session, je peux
ouvrir plusieurs terminaux. Les intérêts de <code>tmux</code> sont pour moi :</p>
<ul>
<li>la possibilité de pouvoir me détacher et attacher une session. Ce qui me
permet de ne plus être lié à un bureau virtuel pour une activité ;</li>
<li>la possibilité de <em>découper</em> ma fenêtre en plusieurs ;</li>
<li>…</li>
</ul>
<p>Bref, voici mon aide-mémoire de commandes.</p>
<p><code>tmux</code> lance une session (numérotée) mais c'est mieux de directement la nommer
avec l'option <code>-t</code> :</p>
<pre><code class="language-">
tmux new -t <name>
</code></pre>
<p>Pour lister les sessions existantes :</p>
<pre><code class="language-">
tmux ls
</code></pre>
<p>Pour rejoindre — s'attacher à — une session existante :</p>
<pre><code class="language-bash">
tmux a [-t <name>]
tmux a [-t <number>]
</code></pre>
<p>Pour tuer toutes les sessions <code>tmux</code>, il suffit de tuer le serveur. Il est aussi
possible de n'en tuer qu'une par son nom ou son numéro :</p>
<pre><code class="language-">
tmux kill-server
tmux kill-session -t <name>
tmux kill-session -t <number>
</code></pre>
<p>Dès lors que l'on se trouve dans une session <code>tmux</code>, un préfixe défini permet de
lancer une commande. <code>Ctrl-b</code> est le préfixe par défaut. Dans la suite, <em>prefix</em>
signifie chez moi <code>Ctrl-b</code>. Vous pourrez le redéfinir mais pour moi — en bépo —
c'est accessible.</p>
<ul>
<li><em>prefix</em> <code>d</code> se détache de la session courante ;</li>
<li><em>prefix</em> <code>:</code> permet d'écrire une commande <em>tmux</em> ;</li>
<li><em>prefix</em> <code>$</code> (re)nomme la session courante ;</li>
<li><em>prefix</em> <code>)</code> passe une autre session (la suivante « à droite ») ;</li>
<li><em>prefix</em> <code>(</code> passe une autre session (la suivante « à gauche ») ;</li>
<li><em>prefix</em> <code>s</code> liste les sessions (comme <code>tmux ls</code> mais en étant attaché) et
permet de passer d'une session à l'autre ;</li>
</ul>
<h3>Fenêtre</h3>
<p>Une session <code>tmux</code> se compose d'une ou plusieurs fenêtres. Une fenêtre occupe
tout l'écran du terminal.</p>
<ul>
<li><em>prefix</em> <code>,</code> renommer la fenêtre ;</li>
<li><em>prefix</em> <code>c</code> créer une nouvelle fenêtre ;</li>
<li><em>prefix</em> <code>n</code> aller à la fenêtre suivante ;</li>
<li><em>prefix</em> <em>X</em> aller à la fenêtre <em>X</em> ;</li>
<li><em>prefix</em> <code>w</code> liste les fenêtres et permet de les parcourir et d'en choisir
une ;</li>
<li><em>prefix</em> <code>esperluette</code> supprime la fenêtre courante (et tous ses panels) ;</li>
</ul>
<h3>Panels</h3>
<p>Une fenêtre peut être découpée en <em>morceaux</em> / carrés / <em>panels</em>.</p>
<ul>
<li><em>prefix</em> <code>%</code> scinde le panel en deux verticalement ;</li>
<li><em>prefix</em> <code>=</code> scinde le panel en deux horizontalement (par défaut c'est <code>"</code>
mais j'ai changé) ;</li>
<li><em>prefix</em> <em>flèche</em> passe d'un panel à l'autre dans la direction de la flèche ;</li>
<li><em>prefix</em> <code>Ctrl-</code><em>flèche</em> redimensionne le panel courant dans le sens de la
flèche ;</li>
<li><em>prefix</em> <code>o</code> échange les panels ;</li>
<li><em>prefix</em> <code>;</code> retourne au dernier panel ;</li>
<li><em>prefix</em> <code>x</code> supprime le panel courant</li>
</ul>
<p>Il est possible d'exécuter les mêmes actions dans tous les panels en même temps.
Pour ce faire, entrer la commande <code>:setw synchronize-panes on</code> (et <code>off</code> quand
c'est terminé).</p>
<p>Ensuite, on s'amuse à écrire un fichier de configuration en fonction des
habitudes que l'on a. Le <a href="https://github.com/Pinkilla/dotfiles">mien se trouve là</a>.</p>
<ul>
<li>quand je ferme un <em>pane</em> ou une fenêtre, je n'ai pas besoin de confirmer ;</li>
</ul>
<pre><code class="language-">
# kill pane without confirm
bind-key x kill-pane
# new window in some directory
bind-key c new-window -c "#{pane_current_path}"
</code></pre>
<ul>
<li>je redéfinis le <em>split</em> horizontal en demandant d'ouvrir le nouveau panel dans
le répertoire courant ;</li>
</ul>
<pre><code class="language-">
# split window verticaly and horizontaly
bind-key = split-window -v -c "#{pane_current_path}"
bind-key % split-window -h -c "#{pane_current_path}"
</code></pre>
<ul>
<li>j'augmente la taille du buffer pour l'historique ;</li>
</ul>
<pre><code class="language-">
# big history (default is 2000)
set -g history-limit 5000
</code></pre>
<p>Voilà, pour le reste, nous verrons à l'usage…</p>
<p><br/></p>
<p><em>Crédit photo chez DeviantArt par <a href="https://www.deviantart.com/thoum/art/Cadres-127895591">Thoum</a></em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p>Je sais que le mot est un peu tombé en désuétude au profit de
<em>journalier</em>… que je trouve beaucoup moins joli. Oui les mots peuvent être
beaux. <a href="https://blog.namok.be/?post/2020/12/03/tmux-a-l-usage-d-un-prof#fnref:f1" rev="footnote">↩</a></p>
</li>
</ol>
</div>
Colorer son lessurn:md5:778e3f0618701d914e31b7a609cd31f92018-09-21T08:12:00+02:002019-04-01T19:59:00+02:00PiTMes doigts dans le clavierdebianlinux<p><img src="https://blog.namok.be/public/images/divers/2018/less.png" alt="less.png" style="margin: 0 auto; display: block;" title="less.png, sept. 2018" /></p>
<p>Ce matin, je faisais une recherche dans une page de <code>man</code> et je ne voyais pas le
mot cherché. Ma page de manuel était blanche sur noir. Triste. Ajoutons des
couleurs.</p>
<p>Pour info, lorsque l'on consulte une page de manuel, linux lance un <em>pager</em> par
défaut. Ce programme permet de visualiser un fichier <em>page par page</em>
(<em>page par page</em>, <em>pager</em>, tu l'as ?) et y faire des recherches. Les principaux
sont: <em>less</em>, <em>more</em> et <em>most</em>. Par défaut, c'est souvent <em>less</em> qui est
installé.</p>
<p>La première manière de colorer ses pages de manuel est d'utiliser un pager qui
gère les couleurs. Lapalissade. <em>most</em> est coloré par défaut, il s'active en
ajoutant dans son <code>.bashrc</code>.</p>
<pre><code class="language-bash">
export PAGER=most
</code></pre>
<p>Si, par contre, vous avez l'habitude avec <em>less</em> et que vous ne voulez pas
changer, vous pouvez lui apprendre les couleurs et ajouter dans votre <code>.bashrc</code>
(la première ligne le configure un peu différemment. <code>man less</code> pour la
signification des options):</p>
<pre><code class="language-bash">
export LESS='-F -X -i -J -m -R -W -n -x4 -z-6'
export LESS_TERMCAP_mb=$'\E[1;31m' # begin bold
export LESS_TERMCAP_md=$'\E[1;36m' # begin blink
export LESS_TERMCAP_me=$'\E[0m' # reset bold/blink
export LESS_TERMCAP_so=$'\E[1;47m' # begin reverse video
export LESS_TERMCAP_se=$'\E[0m' # reset reverse video
export LESS_TERMCAP_us=$'\E[1;32m' # begin underline
export LESS_TERMCAP_ue=$'\E[0m' # reset underline
export PAGER=less
</code></pre>
<p>Cette configuration se trouve facilement sur le net, j'ai par contre choisis du
<em>blanc gras</em> sur <em>gris</em> pour le <em>reverse</em> afin de bien voir les mots cherchés.</p>
<p>Enjoy</p>