#[1]Cat on a Keyboard Full Atom Feed [2]Cat on a Keyboard Categories
Atom Feed
[3]Cat on a Keyboard
* [4]Blog
* [5]Archives
* [6]Categories
* [7]Tags
[8]A crash course in sc
* Mon 29 August 2016
* 8 minute read
[9]Photo by Katerina Bartosova
I [10]previously mentioned the spreadsheet tool sc in my text-mode
overview, noting that it deserved a separate post. It is one of the
oldest spreadsheet programs around, maybe even the oldest still in use
today. (The date examples in the documentation are all from the 1970s,
for what it’s worth.)
sc was originally written by James Gosling, who later went on to create
the programming language Java. Like any sufficiently old piece of
software, development is spread across a handful of forks. There’s
[11]at [12]least [13]three direct forks that I can find, as well as
derivative versions like [14]sc-im. There also exists a graphical
frontend for X11/Athena called Xspread, but I can no longer find
anything resembling a home page for it, and distros seem to have
dropped the package. (It didn’t offer much that sc didn’t, anyway.)
sc has a rather steep learning curve, especially for those not already
passingly familiar with vi-style editing. If you’re expecting a
terminal equivalent of Excel (or OpenOffice, or LibreOffice, or
whatever its name is this year), you will likely be disappointed.
Moreover, while it adopts many of vi‘s principles, only the most basic
keystrokes work similarly; it is quite a different animal. That is,
Excel is a dog, vi is a cat, and sc is a fox. Hope that’s clear.
For heavy command-line users, it’s worth the effort to learn, and
fortunately it also comes with plenty of resources to help, including a
well-written manual page, a detailed tutorial, and an interactive
quick-reference help system. This might be surprising to those used to
modern software, but back in The Day, programs generally came with
good documentation.
I should also point out, by the way, that I am only covering sc here,
and not sc-im, which has been extensively modified to act much more
“vimmy” — for example, changing the W key to :w. For what it’s worth, I
think sc has a friendlier help system for new users, as it’s concisely
broken into quickly-accessible pages, e.g. ?h displays the row and
column commands. sc-im looks nicer, though, and might feel a little
more familiar to vim aficionados, but it has a few differences I just
can’t get past. If you’re interested, give both a try and see which
you prefer.
Here’s a handy cheat sheet for some basic tasks:
key(s) function
? help (super helpful!)
Arrows or hjkl move cursor
Ctrl-A move to top-left cell (A0)
= insert a number or formula
<, \, > insert left/center/right aligned text
{, |, } align existing text left/center/right
e, E edit number/string value
x, Del clear cell
ir, ic insert row/column
dr, dc delete row/column
P “put” (save)
G “get” (load)
If you’re familiar with Excel, you might want to add the following to
your ~/.scrc file:
set craction = 1
set numeric
This will enable the familiar behavior of automatically switching to
insert mode when you type a number, and advancing the cursor to the
next row down when you press Enter. This auto-insert only works for
numbers, though, since most of the other keys are taken by
vi-style commands.
Numeric expressions, formulas, and ranges also work much like Excel,
but row numbering starts at 0, and functions are preceded with an @
symbol, e.g. @sum(A0:A20). Also: a cell can contain both a number and a
label, which confused the heck out of me when I was first learning.
A common task when working with spreadsheets is to fill a block of
cells with a value, or a formula (with the row/column references
adjusted correspondingly). To do this, enter the value you want in the
first cell. Then, with the cursor over that cell, type c. – that’s c
followed by a period – move the cursor around to select the range to
fill in, and hit enter.
Alternately, to fill a block with different values, first type rf (for
range fill), select the block, hit colon or tab to switch to command
entry mode, and type the start and increment. For example, rf9j:3 3
fills the first few cells in column A with multiples of three. (For
those unfamiliar with vi notation, 9j there means “move down
nine times”.)
Another often-used range function is sorting; rs (range sort) does
that. If you just want to sort ascending by the first column in your
range, you’re in luck, because that’s all you need to remember. Just
select visually and hit enter, and presto, it’s sorted. Otherwise, the
incantation is a little bit on the esoteric side. I learn best from
examples, so here’s a few:
Type this … to sort like this:
rs:"+#c numeric values in column C, ascending
rs:"-$a-$b text in columns A and B, in reverse
rs:"+$d+#d either text or number in column D, ascending
The sort criteria is a text value with three pieces: the order (+ for
ascending, - for descending), which kind of value to look at (# for
numeric, $ for text), and the column to sort.
Pressing ‘f’ shifts to a format setup mode, which has its own key map.
Formats configured this way apply to the entire column, which is
generally what you want.
key(s) function
h/l, ←/→ adjust column width
j/k, ↓/↑ adjust decimal precision
0-9 set predefined numeric format
= define numeric format
Enter exit formatting mode
The predefined formats most likely to be useful for basic tasks are 0
(general number) and either 3 or 4 (dates). Format 4 uses four-digit
years, which is usually a good idea, but in a console where screen
space is scarce, sometimes shorter is better.
Setting a custom format is somewhat weird: press f=, enter the number
for the format you want to set, and then write the format string. (If
you don’t have set numeric enabled, you can also hit enter and type the
commands directly, and use the arrow keys to get to history items. This
is nice for experimenting with formats.) For an example, this
configures slot 7:
f=7$#,0.&
… as a “currency” type, which puts a dollar sign before the value and
uses the default field precision.
Custom date formats are similar, though it’s a bit of a hack as the
indicator of a date format is a literal Ctrl-D character. (Yes, it’s
weird.) Dates, by the way, are stored in predictable Unix fashion as
time_t values, and are formatted with strftime(). Since formats 3 and 4
are already preset for dates, let’s keep all the time values together
and define 5 and 6 for a date-time and time, respectively:
f=5^D%e %b
f=6^D%H:%M
(^D here denotes pressing Ctrl-D.) The %-codes are the same as
[15]strftime.
If you’d like to keep these formats permanently, you can put the
commands right into your ~/.scrc just like they were formatted. You’ll
have to take care with date formats though, because they do need that
literal Ctrl-D character.
format 5 = "^D%e %b"
format 6 = "^D%H:%M"
format 7 = "$#,0.&"
Fortunately, sc isn’t quite arcane enough to make you write all your
dates as time_t values for them to show up properly; there are a few
other ways of expressing the date and time. First and probably most
useful, a value like 2016.8.12 will be parsed as a date. (Note that the
year needs to be four digits.) This is permuted upon entry into
@dts(2016,8,12), which is a formula that spits out the time_t for
midnight on that date. There’s a similar @tts function for writing time
values – and you can even add the two together if you want to define a
date and time. It’s a bit awkward, but hey, it works, and the
scaffolding makes a lot more sense than Excel’s weird decimal numbers.
sc admittedly isn’t the prettiest program, either, but if you put set
color in your ~/.scrc, you can at the very least use a handful of
alternate color combinations, and even set some of your own. Try
entering a bunch of data, move to the top, and press rC (range Colors),
select a block, then hit colon and the number of the color you’d like.
Or rather, it’s a color pair, a somewhat awkward concept that got
inherited from curses, but the point is, each number is a cell style.
The defaults, though, are butt ugly:
sc default colors
If you want less gross colors, check out the manpage and edit ~/.scrc
accordingly.
There’s a couple other color-related settings you might be interested
in. set colorneg increments the color value by one if the value in the
cell is negative – in other words, if a cell is using the default color
1, negative numbers will display in color 2 instead. There’s also set
colorerr, which highlights formula errors in color 3. I use both of
these, and generally set colors 4-8 for headers and various other cells
that deserve some sort of attention, much like one might use bold or
italic text.
One last feature I will cover is framed ranges. This is a way to define
cells that “stick” when the spreadsheet scrolls, and in its basic form,
a framed range is roughly like Excel’s “freeze” feature. I find it most
useful to use the command line to define these, especially for larger
frames, but you can also select the ranges interactively if you prefer
by typing rra. Either way, the syntax is:
frame outrange inrange
where outrange and inrange are both ranges, e.g. A0:D50. Supposing
you’d like to have a “header” of column A and row 0 that stays on the
screen all the time, for the whole sheet. In this case, your outrange
would be A0:Z199 (or however far you want to extend it — I don’t think
it’s possible to say “the whole spreadsheet” here), and inrange would
correspondingly be B1:Z199. So the final syntax for this setup
would be:
frame A0:Z199 B1:Z199
… thus effectively locking the first row and first column so long as
the cursor is inside the inner range that you’ve defined. Frames can do
a lot, but this basic usage is sufficient for most of my needs, and
probably for yours as well.
There’s a lot more under the hood, especially if you take the time to
get to learn all the little nuances of how things work. It is worth
spending a weekend sifting through the documentation and experimenting
with all the commands. The range commands and row/column commands are
especially worth giving some attention.
Lastly, I should point out one important point about security: sc
provides multiple ways to embed the execution of arbitrary commands
into a spreadsheet. This can be powerful, but with great power comes
great responsibility — don’t just blindly load random spreadsheets you
found on the internet! (I considered making an example spreadsheet to
accompany this article, but decided against it for this reason.)
* Category: [16]Linux.
* [17]Permalink.
*
+ [18]linux
+ [19]text mode
+ [20]console
+ [21]programs
+ [22]spreadsheet
+ [23]sc
[24]If you liked this, consider backing my Patreon!
Comments
I hate to say this, but you'll need to use JavaScript for the comments.
Social
* [25]Atom feed
* [26]Twitter
* [27]GitHub
* [28]Bitbucket
* [29]Bandcamp
* [30]Patreon
Blogroll
* [31]Abort, Retry, Hack?
* [32]Amy
* [33]Chemical Girl
* [34]Daifukkkat.su
* [35]Dispatches From The Quinnspiracy
* [36]duangle
* [37]Futility Closet
* [38]fuzzy notepad
* [39]Hackerbots
* [40]Jeffrey Lim
* [41]Kyle Pulver
* [42]melbrarian
* [43]Mikitzune
* [44]mverdone
* [45]Square Island
* [46]Z303
* [47]Zinnia Jones
Proudly powered by [48]Pelican, which takes great advantage of
[49]Python.
References
1.
http://blog.startaylor.net/feed/all.atom.xml
2.
http://blog.startaylor.net/feed/linux.atom.xml
3.
http://blog.startaylor.net/
4.
http://blog.startaylor.net/
5.
http://blog.startaylor.net/archives/
6.
http://blog.startaylor.net/category/
7.
http://blog.startaylor.net/tag/
8.
http://blog.startaylor.net/2016/08/29/sc/
9.
https://unsplash.com/photos/SAfJ1eTBeyk
10.
http://blog.startaylor.net/2016/05/30/howto-console/
11.
https://github.com/n-t-roff/sc/
12.
https://github.com/msharov/sc/
13.
https://github.com/dkastner/sc/
14.
https://github.com/andmarti1424/sc-im/
15.
http://linux.die.net/man/3/strftime
16.
http://blog.startaylor.net/category/linux/
17.
http://blog.startaylor.net/2016/08/29/sc/
18.
http://blog.startaylor.net/tag/linux/
19.
http://blog.startaylor.net/tag/text-mode/
20.
http://blog.startaylor.net/tag/console/
21.
http://blog.startaylor.net/tag/programs/
22.
http://blog.startaylor.net/tag/spreadsheet/
23.
http://blog.startaylor.net/tag/sc/
24.
https://www.patreon.com/Storlek?ty=h
25.
http://blog.startaylor.net/feed/all.atom.xml
26.
https://twitter.com/0x5742/
27.
https://github.com/Storlek
28.
https://bitbucket.org/Storlek
29.
http://storlek.bandcamp.com/
30.
https://www.patreon.com/Storlek?ty=h
31.
https://marcan.st/
32.
https://medium.com/@keisisqrl
33.
https://achemicalgirl.wordpress.com/
34.
http://daifukkat.su/blog/
35.
http://ohdeargodbees.tumblr.com/
36.
http://blog.duangle.com/
37.
http://www.futilitycloset.com/
38.
http://eev.ee/blog/
39.
https://hackerbots.net/
40.
http://roartindon.blogspot.sg/
41.
http://kpulv.com/blog/
42.
https://melbournelibrarian.wordpress.com/
43.
http://mikitzune.com/
44.
http://mike.verdone.ca/blog3/
45.
http://blog.sqisland.com/
46.
http://z303.org/
47.
https://freethoughtblogs.com/zinniajones/
48.
http://getpelican.com/
49.
http://python.org/