«Distraction-free» mode pour Vim

02 Décembre 2015

Cela fait quelques années que j’utilise vim pour coder et pour écrire les articles que je publie sur mes blogs. Cependant, je ne m’étais jamais trop penché sur la configuration que l’on peut faire avec vim afin d’avoir un environnement propice à l’écriture jusqu’il y a peu.

L’affichage du Markdown

vim est installé avec le support du Markdown nativement, mais son support est relativement limité à l’usage en particulier pour la coloration syntaxique des fichiers Markdown. J’ai tweaké un peu mon thème molokai afin de mieux prendre en compte le code inline (entre backtick), pour le rendre plus visible.

J’utilise aussi le plugin vim-markdown-jekyll qui permet de colorer le FrontMatter de mes articles Jekyll, afin de le sortir du contenu de mes articles. Ce qui donne l’interface suivante :

Certains diront que les nombreuses couleurs ne sont pas assez «light» pour être «distraction-free», mais j’y suis habitué et cela ne me dérange pas si je ne respecte pas totalement les codes…

Le mode «distraction-free» avec goyo.vim

Pour vraiment me concentrer sur mon éditeur de texte, j’utilise le plugin goyo.vim, qui permet après un peu de configuration de disposer du fameux mode «distraction-free».

J’ai dit «après configuration», car même si la configuration par défaut va convenir à la majorité, ce n’était pas à mon goût. La documentation explique qu’il est possible de définir deux callbacks qui s’exècuteront à l’activation et la désactivation de Goyo. C’est grâce à cela que l’on va pouvoir affiner le comportement de vim lors du mode distraction-free.

Par défaut, goyo.vim va cacher tout ce qu’il peut : NERDTree, Airline,… Mais il ne cache pas la barre de status de tmux, va falloir le faire à la main. Cela se fait avec la commande :

silent ! tmux set status off

Ensuite, je veux que les lignes retournent à la ligne lorsque le texte est plus long que la largeur de l’éditeur, on configure cela avec la commande : set wrap et pour que les retours à la lignes ne coupent pas un mot en deux on ajoute la commande : set linebreak.

Bien sur, il faut remettre les comportements par défaut lorsque l’on ferme le mode plein écran. Ce qui donne la résultat suivant :

Et voici la configuration que j’utilise :

" Goyo
function! s:goyo_enter()
   silent ! tmux set status off
   set wrap
   set linebreak
   let b:quitting = 0
   let b:quitting_bang = 0
   autocmd QuitPre <buffer> let b:quitting = 1
   cabbrev <buffer> q! let b:quitting_bang = 1 <bar> q!
endfunction

function! s:goyo_leave()
   silent ! tmux set status on
   set nowrap
   set nolinebreak
   " Quit Vim if this is the only remaining buffer
   if b:quitting && len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) == 1
      if b:quitting_bang
         qa!
      else
         qa
      endif
   endif
endfunction

autocmd User GoyoEnter call <SID>goyo_enter()
autocmd User GoyoLeave call <SID>goyo_leave()

Il n’y a plus que le contenu visible, centré avec une largeur adapté à mon écran, mais le texte est trop petit à mon gout… Il y a deux solutions, soit on ajuste la taille de la police à la main avec les raccourcis ⌘+ et ⌘-, soit on automatise le changement de taille à l’initialisation et à la fermeture du plugin.

Personnellement, j’ai choisi de l’automatiser avec un petit peu d’AppleScript.

Gestion de la taille de la police dans iTerm2

Le moyen le plus simple (si l’on omet les raccourcis claviers) pour modifier le taille du texte est d’utiliser ce morceau de code :

osascript -e 'repeat 2 times' -e 'tell application "System Events" to keystroke "+" using command down' -e 'end repeat'

Avec cette commande, on augmente deux fois la taille de la police. Pour info, on ne peux pas mettre cette commande sur une seule ligne, ce n’est tout simplement pas possible avec AppleScript. C’est pour cette raison que l’on utilise l’attribut -e pour executer plusieurs commandes à la suite, qui normalement devrait être sur plusieurs lignes.

Pour être sur que l’on augmente pas trop la taille du texte, je vous conseille de réinitialiser le zoom à 0 avant d’appliquer le niveau de zoom que vous voulez. C’est cette commande que l’on utilisera dans la function goyo_leave() qui permet la fermeture du mode «Distraction-Free» :

osascript -e 'tell application "System Events" to keystroke "0" using command down'

Et voilà le résultat final :

Encore une petite info, changer la taille de la police peut mettre un peu le bazar dans vos panes tmux mais rien de bien grave, il suffit de faire un clean pour que tout rentre dans l’ordre.

Conclusion

Avec cette configuration, plus longue à lire qu’à mettre en place, j’ai mon éditeur vim en plein écran avec uniquement le contenu nécessaire, le texte est plus lisible puisque la taille de police est augmenté. J’espère que cela me permettra de poster à nouveau quelques articles sur mes blogs.

En tout cas, je trouve qu’écrire avec un éditeur en plein écran et uniquement le texte est bien plus agréable que je ne l’aurai pensé. :)

Charger les commentaires…