43 votes

Comment dessiner des boîtes et des tableaux en texte brut

Dans de nombreux documents en texte brut, des caractères de dessin de boîte sont utilisés pour dessiner ces boîtes dans les figures et les tableaux. De tels exemples (de RFC 5766) sont montrés ci-dessous. Existe-t-il un moyen meilleur de dessiner ceci (par exemple, un outil de ligne de commande Unix), autre que d'utiliser la méthode d'essai-erreur?


Exemples de RFC 5766:

       +----------------------------+---------------------+
       | Client TURN au serveur TURN | Serveur TURN au pair|
       +----------------------------+---------------------+
       |             UDP            |         UDP         |
       |             TCP            |         UDP         |
       |        TLS sur TCP          |         UDP         |
       +----------------------------+---------------------+

Et celui-ci, également de RFC 5766:

                                        Pair A
                                        Adresse de           +---------+
                                        transport             |         |
                                        réflexe serveur       |         |
                                        192.0.2.150:32102     |         |
                                            |                 /|         |
                          TURN              |               / ^|  Pair A |
    Adresse                Serveur            |            /  ||         |
    de transport           de transport        |          //   ||         |
    du client              de l'adresse        |        //     |+---------+
    hôte                   du serveur          |      //       Pair A
    10.1.1.2:49721         192.0.2.15:3478     |+-+    //      Adresse de transport
            |               |               ||N|   /        de l'hôte
            |   +-+         |               ||A|  /         192.168.100.2:49582
            |   | |         |               v|T| /          
            |   | |         |               /+-+          
 +---------+|   | |         |+---------+   /              +---------+
 |         ||   |N|         ||         | //               |         |
 | Client  |v   | |         v| Serveur  |/                 |         |
 | TURN    |----|A|----------| TURN     |------------------|  Pair B |
 |         |    | |^         |         |^                ^|         |
 |         |    |T||         |         ||                ||         |
 +---------+    | ||         +---------+|                |+---------+
                | ||                    |                |
                | ||                    |                |
                +-+|                    |                |
                   |                    |                |
                   |                    |                |
             Adresse                     |            Pair B
             de transport réflexe          Relayée           Transport
             de transport du serveur      Adresse de        Adresse
             192.0.2.1:7000             transport du serveur   192.0.2.15:50000     192.0.2.210:49191

                                 Figure 1

2voto

Paul Points 133

Ajoutant à la réponse de @meuh je suis allé de l'avant et ai créé une mini-démo de pic.

$ cat picdemo.roff

.PS
box wid 3 "Ma première boîte ASCII"
arrow down 1 from last box.s
box wid 3 "Ma première boîte ASCII"
.PE

$ cat picdemo.roff | pic | groff -ms -Tascii

           +-----------------------------+
           |                             |
           |     Ma première boîte ASCII   |
           +--------------+--------------+
                          |
                          |
                          |
                          |
                          +
           +--------------+--------------+
           |                             |
           |     Ma première boîte ASCII   |
           +-----------------------------+

1voto

DarkSnake Points 21

J'ai ceci dans mon .vimrc:

vn [ :calrect(1)
vn ] :calrect(2)
let s:h=split(' ','\zs')
let s:e=map(range(81),'[v:val/27%3,v:val/9%3,v:val/3%3,v:val%3]') "encodage base-3
fu s:rect(x) "x:épaisseur
 if visualmode()!=#"\"|retu|en
 let s=&sel|let&sel='inclusive'|let[ls,cs]=[[line("'<"),line("'>")],[virtcol("'<"),virtcol("'>")]]|let&sel=s
 let[l0,l1,c0,c1]=[min(ls),max(ls),min(cs),max(cs)]
 let a=map(map(getline(l0,l1),"split(v:val,'\\zs')"),"extend(v:val,repeat([' '],max([0,c1-len(v:val)])))")
 let x=a:x|let[V,H]=[[x,0,x,0],[0,x,0,x]] "ligne verticale et horizontale
 "b:list de changements en tant que [ligne,colonne,masque binaire]
 if l0=0|let z=map(copy(s:e[i]),'max([v:val,m[v:key]])')|let a[l-l0][c-1]=s:h[27*z[0]+9*z[1]+3*z[2]+z[3]]|en
 endfo
 cal setline(l0,map(a,"join(v:val,'')"))
endf

En sélectionnant un rectangle en mode visuel par bloc () et en appuyant sur [, des caractères de dessin de ligne sont placés à sa limite, fusionnant avec tout caractère de dessin de ligne préexistant. Si vous préférez utiliser uniquement les caractères ASCII +-|, il devrait être facile de modifier.

1voto

jopa Points 800

Pour tous les utilisateurs Vim là-bas, deux plugins vénérables sont disponibles :

  • Plugin DrawIt!; cela n'a pas été mis à jour depuis des années, mais son auteur est toujours actif, ce qui en dit long sur sa maturité. C'est idéal pour les boîtes et les lignes de connexion; exactement ce qui est demandé ici. (Il peut même faire des cercles et des ellipses !)
  • sketch.vim n'est plus maintenu, et est plus orienté souris et style de peinture

Vous pouvez utiliser les deux plugins en parallèle, mais pas les avoir tous les deux actifs en même temps.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X