name: inverse layout: true class: center, middle, inverse --- layout: false # Navigation Vim :
la vie après HJKL Vim, Neovim, Doom-Emacs, Kakoune, Helix… 1. [les déplacements](#7) 2. [les dispositions optimisées](#16) 3. [manipulation de
text-objects](#27)
5. [navigation dans un projet](#32) .footnote[:kazé / [@fabi1cazenave](https://github.com/fabi1cazenave)] --- ## Prérequis : édition modale --- continued: true -
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 --- continued: true On passe l’essentiel du temps en mode *normal* : - organisation, reformatage… - **déplacements** dans un document - **navigation** dans une base de code --- ## Prérequis : flèches, souris --- continued: true  --- template: inverse # Les déplacements  --- ## 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, Xitter, emacs, screen, less/more/most… -
h
j
k
l
: i3/Sway (*ahem*), Niri, Ranger/Yazi, 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)
Fanf,ingTastic;, sneak, improvedft, clever-f, vim-extended-ft…
- Neovim : [flash](https://github.com/folke/flash.nvim), [leap](https://github.com/ggandor/leap.nvim) - Kakoune : [Hop.kak](https://github.com/hadronized/hop.kak) TL;PL :
s
remplace
f
et
t
de façon bidirectionnelle et non limitée à la ligne courante (Vimium-like). --- ## 8 mouvements indispensables 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` --- template: inverse # HJKL et dispos optimisées  Dvorak, Bépo, Ergol… --- ## Dispositions optimisées - Dvorak (1936), [Bépo](https://bepo.fr)… - contexte = machines à écrire + optimisation naïve - ⇒ favoriser l’alternance des mains - Colemak (2006), Workman, [Ergol](https://ergol.org)… - contexte = claviers informatique + optimisation poussée - ⇒ favoriser les roulements et enchaînements - ⇒ préserver les raccourcis usuels
(copier, coller…)
--- continued: true Problème : - aucune ne préserve un pavé
h
j
k
l
-
j
et
k
sont deux des quatre lettres les plus rares
en français et en anglais --- ## Remapper HJKL  --- ## Remapper HJKL  --- ## Ne PAS remapper HJKL ! Pourquoi ? - remapper
c
t
s
r
(Bépo) ou
l
r
t
i
(Ergol) déplace des commandes **sémantiques** - les déplacements Vim ne se limitent pas à
h
j
k
l
- seuls
j
k
sont réellement utiles en *homerow* --- continued: true Constat après ~15 ans d’ateliers Vim : - remapper ralentit fortement l’apprentissage - beaucoup de vimistes
(et quasi tous les Bépoètes…)
sont limités aux déplacements case-à-case --- ## Alternative : layer de navigation  - [Kanata](https://github.com/jtroo/kanata) + [Arsenik](https://github.com/OneDeadKey/arsenik)/Selenium côté PC (software) - QMK / ZMK / Keyberon côté clavier (firmware) - ➔ disponible pour toutes les applications - ➔ recommandé *aussi* en Qwerty / Azerty --- ## Alternative : disposition *ergonomique*  - [Ergol](https://ergol.org) a `+`/`-` en
AltGr
-
[j]
/
[k]
= quasi-équivalent à
j
k
+ commandes de déplacements en
AltGr
+ main gauche
- Bépolar = adaptation de Bépo avec le
AltGr
d’Ergol - on peut utiliser [Kalamine](https://github.com/OneDeadKey/kalamine) pour modifier sa dispo --- ## Mappings utiles Pour les dispos optimisées : - Ergol, Bépo : inverser
,
et
;
- Ergol : mapper
+
et
-
sur
gj
et
gk
. - Bépo : mapper
é
sur
w
. Dans le cas général : - mapper
U
sur
Ctrl
-
r
- mapper
Backspace
sur
Ctrl
-
w
en mode insertion --- ## Témoignage > Après une semaine de test y a pas photo : ne pas utiliser
h
et
l
c’est le pied ! > > Le fait de ne pas remapper les touches par défaut en Ergo‑L est LE *game changer* : > ça facilite énormément l’apprentissage sans avoir à se dire « ah mais ce truc, > ça se fait comment avec mes mappings ? ». > > J’ai plus progressé en Vim en quelques jours grâce à ça qu’en quelques années > avec mes mappings Bépo hasardeux. — [Vincent Jousse](https://ergol.org/articles/vim_pour_les_ergonautes/vjousse), auteur de [Vim pour les humains](https://vimebook.com/fr) --- template: inverse # Les text-objects  --- ## 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 # Navigation projet  Comment passer d’un fichier à un autre ? --- ## 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)  --- ## Panneau latéral  --- ## 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. --- ## Pile de sauts Utiliser des buffers plutôt que des fenêtres / onglets
permet de profiter de la pile de sauts : -
Ctrl
-
o
= remonter la pile de sauts -
Ctrl
-
i
= descendre la pile de sauts
(tip Ergol: mapper
Ctrl
-
c
sur
Ctrl
-
i
)
- `:ls` = liste des buffers ➡ plus idiomatique, plus efficace --- template: inverse # Conclusion  --- ## Navigation Vim --- continued: true -
j
k
oui,
h
l
bof,
←
↓
↑
→
non
–
déplacements verticaux avec
{
}
,
/
?
,
*
#
…
–
déplacements horizontaux avec
w
b
e
,
^
$
,
f
F
t
T
,
;
…
–
édition de
text-objects
et non de caractères
–
layer de navigation sur
Espace
avec [Kanata](https://github.com/jtroo/kanata) + [Arsenik](https://github.com/OneDeadKey/arsenik)
--- continued: true - fonctions avancées
–
une seule fenêtre, plein de buffers
(et pas de panneau latéral…)
–
sélection via fuzzy-matching
–
navigation via LSP ❤️
–
pile de sauts :
Ctrl
-
o
et
Ctrl
-
i
❤️❤️
--- continued: true - on ne remappe pas les commandes sémantiques ! --- continued: true ** Happy vimming ! **
https://tuppervim.org .footnote[:kazé / [@fabi1cazenave](https://github.com/fabi1cazenave)]