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