Skip to content

Latest commit

 

History

History
510 lines (335 loc) · 22.7 KB

File metadata and controls

510 lines (335 loc) · 22.7 KB
since 2023-09-02
tags editor, outils

Helix

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.

Installation

Sur Mac, le logiciel est distribué sous la forme d’une image disque ou bien par le gestionnaire de paquets Brew :

brew install helix

Déclarer Helix comme éditeur par défaut pour Git

Aprè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 = hx

Documentation et prise en main

Après installation, Helix s’exécute avec la commande hx

hx

Documentation : https://docs.helix-editor.com

Un tutoriel est installé avec le logiciel. On y accède de la manière suivante :

hx --tutor

ou 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

Configuration des fichiers runtime

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/runtime

ou alors on créée un lien symbolique dans ~/.config/helix qui lie vers le répertoire source

ln -s $PWD/runtime ~/.config/helix/runtime

Configuration des serveurs de langages

Helix 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

Commandes utiles

Un éditeur multimodal

À 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.

Des commandes composables inspirées de Kakoune

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.

Sélection des modes, fermeture et enregistrement des fichiers

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 commandes
  • v select (extend) mode pour faire des sélections complèxes
  • m match mode pour sélectionner et éditer du texte sémantiquement
  • z view mode pour modifier la vue
  • Z sticky view mode pour visualiser un document
  • g goto mode pour se déplacer rapidement
  • <Ctrl>-w window 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.

Déplacements dans l’éditeur

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.

  • w déplace le curseur avant le début du prochain mot (word)
  • e déplace le curseur à la fin du mot (end)
  • b déplace le curseur en arrière au début du mot (before)
  • W, E, et B dé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

  • ge aller à la fin du document
  • gh aller au début de la ligne
  • gl aller à la fin de la ligne
  • gs se rendre au premier caractère non-blanc d’une ligne
  • g. 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).

Édition d’un document

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 :

  • i insérer un caractère avant la sélection (insert)
  • a insérer un caractère après la sélection (append)
  • I insérer au début de la ligne
  • A insérer à la fin de la ligne
  • o ouvrir 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

  • d supprime le caractère au niveau du curseur ou la sélection (delete)
  • c remplace le caractère au niveau du curseur ou la sélection (change)
  • wd efface un mot (word, delete)
  • wc change un mot ou la fin d’un mot (word, change)
  • ec change la fin d’un mod (end, change)

Commenter

  • <Ctrl>-c commenter ou décommenter la ligne

Autocompléter

  • <Ctrl>-x autocompléter

Déplacements et sélections multiples

Les commandes de déplacement peuvent être précédées par des quantificateurs.

  • 2w déplace le curseur de deux caractères en avant
  • 3e déplace vers la fin du troisième mot en avant.
  • 2b dé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)

  • t trouver jusqu’au prochain caractère, v trouver le prochain caractère
  • T trouver jusqu’au précédent caractère, V trouver 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.

  • x sélectionne la ligne du curseur
  • 2x sélectionne deux lignes
  • vgld ou t<Entrée>d effacer la fin de la ligne. v est utilisé avec gl car 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.
  • ;d effacer 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élection
  • mm se déplacer à l’élément correspondant (guillemets, crochets, etc.)
  • ms entourer 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/

Annulations

  • u permet d’annuler la dernière action (undo)
  • U refait la dernière action (redo)

Les commandes peuvent être utilisées plusieurs fois de suite.

Copier/coller

  • y copier la sélection (yarn)

  • p colle la sélection après le curseur (paste)

  • xy copier 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.

Rechercher dans un fichier

  • / recherche en avant dans un fichier, après avoir tappé la chaîne recherchée confirmer avec entrée

  • n accède au résultat suivant (next)

  • N accède au résultat précédent

  • ? réalise une recherche en arrière

  • s permet 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

  • %s sélectionne tout le buffer et ouvre une recherche dans la Psélection, saisir la recherche ou la regex, valider avec la touche ENTER, puis c pour 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) ou be*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, n va à la prochaine occurence. b sélectionne le début du mot, e sélectionne la fin du mot.i

Primitives de sélection

  • il est possible d’utiliser s de manière répétée
  • k permet 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é.

Curseurs multiples

  • C duplique le curseur à la ligne suivante pour éditer deux lignes simultanéemenet
  • <Alt>-C fait 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.

Exécuter une commande shell

  • :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.

Gestionnaire de fichiers et de fenêtres

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.

Configuration

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 = true

Installation de modes d’autocomplétion, et de formatage.

hx -health # connaître la liste des langages disponibles

Il est possible d’ajouter des serveurs de langages.

Pour savoir quels LSP sont nécessaires pour un langage

hx -health markdown

Installer 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@latest

Personnalisations avancées

Par 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 " ")
}

Serveurs de langue

https://github.com/helix-editor/helix/wiki/Language-Server-Configurations

Serveur de langue Julia

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

Serveur de langue pour XML

XML Language Server (LemMinX) est une implémentation LSP pour XML.

XML Language Server (LemMinX)

Correction d’orthographe

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

Markdown (divers)

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
done

https://medium.com/@CaffeineForCode/helix-setup-for-markdown-b29d9891a812

helix-editor/helix#1196

https://github.com/microsoft/vscode-markdown-languageservice

helix-editor/helix#5830

Exemples de configuration helix-editor/helix#1360

Helix comme IDE

Pour NeoVim

ThePrimeagen’s video about setting up NeoVim from scratch

  • file tree (sidebar style),
  • the smarts,
  • fuzzy finder,
  • global search
  • replace

Theme

  • 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).

Références

Conseils pour la personnalisation