Draw diagrams like those:
Document a command:
pdfjam source.pdf 3-5,9
▲ ▲ ▲ ▲
command╶╯ │ │ │
input file╶──╯ │ │
select pages 3,4,5╶───╯ │
and page 9╶──────────────╯
Connect boxes with arrows:
╭───────────────────────╮
╷123╭────▶┤ hundred and something │
╰───╯ ╰───────────────────────╯
╭────▶──╮A╷
╭───╮ ┏━━━┓ ╔═══╗ │ ╰─╯
0╶─→┤ 1 ┝━━━▶┫ 2 ┣═══▷╣ 3 ╟──●────▶──╮B╷
╰───╯ ┗━┯━┛ ╚═╤═╝ │ ╰─╯
╰────←───╯ ╰────▶──╮C╷
╰─╯
╔══════════╗
║ 1 ║ ▐▀▀▀▀▀▀▀▀▜
║ ╭─────╫───╮ ◁──▷ ▐ 3 ▐
╚════╪═════╝ 2 │ ▐▄▄▄▄▄▄▄▄▟
╰─────────╯
Explain decisions trees:
┏━━━━━━━━━━━━┓
┃which color?┃
┗━┯━━━━━━━━━━┛
│ ╭──────╮
│ ╭──┤yellow├─▷╮good─choice╭□
▽ │ ╰──────╯ ╰═══════════╯
╰──● ╭───╮ ┏━━━━━┓
├──┤red├───▷┨dark?┠──╮
│ ╰───╯ ┗━━━━━┛ │
│ ╭───◁──────────────╯
│ │ ╭───╮
│ ╰─●─┤yes├▷╮regular─red╭─□
│ │ ╰───╯ ╰═══════════╯
│ │ ╭──╮
│ ╰─┤no├─▷╮pink╭────────□
│ ╰──╯ ╰════╯
│ ╭────╮
├──┤blue├───▷╮next week╭──□
│ ╰────╯ ╰═════════╯
│ ╭─────╮
╰──┤white├──▷╮available╭──□
╰─────╯ ╰═════════╯
Draw lines or blocks:
╭─╮←─╮
╭╮ │ │ ╰──╴max 235
╭╮││ ╭╯ │
│╰╯│╭─╯ │
╭╮ │ ││ │
╭─╮││╭╮ ╭──╮╭╮ │ ╰╯ ╰╮
╭╯ ╰╯╰╯│ ╭╯ ╰╯╰─╮ │ │ ╭╮
◁─╯ ╰──╯ ╰──╯ ╰─╯╰────▷
◀════════════════════════════════════════▶
╭────────╮
▲ │all time│
┃ ▄ ▗▟█ ←─┤highest │
Qdx █▌ ████ ╰────────╯
┃ ▗▄█▌ █████▙
┃ ▟███████▄█████████▄▄▄ ▗▄
┃▐▄▄████████████████████████████▄▄▖
╺━━━━━━━━━━╸time╺━━━━━━━━━━━━━━━━▶
Explain Lisp lists:
'(a b c)
┏━━━┳━━━┓ ┏━━━┳━━━┓ ┏━━━┳━━━┓
●━━━▶┫ ● ┃ ●─╂──▷┨ ● ┃ ●─╂──▷┨ ● ┃nil┃
┗━┿━┻━━━┛ ┗━┿━┻━━━┛ ┗━┿━┻━━━┛
│ ╰──────────╮╰╮
│ ╭─────┬───────────╮ │ │
╰─▷┤"a\0"│properties │ │ │
├─────┼───────────┤ │ │
│"b\0"│properties ├◁╯ │
├─────┼───────────┤ │
│"c\0"│properties ├◁──╯
├─────┼───────────┤
│... │... │
╵ ╵ ╵
Draw sketched objects:
◀─(-)────────(+)──▶ ~╭──────╮~ ▗──────────────╮ ~~│ ╭~~╮ │~~ ▐ ╰╮ ~│ ╵ ╵ │~ ╭□▐ 1.5 volts ╭╯□╮ ╰─╖ ╓─╯ │ ▝▀▀▀▀▀▀▀▀▀▀▀▀▀▀▘ │ ╠━━╣ │ ╰──────╯ │ ╰─────────────────────────────╯
Those diagrams are pure text. There is nothing graphic. They are achieved using UNICODE characters. Most often, the text file will be encoded as UTF-8.
Creating such diagrams by hand is painfully slow. Use Uniline to
draw lines while you move the cursor with keyboard arrows.
Beware!
If you see those diagrams miss-aligned, most likely the font used to display them does not support UNICODE block characters. See bellow the paragraph “Which fonts?”.
Uniline is a minor mode. Activate it temporarily:
M-x uniline-mode
Exit it with:
C-c C-c
The current major mode is still active underneath uniline-mode.
While in uniline-mode, overwritting is active, as well as long lines
truncation. Also, a hollow cursor is provided. Those settings are
reset to their previous state when exiting uniline-mode.
Use keybord arrows to draw lines.
By default, drawing lines only happens over empty space or over other lines. If there is already text, it will not be erased. However, by hiting the control-key while moving, lines overwrite whatever there is.
The buffer is “infinite” in bottom and right directions. Which means that when the cursor ends up outside the buffer, white space characters are automatically added.
The usual numeric prefix is available. For instance, to draw a line 12
characters wide downward, type: M-12 <down>
Set the current brush with:
-single thin line╭─┬─╮+single thick line┏━┳━┓=double line╔═╦═╗#quarter block▙▄▟▀<delete>eraser<return>move without drawing anything
The <insert> key is a prefix for other keys:
- for drawing arrows, squares, crosses, o-shapes glyphs,
- for handling rectangles,
- for inserting
# = - +which otherwise change the brush style, - for trying a choice of monospaced fonts.
Why <insert>? Because:
Unilinetries to leave their original meaning to as much keys as possible,- the standard meaning of
<insert>is to toggle the overwrite mode; butUnilineis already inoverwrite-mode, and de-activating overwrite would breakUniline.
So preempting <insert> does not sacrifices anything.
At any time, an arrow may be drawn. The arrow points in the direction that the line drawing follows.
Uniline supports 5 arrows types: ▷ ▶ → ▹ ▸
△ ▵ ↑ ▲ ▴ ◁ ▷ ◃ ▹ ← → ◀ ▶ ◂ ▸ ▽ ▿ ↓ ▼ ▾
Actually, there are tons of arrows of all styles in the UNICODE
standard. Unfortunately, the support by fonts is weak. So Uniline
restrains itself to those five safe arrows.
To insert an arrow, type: <insert>a or <insert>aa or <insert>aaa. (a
cycles through the 5 styles, A cycles backward).
<insert>4a is equivalent to <insert>aaaa, which is also equivalent to
<insert>AA. Those 3 shortcuts insert an arrow of this style: ▵▹▿◃. The
actual direction where the arrow points follows the last movement of
the cursor.
To change the direction of the arrow, use shift-arrow, for example:
S-<up> will change from → to ↑.
There are a few other UNICODE characters which are monospace and symetric in the 4 directions. They are great at line intersections:
To insert a square □ ■ ▫ ▪ ◇ ◆ ◊ type:
<insert>sss... (s cycles, S cycles backward).
To insert a circular shape · ∙ • ● ◦ Ø ø type:
<insert>ooo... (o cycles, O cycles backward).
To insert a cross shape ╳ ÷ × ± ¤ type:
<insert>xxx... (x cycles, X cycles backward).
To insert a usual ASCII letter or symbol, just type it.
As the keys - + = # are preempted by Uniline mode, to type them,
prefix them with <insert>. Example: <insert>- inserts a - and
<insert>+ inserts a +.
<insert>
│
▼
╭┴╮ ╭───────╮ ╭─────────────────────╮
│s├─▶─┤squares├──┤ □ ■ ▫ ▪ ◇ ◆ ◊ │
╰┬╯ ╰───────╯ ╰─────────────────────╯
╭┴╮ ╭───────╮ ╭─────────────────────╮
│o├─▶─┼circles┼──┤ · ∙ • ● ◦ Ø ø │
╰┬╯ ╰───────╯ ╰─────────────────────╯
╭┴╮ ╭───────╮ ╭───────────────╮
│x├─▶─┼crosses┼──┤ ╳ ÷ × ± ¤ │
╰┬╯ ╰───────╯ ╰───────────────╯
╭┴╮ ╭───╮
│+├─▶────────────┤ + │
╰┬╯ ╰───╯
╭┴╮ ╭───╮
│-├─▶────────────┤ - │
╰┬╯ ╰───╯
╭┴╮ ╭───╮
│=├─▶────────────┤ = │
╰┬╯ ╰───╯
╭┴╮ ╭───╮
│#├─▶────────────┤ # │
╰─╯ ╰───╯
To draw a rectangle in one shot, select a rectangular region with
C-SPC or C-x SPC and move the cursor.
If needed, change the brush with any of
- + = # <delete>
then hit
rto draw a rectangle inside the selectionS-Rto draw a rectangle ouside the selectionC-rto overwrite a rectangle inside the selectionC-S-Rto overwrite a rectangle ouside the selection
╭───────╮ r: inside╮╭───────╮
│ one │ ▗▄▄▄▄▄▄▖╭┤│▛▀▀▀▀▀▜│
│ ┏━━━━┿━━━━━━┓ ▐╭────╮▌│╰┼▌ ▐│
╰──╂────╯ two ┃ ▐│ │▌│ │▙▄▄▄▄▄▟│
┃ ╔═══════╋═╗ ▐│ ├▌╯ ╰─────┬─╯
┗━━━╋━━━━━━━┛ ║ ▐╰────╯▌────────┴───╮
║ three ║ ▝▀▀▀▀▀▀▘ R: outside╯
╚═════════╝
╭─────────╮
my text I │my text I│
want to ╶─<insert>R─▷ │want to │
box │box │
╰─────────╯
The usual C-_ or C-/ keys may be hit to undo, even with the region still
active visually.
Select a region, then press <insert>. The selection becomes rectangular if it
was not.
Use arrow keys to move the rectangle around. A numeric prefix may be
used to move the rectangle that many characters. Be sure to specify
the numeric prefix with just digits, without the Alt key. Typing
15<left> moves the rectangle 15 characters to the left. M-15<left>
does not work.
Press q, RET, or C-g to stop moving the rectangle.
The C-_ key may also be used to undo the previous movements, even
though the selection is still active.
▲
│
<up>
╭─────┴──────╮
│this is │
│my rectangle│
◀─<left>──┤I want to ├─<right>─▶
│move │
╰─────┬──────╯
<down>
│
▼
A rectangle can be copied or killed, then yanked somewhere else. Press:
cto copykto killyto yank (aka paste)
This is similar to the Emacs standard rectangle handling:
C-x r rcopy rectangle to registerC-x r kkill rectangleC-x r yyank killed rectangle
The difference is that Uniline rectangles when killed and yanked, do not
move surrounding characters.
Uniline and Emacs standard rectangle share the same storage for copied
and killed rectangles, killed-rectangle. So, a rectangle can be killed
one way, and yanked another way.
A monospace character font must be used. It must also support UNICODE.
Not all fonts are born equal.
(set-frame-font "DejaVu Sans Mono" )(set-frame-font "Unifont" )(set-frame-font "Hack" )(set-frame-font "JetBrains Mono" )(set-frame-font "Cascadia Mono" )(set-frame-font "Agave" )(set-frame-font "JuliaMono" )(set-frame-font "FreeMono" )(set-frame-font "Iosevka Comfy Fixed")(set-frame-font "Source Code Pro" )
Those fonts are known to support the required UNICODE characters, AND
display them as monospace. There are fonts advertized as monospace
which give arbitrary widths to non-ASCII characters. That is bad for
the kind of drawings done by Uniline.
You may want to try any of the 10 suggested fonts. Just hit the
corresponding entry in the Uniline menu, or type <insert>f. You may
also execute the above Lisp commands like that:
M-: (set-frame-font "DejaVu Sans Mono")
This setting is for the current session only. If you want to make it permanent, you may use the Emacs customization:
INS f *
or
M-x customize-face default
Beware that Emacs tries to compensate for missing UNICODE support by the current font. Emacs substitutes one font for another, character per character. The user may not notice until the dawings done under Emacs are displayed on another text editor or on the Web.
To know which font Emacs has choosen for a given character, type:
C-u C-x =
The line-spacing setting in Emacs can change the display of a sketch.
The best looking effect is given by:
(setq line-spacing nil)
You may want to change your current setting. Uniline may handle this
variable some day. Right now, line-spacing is left as a matter of
choice for everyone.
╭────┬────────┬────╮ ╺┯━━━━┯┯━━┯┯━┯┯━━━━━━━━┯┯━━━━━━━┯┯━━━━━━━┯╸
│▒▒▒▒╰────────╯▒▒▒▒│ │ │╰is╯╰a╯│ ││ │╰arround╯
│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│ ╰this╯ ╰sentence╯╰hanging╯
│▒▒▒╭─╮▒▒▒▒▒▒╭─╮▒▒▒│ △
│▒▒▒╰─╯▒▒▒▒▒▒╰─╯▒▒▒│ │ △
│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│ ╰─────────┬────────╯
╰──────────────────╯ verbs
(setq line-spacing nil)
Picture-mode and uniline-mode are compatible. Their features overlap
somehow:
- Both implement an unlimited buffer in east an south directions.
- Both visually truncate long lines (actual text is not truncated).
- Both set the overwrite mode (
uniline-modeactivatesoverwrite-mode, whilepicture-modere-implements it) - Both are able to draw rectangles (
uniline-modein UNICODE, picture in ASCII), copy and yank them.
They also have features unique to each:
Picture-modewrites in 8 possible directionsPicture-modehandles TAB stopsUniline-modedraws lines and arrows
Artist-mode and uniline-mode are mostly incompatible. This is because
Artist-mode preempts the arrow keys, which give access to a large part
of uniline-mode features.
However, it is possible to use both one after the other.
Whitespace-mode and uniline-mode are mostly compatible.
Why activate whitespace-mode while in uniline-mode? Because
uniline-mode creates a lot of white-spaces to implement an infinite
buffer. And it is funny to look at this activity.
To make them fully compatible, disable the newline visualization:
M-x customize-variable whitespace-style- uncheck
(Mark) NEWLINEs
This is due to a glitch in move-to-column when a visual property is
attached to newlines. And uniline-mode makes heavy use of move-to-column.
Linux consoles are the 7 non-graphic screens which can be accessed
usually typing C-M-F1, C-M-F2, and so on. Such a screen is also
presented when connecting through ssh into a non-graphical server.
By default they use a font named “Fixed” with poor support for Unicode. However, it supports lines of the 3 types, mixing all of them in thin lines though.
Another problem is that by default S-<left> and C-<left> are
indistinguishable from <left>. Same problem with <right>, <up>, <down>
and <insert>. This has nothing to do with Emacs. A solution can be
found here: https://www.emacswiki.org/emacs/MissingKeys
This is the Emacs launched from a terminal typing emacs -nw. In this
environment, <insert> does not exists. It is replaced by
<insertchar>. This has already been taken into account by Uniline
by duplicating the key-bindings for the two flavors of this key.
If you decide to bind globally C-<insert> to the toggling of
Uniline minor mode as suggested, then you will have to do the same
for C-<insertchar>, for example with use-package in your
~/.emacs file:
(use-package uniline
:defer t
:bind ("C-<insert>" . uniline-mode)
:bind ("C-<insertchar>" . uniline-mode))
On Windows the only native monospaced fonts are Lucida Console and
Courier New. They are not monospaced for the Unicodes used by
Uniline.
Often, the Cosolas font is present on Windows. It supports quite well
the required Unicodes to draw lines. A few glyphs produce unaligned
result though. They should be avoided under Consolas: △▶▹◇◆
Of course, other fonts may be installed. It is quite easy.
Add the following lines to your .emacs file,
and reload it, if not already done:
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)
Alternately you may customize this variable:
M-x customize-variable package-archives
Then download the package:
(package-install "uniline")
Alternately, you can download the Lisp file, and load it:
(load-file "uniline.el")
You may want to give uniline-mode a key-binding. use-package
in your $HOME/.emacs file is great for that:
(use-package uniline
:defer t
:bind ("C-<insert>" . uniline-mode))
In this example, C-<insert> was choosen. You can use whatever keys combination you want.
<insert> happens to also be the key used inside Uniline.
artist-mode: the ASCII art mode built into Emacs.ascii-art-to-unicode: as the name suggest, converts ASCII drawings to UNICODE, giving results similar to those ofUniline.picture-mode: as inUniline, the buffer is infinite in east & south directions.org-pretty-table: Org Mode tables appear to be drawn in UNICODE characters (actually they are still in ASCII).boxes: draws artistic boxes around text, with nice looking unicorns, flowers, parchments, all in ASCII art.org-drawio: a bridge between the Draw.Io editor and Emacs, producing drawing similar to those ofUniline, but in .svg.syntree: draws ASCII trees on-the-fly from description.unicode-enbox: create a UNICODE box around a text; input and output are strings.unicode-fonts: in Emacs, helps alleviate the lack of full UNICODE coverage of most fonts.org-superstar: prettify headings and plain lists in Org Mode, using UNICODE glyphs.charmap: UNICODE table viewer for Emacs.insert-char-preview: insert UNICODEs with character preview in completion prompt.list-unicode-display: list all UNICODE characters, or a selection of them.show-font: show font features in a buffer.ob-svgbob: convert your ascii diagram scribbles into happy little SVGel-easydraw: a full featured SVG editor right inside your Emacsasciiflow: (not Emacs) draw on the web, then copy-paste your UNICODE textdot-to-ascii.ggerganov.com:(not Emacs) describe your schema in the Graphviz language, and copy-past your UNICODE text.monosketch: (not Emacs) draw on the web, then copy-paste your UNICODE text
- Thierry Banel, author
- Joost Kremers https://github.com/joostkremers found a bug in the minor-mode key-binding definitions, and incompatibility with
- DogLooksGood https://github.com/DogLooksGood gave feedback on inserting usual characters not moving the cursor
Copyright (C) 2024 Thierry Banel
Uniline is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Uniline is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.