| since | 2023-09-02 |
|---|---|
| tags | editor, outils |
L’éditeur Helix est une variante de Kakoune implémenté en Rust. Bien que relativement récent, le logiciel présente des fonctionnalités très complètes et comparables à Vim avec le bénéfice de l’utilisation de primitives logiques pour travailler sur le texte. La cohérence des séquences de commandes et les retours visuels offerts par l’interface facilitent beaucoup la prise en main de l’éditeur qui constitue une très bonne option de départ lorsqu’il s’agit d’adopter un éditeur en ligne de commande.
Sur Mac, le logiciel est distribué sous la forme d’une image disque ou bien par le gestionnaire de paquets Brew :
brew install helixAprès avoir installé le logiciel, il est possible de le déclarer comme éditeur par défaut pour Git dans le fichier de configuration de Git en ajoutant la ligne la variable core suivante :
# ~/.gitconfig
[core]
editor = hxAprès installation, Helix s’exécute avec la commande hx
hxDocumentation : https://docs.helix-editor.com
Un tutoriel est installé avec le logiciel. On y accède de la manière suivante :
hx --tutorou bien en exécutant dans l’éditeur la commande :tutor
À tout moment, vous pouvez accéder à de l’aide, depuis le mode normal, en tappant : <SPACE>?.
Pour réviser, il existe un quiz Helix Shortcut Quiz
Avec Mac, vous pourriez rencontrer des difficultés pour les combinaisons utilisant la touche Alt. cf. https://docs.helix-editor.com/remapping.html voir également helix-editor/helix#2469
Sur MacOS et Linux, on fait pointer la variable d’environnement du terminal vers les fichiers runtime
# ~/.bashrc ou ~/.zprofile
HELIX_RUNTIME=/home/user-name/src/helix/runtimeou alors on créée un lien symbolique dans ~/.config/helix qui lie vers le répertoire source
ln -s $PWD/runtime ~/.config/helix/runtimeHelix propose de riches fonctionnalités pour utiliser des serveurs LSP.
Installation des langages https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers
Voir la liste par défaut des serveurs de langages
hx --healthÀ l’instar d’autres éditeurs en ligne de commande (Vim notamment), Helix propose une interface de travail qui repose sur l’utilisation de modes. Ce fonctionnement peut être déroutant pour le nouvel utilisateur, mais s’avère très productif à l’usage.
Dans un éditeur multimodal, les touches on des effets différents selon le mode sélectionné : par exemple en mode insertion la pluspart des touches insèrent des caractères dans le buffer, mais en mode normal les touches auront un effet différent. Par exemple w pourra déplacer le curseur à la fin du mot, y (yank) permettra de copier la sélection, p (paste) de coller, u (undo) d’annuler une opération, ou encore la combinaison de touche g suivie de f permettra d’ouvrir le nom de fichier sous le curseur.
Les éditeurs qui ne proposent pas de modes privilégient l’insertion afin de faciliter la saisie du texte. Toutefois, ce choix est effectué au détriment d’autres fonctionnalités qui deviennent sous-optimales parceque difficiles d’accès au clavier ou qu’elles vous obligent à utiliser la souris ou le trackpad. Bien sûr, l’insertion doit être optimisée mais l’édition de documents nécessite également de nombreux aller-retour à travers le texte ou le code, de multiples opérations de copier-coller ou de reformatage. Un éditeur de texte modal rend alors ces différentes opérations plus accessibles et plus simples à exprimer.
Le fonctionnement d’Helix s’inspire directement du modèle proposé par Maxime Coste pour Kakoune. Il reprend l’idée de Vim d’envisager l’édition modale comme un véritable langage d’édition. Les commandes sont composables de manière à exprimer des opérations complexes dans un langage qui permet à l’éditeur d’exprimer ses intentions de manière précise. Cette propriété est souhaitble car la pluspart des opérations d’édition sont répétitives. Pouvoir exprimer structurellement ces opérations permet de définir non-seulement des commandes réutilisables mais aussi plus facilement mémorisables.
La grammaire d’Helix repose sur des ==sélections suivies de verbes== en les combinant avec des retours contextuels dynamiques qui permettent de visualiser l’objet courant (la sélection) avant d’y appliquer des changements ce qui permet de corriger les erreurs éventuelles.
Dans Helix, le mode par défaut est le mode normal NOR. En mode normal, on peut accéder à de l’aide sur les fonctionnalités possibles en tappant la touche <Espace>.
Depuis le mode normal, on accède au mode de commande en tappant :. L’interface propose alors plusieurs options possibles. Un des atouts de l’éditeurs est d’intégrer une aide contextuelle qui facilite la mémorisation des commandes.
Pour quitter le document, tapper :quit ou :q.
Si des modifications ont été effectuées au document, il est possible de renoncer aux changements en tappant :quit! ou :q!.
On peut enregistrer un document avec les commandes :write ou :w. Il est possible de combiner les commandes :write-quit ou :wq
Pour quitter sans entrer de commande, tapper la touche Escape pour revenir au mode normal NOR.
L’édition d’un document se fait en mode insertion INS. On y accède depuis le mode normal en tappant i.
Liste des modes mineurs
:command mode pour enter des commandesvselect (extend) mode pour faire des sélections complèxesmmatch mode pour sélectionner et éditer du texte sémantiquementzview mode pour modifier la vueZsticky view mode pour visualiser un documentggoto mode pour se déplacer rapidement<Ctrl>-wwindow mode pour modifier les fenêtres<Espace>space mode pour réaliser diverses actions
Accéder à de l’aide. L’interface d’Helix propose une aide dynamique mais il est également possible d’accéder à de l’aide en tappant : space + ?. Outre une recherche floue, il est possible de rechercher des raccourcis avec %bindings.
Les touches h j k l servent à se déplacer dans l’éditeur. Il est toutefois également possible d’utiliser les flêches sur le clavier.
Helix propose une série de commandes inspirées de Kakoune qui sont destinées à faciliter le déplacement ou la manipulation de texte dans un document. Ces sélections multiples sont le moyen d’interagir avec l’éditeur grâce à des primitives de manipulation puissantes.
Ces instructions peuvent être combinées entre elles dans des expressions complexes avec des expressions régulières.
wdéplace le curseur avant le début du prochain mot (word)edéplace le curseur à la fin du mot (end)bdéplace le curseur en arrière au début du mot (before)W,E, etBdéplace le curseur de la même manière mais ne considère que les chaînes de caractères séparées par des espaces en ignorant les tirets et les guillemets.
Le mode mineur goto mode permet de naviguer rapidement dans un document
gealler à la fin du documentghaller au début de la ligneglaller à la fin de la lignegsse rendre au premier caractère non-blanc d’une ligneg.aller aux dernières modifications
Les touches [ et ] combinées avec certaines lettres permettent de se déplacer d’un élément similaire à l’autre (paragraphe précédent ou suivant p, fonction précédente ou suivante f, commentaire précédent ou suivant c, diagnostic d etc.).
La touche m donne également accès à une série d’options pour naviguer autour d’une ressource. Par exemple maf sélectionne une fonction.
Le mode « espace » accessible avec la touche <espace> permet de faire des recherches dans les fichiers du répertoire (F) ou de naviguer à l’intérieur du fichier de travail grâce à des symboles (s).
L’édition d’un document s’opère habituellement dans le mode insertion INS. Depuis le mode normal, tapper i pour entrer en mode insertion. La ligne d’information en bas de l’écran affiche désormais INS.
D’autres commandes d’insertion permettent de passer en mode insertion :
iinsérer un caractère avant la sélection (insert)ainsérer un caractère après la sélection (append)Iinsérer au début de la ligneAinsérer à la fin de la ligneoouvrir une nouvelle ligne à la fin de la ligne sélectionnée (open)Òouvrir une nouvelle ligne avant la ligne sélectionnée
Suppressions et remplacements
dsupprime le caractère au niveau du curseur ou la sélection (delete)cremplace le caractère au niveau du curseur ou la sélection (change)wdefface un mot (word, delete)wcchange un mot ou la fin d’un mot (word, change)ecchange la fin d’un mod (end, change)
Commenter
<Ctrl>-ccommenter ou décommenter la ligne
Autocompléter
<Ctrl>-xautocompléter
Les commandes de déplacement peuvent être précédées par des quantificateurs.
2wdéplace le curseur de deux caractères en avant3edéplace vers la fin du troisième mot en avant.2bdéplace le curseur deux mots en arrière.
ll est également possible de se déplacer jusqu’à l’apparition d’un caractère (contrairement à Vim, cela n’est pas cantonné à la ligne courante)
ttrouver jusqu’au prochain caractère,vtrouver le prochain caractèreTtrouver jusqu’au précédent caractère,Vtrouver le précédent caractère
Il existe un mode de sélection auquel on accès en tappant v (view). Pour revenir en mode normal tapper v une nouvelle fois.
En mode sélection, tous les déplacements étendent la sélection.
xsélectionne la ligne du curseur2xsélectionne deux lignesvgldout<Entrée>deffacer la fin de la ligne.vest utilisé avecglcar cette dernière commande ne sélectionne par le texte.t(til) la nouvelle ligne est représentée par la touche<Entrée>.;permet d’abandonner la sélection.;deffacer après avoir réduit la sélection à un seul caractère
Sélections et déplacements
%sélectionne l’ensemble du fichier_retire les espaces de la sélectionmmse déplacer à l’élément correspondant (guillemets, crochets, etc.)msentourer la sélection par... Par exemple pour entourer un mot par un caractère,ebms
This gets fancier with Treesitter features: Take some arbitrary Rust file. Press %, then s, then type ^fn, and you selected the fn keyword in every top-level function. Now press Alt+o, to extend the selection to the surrounding syntactic element, i.e. the entire function.
voir les exemples https://herecomesthemoon.net/2025/06/i-like-helix/
upermet d’annuler la dernière action (undo)Urefait la dernière action (redo)
Les commandes peuvent être utilisées plusieurs fois de suite.
-
ycopier la sélection (yarn) -
pcolle la sélection après le curseur (paste) -
xycopier une ligne
Dès lors que du texte est supprimé (d) ou modifié (c), Helix copie le contenu altéré. On peut empêcher ce comportement avec <Alt>-d et <Alt>-c.
Tip
Sur MacOS, la touche Alt n’existe pas par défaut dans votre terminal. Il faut activer son replacement dans les préférences du terminal.
Helix ne partage pas son presse-papier (clipboard) avec le système. Néanmoins il est possible avec <Espace> + y de copier dans le presse-papier du système pour réutiliser la sélection dans une autre application.
-
/recherche en avant dans un fichier, après avoir tappé la chaîne recherchée confirmer avec entrée -
naccède au résultat suivant (next) -
Naccède au résultat précédent -
?réalise une recherche en arrière -
spermet de faire une sélection au sein de la sélection (tapper la recherche dans le prompt) -
sfoo<RETURN>cbar<ESC>,remplace foo par bar en avant dan le fichier
La recherche permet aussi l’utilisation d’expressions régulières.
Remplacements multiples
%ssélectionne tout le buffer et ouvre une recherche dans la Psélection, saisir la recherche ou la regex, valider avec la touche ENTER, puiscpour saisir la chaîne de remplacement. Quitter la sélection multiple avec,.
Chercher le mot sous le curseur
<Alt>-o*n(s’il y un LSP) oube*n. Lorsqu’il y a un LSP,<Alt>-oétend la sélection au nœud parent dans la syntaxe, puis*utlise la sélection comme motif de recherche,nva à la prochaine occurence.bsélectionne le début du mot,esélectionne la fin du mot.i
Primitives de sélection
- il est possible d’utiliser
sde manière répétée kpermet de restreindre la sélection à un motif défini par une expression régulière, ou<Alt+k>pour retirer celles contenant un motif donné.
Cduplique le curseur à la ligne suivante pour éditer deux lignes simultanéemenet<Alt>-Cfait la même chose au dessus du curseur,supprime le deuxième curseur
Il n’y a pas de sélection de bloc avec Helix. Il est possible d’étendre la sélection au dessous avec les mouvements standards et les curseurs multiples C.
Il est possible de rechercher et remplacer sur l’ensemble du document en utilisant les curseurs multiples avec une composition de commandes : 1° sélectionner tout le document avec %, 2° passer en mode sélection avec s, 3° tapper le mot auquel vous souhaitez restreindre la sélection dans le fichier, 4° tapper c pour placer un curseur à toute la sélection, 5° éditer toutes les instances en même temps.
:sh
Il n’y a pas de marque-page nommés dans Helix, mais il est possible de mémoriser une localisation dans la liste de rebond (jumplist) avec <Ctrl>-s puis de revenir à cette localisation en ouvrant la liste avec <Espace>-j ou de revenir en arrière dans la liste avec Ctrl-o et en avant avec <Ctrl>-i.
Il existe un gestionnaire de fichiers rudimentaire accessible en ouvrant Helix depuis un chemin de répertoire dans le terminal. Il est possible de chercher ou parcourir les fichiers.
Depuis n’importe quel éditeur, il est également possible de parcourir le répertoire avec <Espace>-f.
<Ctrl>-V permet d’ouvrir le fichier sélectionné dans une division verticale. <Ctrl>-wq ferme le split.
Symbols picker basé sur LSP <Espace>-s.
Commenter une sélection <Ctrl>-c.
Voir la documentation https://docs.helix-editor.com/configuration.html
La lecture ou l’édition de textes longs, réclame souvent un mécanisme de coulée du texte pour éviter les longs lignes (soft-wrap). Depuis mars 2023, il est possible d’activer cette fonctionnalité dans la configuration.
# ~/.config/helix/config.toml
[editor.soft-wrap]
enable = trueInstallation de modes d’autocomplétion, et de formatage.
hx -health # connaître la liste des langages disponiblesIl est possible d’ajouter des serveurs de langages.
Pour savoir quels LSP sont nécessaires pour un langage
hx -health markdownInstaller Marksman pour la prise en charge de Markdown
# For Terraform (HCL), Bash, Generic YAML,
# Docker, Docker compose and Ansible
brew install terraform-ls bash-language-server \
yaml-language-server docker-ls \
ansible-language-server
# For HTML, json, css, javascript and typescript
npm i -g vscode-langservers-extracted typescript typescript-language-server
# Go official language server
go install golang.org/x/tools/gopls@latestPar défaut le navigateur de fichiers ne permet pas de chercher le contenu des documents mais seulement leur nom. L’ajout de ce script dans le profil de votre shell offre une fonction hxs qui règle la question.
Après avoir installé fzf et ripgrep avec brew, ajouter les lignes suivantes à votre fichier de configuration de terminal.
# ~/.zprofile
# Helix Search
hxs() {
RG_PREFIX="rg -i --files-with-matches"
local files
files="$(
FZF_DEFAULT_COMMAND_DEFAULT_COMMAND="$RG_PREFIX '$1'" \
fzf --multi 3 --print0 --sort --preview="[[ ! -z {} ]] && rg --pretty --ignore-case --context 5 {q} {}" \
--phony -i -q "$1" \
--bind "change:reload:$RG_PREFIX {q}" \
--preview-window="70%:wrap" \
--bind 'ctrl-a:select-all'
)"
[[ "$files" ]] && hx --vsplit $(echo $files | tr \\0 " ")
}https://github.com/helix-editor/helix/wiki/Language-Server-Configurations
LanguageServer.jl est une implémentation du Microsoft Language Server Protocole pour Julia.
Helix dispose déjà d’un fichier de config pour Julia dans languages.toml.
cf. https://discourse.julialang.org/t/neovim-languageserver-jl/37286/7
https://github.com/fredrikekre/.dotfiles/blob/master/.julia/environments/nvim-lspconfig/Makefile
XML Language Server (LemMinX) est une implémentation LSP pour XML.
XML Language Server (LemMinX)
A Hunspell-compatible spellchecking Rust library
Voir aussi les discussions suivantes : helix-editor/helix#3637
Getreu, Jens. 2022. « Note talking with Helix, Tp-Note and LanguageTool ». Jens Getreu’s blog, septembre 30. https://blog.getreu.net/20220828-tp-note-new8/.
https://github.com/helix-editor/spellbook
https://github.com/tekumara/typos-lsp
https://github.com/errata-ai/vale
https://github.com/Automattic/harper/
https://github.com/blopker/codebook
https://www.reddit.com/r/HelixEditor/comments/1cprxft/markdown_preview/
Markdown preview
Markdown preview could actually (efficiently) be handled by a language server. There is already https://github.com/euclio/mdpls which does exactly that.
[[language]]
name = "markdown"
language-server = { command = "/path/to/mdpls" }
config = { markdown.preview.auto = true, markdown.preview.browser = "firefox" }Puis :lsp-workspace-command Open\ Preview pour ouvrir la prévisualisation. Ne fonctionne pas si le navitateur n’est pas dans le path.
Pour conserver marksman
[[language]]
name = "markdown"
language-servers = ["marksman", "mdpls"]
[language-server.mdpls]
command = "/path/to/mdpls"
config = { markdown.preview.auto = true }I wrote a bash script that previews anything pandoc can render in the terminal itself, and detects modifications to the file to reload. My helix-config-foo isn't great so I'm not sure if this can be integrated well; I'm currently using it in a separate terminal tab/window. I hope this is useful to someone! It requires inotify-tools, termpdf.py or some other in-terminal PDF reader (do change the code if you're using something else) and pandoc.
#!/usr/bin/env bash
set -eo pipefail
FILE="$(realpath "$1")"
TMPDIR="$(mktemp -d)"
PDF="$TMPDIR/rendered.pdf"
trap "pkill -P $$ && rm -rf \"$TMPDIR\"" exit
regen() {
inotifywait -q -e modify "$FILE" "$TMPDIR/closing.signal" > "$TMPDIR/inotify.log"
grep -q "$TMPDIR/closing.signal" "$TMPDIR/inotify.log" || {
pandoc "$FILE" -o "$PDF"
pkill -P "$$" # Kills children of these script, which can only be termpdf.py at this point
}
}
pushd "$TMPDIR" >/dev/null # termpdf.py's log file will go here and will be deleted on exit
pandoc "$FILE" -o "$PDF"
touch closing.signal
while :
do
regen &
termpdf.py "$PDF" && popd>/dev/null && echo 1 >"$TMPDIR/closing.signal" && exit 0 # If the user quits the viewer, we can exit nicely
donehttps://medium.com/@CaffeineForCode/helix-setup-for-markdown-b29d9891a812
https://github.com/microsoft/vscode-markdown-languageservice
Exemples de configuration helix-editor/helix#1360
Pour NeoVim
ThePrimeagen’s video about setting up NeoVim from scratch
- file tree (sidebar style),
- the smarts,
- fuzzy finder,
- global search
- replace
- base16_transparent
- carbon +
- catpuccin_frappe
- catpuccin_macchiato +
- catpuccin_mocha
- doom-one ++
- dracula
- dracula_at_night
- everblush
- focus_nova +
- jetbrains_dark +
- nord
- nord-night +
- onedark ++
- onedarker
- papercolor-dark
- snazzy +
- starlight
- term16_light
- zed_onedark
Finalement Darkside en appliquant le thème par défaut de mon émulateur de terminal (Ghostty).
- Maxime Coste. Why Kakoune, The quest for a better code editor.
- Helix documentation
- Lorenzo Setale, «Switching to Helix: My Experience and Tips», 2022
- Helix Shortcut Quiz
- Ari Seyhun, Enhanced Helx config, 2023
- Hårek, Tim. « My thoughts on Helix after 6 months ». Tim Hårek (blog), 19 juin 2023.
- Tim Hårek, Tim. « Helix as a notes tool ». Tim Hårek (blog), 25 août 2023.
- Balkan, Aral. « Installing Helix Editor Language Servers ». Aral Balkan (blog), 14 novembre 2022
- Tong, Quand. 2023. « Turning Helix into an IDE with the help of WezTerm and CLI tools ». Quan Tong, août 19. https://quantonganh.com/2023/08/19/turn-helix-into-ide.md.