sebastiano.tronto.net

Source files and build scripts for my personal website
git clone https://git.tronto.net/sebastiano.tronto.net
Download | Log | Files | Refs | README

man-col.md (2517B)


      1 # Pipe man into col -b to get rid of \^H
      2 
      3 The man page reading club is returning soon. In the meantime,
      4 here is a short post on a trick related to `man` itself that I skipped in the
      5 [first post of the series](../2022-05-29-man).
      6 
      7 ## Vi rocks
      8 
      9 A cool feature of vi-like editors is that you can insert the
     10 output a command in the file you are editing, without doing any awkard
     11 copy-pasting. You can do this with the `r` ex command:
     12 
     13 ```
     14 :r !date
     15 ```
     16 
     17 Inserts the output of the `date` command on a new line. You can also
     18 use the `!` (bang) command, combined with a motion, to feed the
     19 text between the cursor and the target of the motion to a command and
     20 replace it with the output of the command itself. For example
     21 I often use `!}fmt` to format the next paragraph when I am writing
     22 an email.
     23 
     24 ## Man pages and ANSI escape codes
     25 
     26 Unfortunately, if you try to use this feature to include parts of a man page,
     27 you might not like the result. Typing `:r !man man | head` gives
     28 
     29 ```
     30 MAN(1)                      General Commands Manual                     MAN(1)
     31 
     32 N^HNA^HAM^HME^HE
     33      m^Hma^Han^Hn - display manual pages
     34 
     35 S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS
     36      m^Hma^Han^Hn [-^H-a^Hac^Hcf^Hfh^Hhk^Hkl^Hlw^Hw] [-^H-C^HC _^Hf_^Hi_^Hl_^He] [-^H-M^HM _^Hp_^Ha_^Ht_^Hh] [-^H-m^Hm _^Hp_^Ha_^Ht_^Hh] [-^H-S^HS _^Hs_^Hu_^Hb_^Hs_^He_^Hc_^Ht_^Hi_^Ho_^Hn]
     37          [[-^H-s^Hs] _^Hs_^He_^Hc_^Ht_^Hi_^Ho_^Hn] _^Hn_^Ha_^Hm_^He _^H._^H._^H.
     38 
     39 D^HDE^HES^HSC^HCR^HRI^HIP^HPT^HTI^HIO^HON^HN
     40 ```
     41 
     42 Not cool! This happens because manual pages are not made of plain text. They
     43 contain *ANSI escape codes* to provide some basic formatting, like
     44 bold text and whatnot (you might or might not see them, depending on the
     45 capabilities of your terminal emulator). This is a complex topic and I don't
     46 know much about it. Check out the excellent post
     47 [Anatomy of a Terminal Emulator](https://poor.dev/terminal-anatomy)
     48 by [poor.dev](https://poor.dev) if you want to learn more.
     49 
     50 Long story short, the workaround is included in the man page itself:
     51 
     52 ```
     53 When using -c, most terminal devices are unable to show the
     54 markup.  To print the output of man to the terminal with markup
     55 but without using a pager, pipe it to ul(1).  To remove the
     56 markup, pipe the output to col(1) -b instead.
     57 ```
     58 
     59 Indeed, using `:r !man man | col -b | head` gives:
     60 
     61 ```
     62 MAN(1)			    General Commands Manual			MAN(1)
     63 
     64 NAME
     65      man - display manual pages
     66 
     67 SYNOPSIS
     68      man [-acfhklw] [-C file] [-M path] [-m path] [-S subsection]
     69 	 [[-s] section] name ...
     70 
     71 DESCRIPTION
     72 ```
     73 
     74 Hooray!