name: inverse layout: true class: center, middle, inverse --- layout: false # Ergonomie Vimiste Vim, Neovim, Doom-Emacs, Kakoune, Helix… 1. [édition modale](#3) 2. [les déplacements](#16) 3. [manipulation de
text-objects](#30)
4.
[one spacebar to rule them all](#35)
5. [navigation dans un projet](#40) 6.
[Vimify all the things ?](#50)
.footnote[:kazé / [@fabi1cazenave](https://github.com/fabi1cazenave)] --- ## Pourquoi Vim ? - disponible partout - utilisable dans un term - **ergonomie redoutable** - “bash as IDE” - nerd factor ([Vim pour les canetons](https://fabi1cazenave.github.io/slides/2017-vim-ducklings/), JdLL 2017) --- template: inverse # Édition modale ![coin-coin-coin](images/duck_attack.jpg) --- ## L’héritage d’`ed` - 1970 : `ed` (Ken Thompson) - 1976 : `ex` (Billy Joy), « extended » `ed` - 1977 : `vi` (Billy Joy), « visual mode » de `ex` - 1988 : `vim` (Bram Moolenaar), « Vi iMproved » - 2015 : Neovim ❤️ --- continued: true Les mécréants : - 2018 : Kakoune
(utilisé depuis ~2012)
- 2021 : Helix --- continued: true Les tricheurs : - Emacs : Viper, Vimpulse, Evil, Doom-Emacs… - Visual Studio : VSCodeVim, vscode-neovim… --- ## Édition modale ? On utilise essentiellement ces quatre modes : -
Esc
**normal** : afficher et manipuler du texte -
v
**visuel** : visualiser une sélection de texte -
i
**insertion** : ajouter (et supprimer) du texte -
:
**commande** : options et commandes complexes
(`ex` reste un mode de Vim, déclenché par
Q
)
En mode *insertion*, Vim se comporte comme un Notepad… mais sans aucun raccourci clavier. Objectif : travailler en mode *normal*. --- ## Mode *visuel* Trois variantes de mode *visuel* pour sélectionner du texte : -
v
= caractère par caractère -
Shift
-
v
= ligne par ligne -
Ctrl
-
v
= sélection rectangulaire … et
Esc
(ou même opérateur) pour revenir au mode *normal*. Nota : Kakoune et Helix ont toujours une sélection active. --- ## Mode *visuel* : actions de base `sélection opérateur` Une fois la sélection effectuée, les opérateurs déclenchent une action : -
d
: delete (couper) -
y
: yank (copier) -
p
: paste (coller) -
c
: change (couper + passer en mode *insertion*) --- ## Mode *normal* Les indispensables : -
u
: undo (annuler) -
.
: répéter la dernière action --- continued: true On peut aussi utiliser les actions sans passer par le mode visuel
(sauf Kakoune / Helix)
: `opérateur portée` -
d
w
:
“delete word”
, effacer le mot -
c
w
:
“change word”
, remplacer le mot -
y
y
: copier la ligne courante -
c
c
: remplacer la ligne courante --- ## Mode *commande* Les indispensables : - `:w` = “write” - `:saveas [nom_de_fichier]` - `:wq` = “write and quit” - `:cq` = “cancel and quit” (+
Enter
pour valider et revenir au mode *normal*) **Démo !** --- ## Édition modale ❤️ - une nécessité dans les années ’70 - un choix d’ergonomie de nos jours --- continued: true
Les mains restent en position dactylo : - ➡ pas de combos type
Ctrl
★
- ➡ pas de déviations ulnaires - ➡ pas de TMS « Emacs pinky »
--- continued: true Pertinent pour éditer du code : - on passe plus de temps à lire qu’à saisir du texte - commandes sémantiques (
d
elete,
p
aste,
c
hange…) --- template: inverse # Les déplacements ![ADM-3A](images/adm-3a-keyboard.jpg) --- ## HJKL : l’héritage Standard ASCII (1963) : -
Ctrl
-
h
= Backspace -
Ctrl
-
j
= Line Feed
Terminal [ADM-3A](https://en.wikipedia.org/wiki/ADM-3A#Legacy) (1976) : -
Ctrl
-
k
= Up -
Ctrl
-
l
= Right -
Ctrl
-
^
= Home -
Ctrl
-
z
= Clear Screen --- ## HJKL ❤️ = commandes **positionnelles** de déplacement : - quasi en homerow (position dactylo) - bien plus efficaces que les flèches ou la souris en mode *normal* Ça fonctionne avec d’autres applications : -
j
k
: gmail, feed.ly, twitter, emacs, screen, less/more/most… -
h
j
k
l
: Awesome, i3 (*ahem*), Ranger, NetHack…
Nota, les GUIs ont aussi des commandes positionnelles :
Ctrl
-
z
x
c
v
(≠ sémantiques)
--- ## JK, vraiment ? TL;PL : oui, avec modération (= sans répétitions) -
/
,
?
: rechercher vers le haut / vers le bas (+
n
,
N
) -
*
,
#
: idem, avec le mot sous le curseur (PRO-TIP !) -
{
,
}
: sauter à la ligne vide précédente / suivante -
g
g
,
G
: sauter en début / fin de fichier `~/.vimrc` ```vim " recherche incrémentale set hlsearch set incsearch ``` --- ## HL, vraiment ? Mouahahahahaha, nope. -
w
,
b
: mot suivant / précédent -
W
,
B
: MOT suivant / précédent
(= délimité par des espaces)
-
e
,
g
e
: fin de mot suivant / précédent -
E
,
g
E
: fin de MOT suivant / précédent
(= délimité par des espaces)
-
^
,
$
: début / fin de ligne --- continued: true **Tip :** corriger mot par mot plutôt que caractère par caractère fait progresser en dactylo, réduisant ainsi les erreurs. --- ## Mieux que WBE ? Pour éviter les répétitions de
w
,
b
,
e
… -
f
×,
F
× : chercher la lettre [×] suivante / précédente -
t
×,
T
× : atteindre la lettre [×] suivante / précédente -
;
,
,
: occurrence suivante / précédente --- continued: true Greffons utiles : - Vim : [EasyMotion](https://github.com/easymotion/vim-easymotion) - Neovim / Kakoune : [Hop.nvim](https://github.com/smoka7/hop.nvim) / [Hop.kak](https://github.com/hadronized/hop.kak) -
sneak, Seek, smalls, improvedft, clever-f, vim-extended-ft, Fanf,ingTastic;, IdeaVim-Sneak, leap.nvim, flash.nvim…
TL;PL :
s
remplace
f
et
t
de façon bidirectionnelle et non limitée à la ligne courante (Vimium-like). --- ## Hopopop, ch’uis perdu. Les indispensables, verticalement : -
j
,
k
: ligne à ligne -
/
,
?
: recherche Les indispensables, horizontalement : -
w
,
b
: mot à mot -
^
,
$
: début / fin de ligne Tous les autres : `:help navigation` --- ## Remapper HJKL ?
(Bépo…)
--- continued: true ![no](images/no.jpg) --- ## Ne PAS remapper HJKL Pourquoi ? - remapper
c
t
s
r
(Bépo) déplace des commandes sémantiques et complique l’apprentissage - les déplacements Vim ne se limitent pas à
h
j
k
l
- seuls
j
k
sont réellement utiles en *homerow* --- continued: true Comment ? - un *layer* pour
←
↓
↑
→
(e.g. [Arsenik](https://github.com/OneDeadKey/arsenik) ou QMK)
➡ disponible pour toutes les applications
- mapper `+`/`-` en
AltGr
-
j
/
k
(e.g. [Ergo‑L](https://ergol.org) ou [Kalamine](https://github.com/OneDeadKey/kalamine))
➡ appliquable aussi aux autres commandes de déplacement
- demain : Kalamine & Arsenik [à 13h](https://pretalx.jdll.org/jdll2024/talk/EWE3LW/), Ergo‑L [à 14h](https://pretalx.jdll.org/jdll2024/talk/QT7JBD/) ! --- ## Objectivité totale (allégorie) ![QWERTY-Lafayette](images/lafayette.jpg) --- template: inverse # Les text-objects ![colvert](images/flying_mallard.jpg) --- ## text-objects : définition `modifieur objet` Modifieur : -
i
,
a
: “in” ou “around” Objet : -
w
,
W
: mot -
s
,
p
: phrase, paragraphe (point / ligne vide) -
b
,
B
: bloc (parenthèses / accolades) -
t
: tag (html/xml) -
[
]
,
{
}
,
(
)
,
'
,
"
… --- ## text-objects : utilisation `opérateur modifieur objet` -
v
a
w
: sélectionne le mot -
d
a
w
: supprime le mot -
d
i
p
: supprime le paragraphe
(*sans* la ligne de séparation) -
d
a
p
: supprime le paragraphe
(*avec* la ligne de séparation) -
c
i
'
: change le contenu d’une chaîne Bonus :
.
pour répéter l’action, encore et derechef. **Démo !** --- ## Greffons Pour ajouter de nouveaux text-objects dans Vim : - [vim-textobj-user](https://github.com/kana/vim-textobj-user) - [targets.vim](https://github.com/wellle/targets.vim) - [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object) Dans Neovim : - [nvim-treesitter-textobjects](https://github.com/nvim-treesitter/nvim-treesitter-textobjects) --- ## Poésie minimaliste > On n’appuie pas sur des raccourcis clavier. > > On discute avec Vim. > > On lui adresse des demandes précises sur quoi effectuer avec quel morceau. > > Tout ceci de manière annulable, répétable, factorisable, partageable ! [@delapouite](https://twitter.com/Delapouite) – auteur de [« Vim en 10 vimutes »](http://delapouite.com/slides/vim-en-10-vimutes/#/vimutes)
(+ Jim Dennis, [“Your problem with Vim is that you don’t grok vi”](https://stackoverflow.com/a/1220118/3001761))
Objectif = « touch-typer » l’édition de code. --- template: inverse # let mapleader=" " ![space](images/space.webp) --- `<leader>` - = touche de préfixe pour nos raccourcis personnels - affectée à
\
par défaut - alternative moderne :
Espace
(Helix, Doom-Emacs, distributions [Neo]Vim…) ```vim let mapleader=" " nnoremap
``` --- continued: true Utilisation : ```vim nmap
w :w
``` --- ## Which key ? `<Leader>` étant une « touche morte », il peut être utile d’afficher les actions disponibles… - Vim : [liuchengxu/vim-which-key](https://github.com/liuchengxu/vim-which-key) - Neovim : [folke/which-key.nvim](https://github.com/folke/which-key.nvim) - Emacs : [justbur/emacs-which-key](https://github.com/justbur/emacs-which-key) - Kakoune, Helix : inclus --- continued: true ➡ on peut alors *cascader* les touches mortes 😎
(N touches sont toujours préférables à un seul combo) **Démo !** --- template: inverse # Navigation Comment passer d’un fichier à un autre ? ![plein de coincoins](images/multi_ducks.webp) --- ## Panneau latéral - ergonomie classique Visual Studio & co - [NERDTree](https://github.com/preservim/nerdtree) (Vim), [Neo-Tree](https://github.com/nvim-neo-tree/neo-tree.nvim) (Neovim) ![NERDTree](images/nerdtree.png) --- ## Panneau latéral ![no](images/no.jpg) --- ## PAS de panneau latéral ! Ce type d’ergonomie se prête mal à Vim : - nécessite beaucoup de déplacements avant d’atteindre l’item
(sauf à utiliser la souris, mais plutôt mourir)
- difficilement compatible avec la notion de fenêtres Vim --- continued: true Alternative : - activer la sélection de fichier à la demande
– soit dans la fenêtre courante
– soit dans une nouvelle fenêtre
– soit dans une fenêtre flottante
- faciliter le passage d’un buffer à l’autre
plutôt que multiplier les fenêtres --- ## [Ranger](https://github.com/ranger/ranger) Un explorateur de fichiers en TUI (Python) - affichage en [colonnes de Miller](https://fr.wikipedia.org/wiki/Colonnes_de_Miller) : parent, courant, prévisu - navigation avec HJKL ❤️ Alternatives asynchrones : - minimaliste : [lf](https://github.com/gokcehan/lf) (Go) - étendue : [Yazi](https://github.com/sxyazi/yazi) (Rust) 🦆 Intégration dans (Neo)Vim via l’API `:term` - alternative facile : [fabi1cazenave/TermOpen.vim](https://github.com/fabi1cazenave/termopen.vim) **Démo !** --- ## Fuzzy-matching = filtrer une liste de chaînes par quelques caractères - implémentation la plus connue : [fzf](https://github.com/junegunn/fzf)
(Go)
- alternatives : [fzy](https://github.com/jhawthorn/fzy)
(C)
, [skim](https://github.com/lotabout/skim)
(Rust)
, [peco](https://github.com/peco/peco)
(Go)
, [pick](https://github.com/mptre/pick)
(C)
, [selecta](https://github.com/garybernhardt/selecta)
(Ruby)
, [icepick](https://github.com/felipesere/icepick)
(Rust)
, [hf](https://github.com/hugows/hf)
(Go)
… - utilisation dans le terminal… ou depuis Vim Greffons pour filtrer des fichiers, buffers, textes… : - Vim : [fzf.vim](https://github.com/junegunn/fzf.vim) - Neovim : [telescope.nvim](https://github.com/nvim-telescope/telescope.nvim) - Helix : inclus --- ## Fuzzy-matching : telescope.nvim Neovim + [kickstart.nvim](https://github.com/nvim-lua/kickstart.nvim) : -
Espace
s
f
: [s]earch [f]iles -
Espace
g
f
: search [g]it [f]iles -
Espace
?
: fichiers récents -
Espace
/
: recherche dans le buffer courant -
Espace
Espace
: buffers ouverts Le greffon indispensable pour Neovim ! ❤️ **Démo !** --- ## Language Server Protocol (LSP) Neovim + [kickstart.nvim](https://github.com/nvim-lua/kickstart.nvim) :
(Telescope + Mason + lsp-config…)
-
g
d
: [g]oto [d]efinition -
g
D
: [g]oto [D]eclaration -
g
r
: [g]oto [r]eferences -
g
i
: [g]oto [i]mplementation -
[
d
/
]
d
: prev / next [d]iagnostic -
Espace
s
d
: [s]earch [d]iagnostics -
Espace
d
s
: [d]ocument [s]ymbols La grosse « nouveauté » avec DAP et TreeSitter.
Indispensable pour les dévs. --- ## Parcimonie Utiliser des buffers plutôt que des fenêtres / onglets : -
Ctrl
-
o
= remonter la pile de sauts -
Ctrl
-
i
= descendre la pile de sauts - `:ls` = liste des buffers ➡ plus idiomatique, plus efficace Neovim + [kickstart.nvim](https://github.com/nvim-lua/kickstart.nvim) : -
Espace
Espace
= liste des buffers ❤️ --- template: inverse # Vimify… ![all the things](images/all_the_things.jpg) --- ## Terminal Fuzzy-matcher : `fzf` ou équivalent (`fzy`, `skim`…) -
Ctrl
-
r
: reverse history search `autojump` ou équivalent (`zoxide`…) : - `j [morceau_de_chemin]` Explorateur de fichiers : - `ranger`, `yazi` Édition modale de la ligne de commande : - soit en activant le mode Vi de bash / zsh - soit en utilisant la commande `fc` --- ## Gestionnaire de fenêtres Gestionnaire de fenêtres en mosaïque : - valeurs sûres : `i3` (XOrg) / `sway` (Wayland) - alternatives : `dwm`, `wmii`, `awesome`, `bspwm`, `hyprland`… Lanceur d’applications : - rustique : `dmenu` - élégant : `rofi` - … ou celui de votre DE actuel ! --- ## Navigateur web Firefox, what else ? 🦊 Vimium : - interface modale, HJKL - navigation façon EasyMotion (
f
) - « Vomnibar » :
o
pen URL, select
T
ab… ➡ les raisons d’utiliser la souris deviennent si rares qu’une émulation QMK suffit amplement ! --- template: inverse # Conclusion Vim, c’est bien.
Neovim, c’est très bien.
La souris, c’est mal. --- ## Conclusion - L’ergonomie Vim résulte d’une évolution « naturelle »
Kakoune et Helix proposent des alternatives modernes
--- continued: true -
j
k
oui,
h
l
bof,
←
↓
↑
→
non
–
déplacements avec
w
b
e
,
f
t
et
{
}
,
/
?
,
*
#
…
–
édition de
text-objects
et non de caractères
--- continued: true - fonctions avancées
–
Espace
en touche `Leader`
–
navigation via fuzzy-matching, LSP,
Ctrl
-
o
--- continued: true - Ranger / LF / Yazi, dmenu / rofi, i3 / Sway, Vimium… --- continued: true ** Atelier tupperVim à 16h ! **
https://tuppervim.org .footnote[:kazé / [@fabi1cazenave](https://github.com/fabi1cazenave)]