Utiliser vim comme pager pour les pages de man

Tags: #<Tag:0x00007f4e3e8ee4a8> #<Tag:0x00007f4e3e8ee3e0>

Bonjour,

Contexte
Je viens de mettre à jour depuis Bookworm à Trixie. Sous Bookworm, j’utilisais déjà Vim comme pager avec :

/bin/sh -c "col -b | vim -c 'set ft=man ts=8 nomod nolist nonu noma' -c 'nnoremap q ZZ' -"

Et sous Bookworm, ça foctionnait bien, le rendu bon, avec même de la coloration syntaxique.

Le problème
Depuis mon passage à Trixie, me donne un résultat fort étrange avec des 1m, 2m, 3m, à l’endroit des commandes Troff, au lieux de les interpréter comme il faut.

Voici à quoi ça ressemble :

4mLS24m(1)                                                                             Commandes de                                                                                            l'utilisateur                                                                           4mLS24m(1)

 1mNOM0m
        ls - Afficher le contenu de répertoires

 1mSYNOPSIS0m
        1mls 22m[4mOPTION24m]... [4mFICHIER24m]...

 1mDESCRIPTION0m
        Afficher les informations des 4mFICHIER24ms (du répertoire courant par défaut). Les entrées sont triées alphabétiquement si aucune des options 1m-cftuvSUX 22mou 1m--sort 22mn'est      indiquée.

        Les paramètres obligatoires pour les options de forme longue le sont aussi pour les options de forme courte.

        1m-a22m, 1m--all0m
               inclure les entrées débutant par « . »

        1m-A22m, 1m--almost-all0m
               omettre les fichiers « . » et « .. »

Question
Comment donc ré-obtenir un rendu correcte des pages de man en utilisant Vim comme pager ? Ça marchait pourtant bien sous Bookworm, il n’y a pas de raison que ça ne le soit pas sous Trixie.

Merci par anticipation.

Ce sont des codes couleurs ANSI.

1 J'aime

En effet…
Et l’utilisation du binaire col et de l’option -b devrait résoudre ce problème.
C’est un détail que j’ai découvert récemment, mais qui est connu depuis longtemps apparemment, et très bien expliqué ( les infos sont en anglais) :

Dès que tu te sers d’un pager différent à celui de man, qui est capable de comprendre les différents code ANSI, (échappements, couleurs), il te faut trouver un moyen de les lire correctement avec le binaire qui te sert de pager ; col semble être la réponse :wink:

Le manpage sous OpenBSD explique ceci :

     -c      Copy the manual page to the standard output instead of using
             less(1) to paginate it.  This is done by default if the standard
             output is not a terminal device.

             When using -c, most terminal devices are unable to show the
             markup.  To print the output of man to the terminal with markup
             but without using a pager, pipe it to ul(1).  To remove the
             markup, pipe the output to col(1) -b instead.

le même manpage sous Debian ne le mentionne même pas (ou alors, je suis aveugle).

1 J'aime

Pourquoi ne pas mettre ces réglages dans /etc/vimrc ou /home//.vimrc ?

Fort bien. Mais alors, et comme le mentionne mon message original, Vim est déjà pipé avec col, et même plus précisément avec l’option -b. Que faire alors ?

Car dans le cas particulier où vim est utilisé comme manpager, et seulement dans ce cas particulier là, je voudrais avoir ces options-là. De toute façon là n’est pas la question, que ce soit à même le vimrc ou donné en option le résultat est le même.

@fauve
Je ne comprends pas ce que tu veux faire avec cette commande ‹ /bin/sh -c ›.

/bin/sh -c "col -b | vim -c 'set ft=man ts=8 nomod nolist nonu noma' -c 'nnoremap q ZZ' -"
Vim : Lecture de stdin...

On trouve l’origine des traces ressemblantes à ce que tu fais en remontant en 2012, plus clair, en définissant la variable $MANPAGER: Using Vim as $MANPAGER - Zameer Manji

Je n’utilise pas vim et ne vois pas l’intérêt d’utiliser vim comme pager de man, man étant déjà largement outillé pour faire à peu près tout, et le pager ‹ less › étant très largement optionné.
Ce que tu cherches en finalité, en résultat (que tu ne précises pas) correspond peut-être à ceci:

export MANPAGER='env MAN_PN=1 vim --not-a-term -M +MANPAGER -'
man cp

Il faut probablement décortiquer ceci: terminal - Documentation on LESS_TERMCAP_* variables? - Unix & Linux Stack Exchange

Termcap is a library that Less uses to access the terminal.
Termcap is largely obsolete, having been replaced by Terminfo, but Terminfo offers a Termcap compatibility interface to applications.
Less is content with the Termcap interface and uses that.

Colors in Man on modern GNU systems
If you have Linux or other GNU system with Groff ≥1.23, configuring Less has no effect on man pages, because Groff directly emits terminal escape sequences instead of letting Less do the translation. (Groff is the part of Man that formats a man page for display on a terminal or in print.)

A moins de justifier clairement l’absolue nécessité d’usage de vim comme pager de man, je vois 2 options:
1- soit utiliser ‹ vis ›, comme suggéré dans ce sujet parallèle: Utiliser vim comme pager pour les pages de man / Debian-facile
2- ou s’il s’agit simplement d’avoir man en couleur, utiliser ce genre de procédé plus fiable que vim:

function _colorman() {
  env \
    LESS_TERMCAP_mb=$'\e[1;35m' \
    LESS_TERMCAP_md=$'\e[1;34m' \
    LESS_TERMCAP_me=$'\e[0m' \
    LESS_TERMCAP_se=$'\e[0m' \
    LESS_TERMCAP_so=$'\e[7;40m' \
    LESS_TERMCAP_ue=$'\e[0m' \
    LESS_TERMCAP_us=$'\e[1;33m' \
    LESS_TERMCAP_mr=$(tput rev) \
    LESS_TERMCAP_mh=$(tput dim) \
    LESS_TERMCAP_ZN=$(tput ssubm) \
    LESS_TERMCAP_ZV=$(tput rsubm) \
    LESS_TERMCAP_ZO=$(tput ssupm) \
    LESS_TERMCAP_ZW=$(tput rsupm) \
    GROFF_NO_SGR=1 \
      "$@"
}
alias man="LANG=C _colorman man"
man cp

Mon avis, moins il y a de quincaillerie inutile, plus c’est fiable.

1 J'aime