* * * * *

                 Proportional fonts for coding? No thank you

There's some back and forth in the Gemini [1] community about coding with a
proportional font [2]. You can pry my monospace font from my cold dead hands.

I've been coding for nearly 40 years now, and it's always been some form of a
monospace font, some pretty, like the character set for VGA (Video Graphics
Array) on IBM (International Business Machine) PC (Personal Computer)s, and
some not to pretty, like the character set on the TRS (Tandy-Radio Shack)-80
Color Computer. Code in a proportional font just looks weird to me.

My first language was BASIC on the TRS-80 Color Computer, and due to
limitations on the video screen and memory constraints, pretty much any non-
trivial BASIC program ends up looking something like;

-----[ BASIC ]-----
1445 X=FREE(PEEK(4670)):Y=FREE(P
EEK(4671)):IF X<2ORY<2 THEN PRIN
T"MESSAGE BASE FULL!":RETURN :EL
SE IFML>0THEN P$="10000000":GOTO
1450:ELSEIFPF=0THEN P$="00000000
":GOTO1450:ELSEPRINT"MESSAGE PRI
VATE (Y/N)? ";:GOSUB625
1446 IFCH$="Y"THEN P$="10000000"
:PRINT"YES":ELSEIFCH$="N"THEN P$
="00000000":PRINT"NO":ELSEGOSUB6
25:GOTO1446
1450 K=LEN(MF$)+LEN(MT$)+LEN(MS$
)+2:IFK>64THENPRINT"SUBJECT TOO
LONG":PRINT"LIMIT TO ";64-LEN(MF
$)-LEN(MT$)-2:PRINT"TRUNICATING.
" :ELSE 1452
1451 IFLEFT$(MS$,5)="REPLY"THEN
MS$=RIGHT$(MS$,LEN(MS$)-(K-64))
:ELSE MS$=LEFT$(MS$,LEN(MS$)-(K-
64)):GOTO1450
1452 GOSUB25:PRINT:PRINT:PRINTTA
B(5)"FROM: ";MF$:PRINTTAB(5)"  T
O: ";MT$:PRINTTAB(5)"SUBJ: ";MS$
1453 IFP$="10000000"THENPRINTTAB
(5)"PRIVATE MESSAGE":ELSEPRINTTA
B(5)"PUBLIC MESSAGE"
1455 IF ML=2 THEN 1465 :ELSE PRI
NT:PRINT"CORRECT (Y/N)? ";
1460 GOSUB600:K=INSTR("NnYy",CH$
):IFK>2THENPRINT"YES":GOTO1463:E
LSEIFK>0THEN1415:ELSE1460
1463 PRINT:PRINT
1465 PRINT:PRINT"ENTER MESSAGE.
MAXIMUM OF 2000":PRINT"BYTES. MA
XIMUM OF 40 LINES.":PRINT"PRESS
<ENTER> ON LINE BY ITSELF":PRINT
"TO EXIT.":PRINT:LE=0:EXEC&H10DA
-----[ END OF LINE ]-----

Yes, you can pretty much get used to any type of formatting if you have to.
Fortunately, you no longer have to.

The next few languages I picked up were various assembly languages, which are
nearly always vertically aligned:

-----[ Assembly ]-----
;--------------------------------------------------------
;       SPHEX4          Display a signed word as hex
;Entry: D - word
;       U - buffer
;Exit:  U - U + 4 (or 5)
;--------------------------------------------------------

sphex4          tsta                    ; negative?
               bpl     sphex42         ; nope
               stb     ,-s             ; save B
               ldb     #'-             ; print leading minus
               stb     ,u+
               ldb     ,s+
               coma                    ; negate D
               comb
               addd    #1
sphex42         bsr     phex2           ; print high byte
               tfr     b,a             ; now print low byte
               bra     phex2
-----[ END OF LINE ]-----

The decade or so of this left me with an “assembly accent” (which you can
pick up on in this post [3]). That, along with some other … quirks in
formatting, makes it pretty easy to tell I've been working on the code. I've
been developing my C style for over 30 years, and my opinion on “code
formatters” is … well … if I didn't want opinions, I'd join a cult. More
opinionated—if you have no coding style of your own, you have no soul and
probably enjoy The Enterprise Agile being shoved down your throat [Tell us
how you really feel! —Editor]. Or at least don't mind it.

But getting back to coding with a proportional font. The original article
presents the same code fragment in a monospace font:

-----[ Dart ]-----
import 'dart:io';

/// Replaces typewriter quotes and double dashes in all '.gmi' files under
/// the specified path with their nicer unicode equivalents.
///
/// Usage: dart fix_typography.dart <root path>

void main(List<String> arguments) {
 final gmis = Directory(arguments[0])
     .listSync(recursive: true)
     .whereType<File>()
     .where((f) => f.path.endsWith('.gmi'));
 for (final gmi in gmis) {
   print('Fixing ${gmi.path}.');
   final lines = gmi.readAsLinesSync();
   var skip = false;
   for (var i = 0; i != lines.length; ++i) {
     var line = lines[i];
     if (line.startsWith('```')) {
       skip = !skip;
       continue;
     }
     if (skip) continue;
     line = line.replaceAll("'","’");
     line = line.replaceAll('--','—');
     line = line.replaceAllMapped(RegExp(r'"(\w)'), (m) => '"${m.group(1)}');
     line = line.replaceAllMapped(RegExp(r'(\w)"'), (m) => '${m.group(1)}"');
     lines[i] = line;
   }
   gmi.writeAsStringSync(lines.join('\n'));
 }
}
-----[ END OF LINE ]-----

(Typos mine as this is transcribed from an image; also, sans syntax
highlighting.)

And in a proportional font:

-----[ Dart ]-----
import 'dart:io';

/// Replaces typewriter quotes and double dashes in all '.gmi' files under
/// the specified path with their nicer unicode equivalents.
///
/// Usage: dart fix_typography.dart <root path>

void main(List<String> arguments) {
 final gmis = Directory(arguments[0])
     .listSync(recursive: true)
     .whereType<File>()
     .where((f) => f.path.endsWith('.gmi'));
 for (final gmi in gmis) {
   print('Fixing ${gmi.path}.');
   final lines = gmi.readAsLinesSync();
   var skip = false;
   for (var i = 0; i != lines.length; ++i) {
     var line = lines[i];
     if (line.startsWith('```')) {
       skip = !skip;
       continue;
     }
     if (skip) continue;
     line = line.replaceAll("'","’");
     line = line.replaceAll('--','—');
     line = line.replaceAllMapped(RegExp(r'"(\w)'), (m) => '"${m.group(1)}');
     line = line.replaceAllMapped(RegExp(r'(\w)"'), (m) => '${m.group(1)}"');
     lines[i] = line;
   }
   gmi.writeAsStringSync(lines.join('\n'));
 }
}
-----[ END OF LINE ]-----

To me, the proportional font crushes the indentation too much for my liking,
making it harder for me to “see” the structure of the code. Of course, the
original image has low-contrast vertical bars showing each indenting level,
but I suspect that's an IDE (Integrated Deveopment Environment)-specific
thing to help show the structure (I'm not a fan of IDEs for various reasons
[4]). And using color for information isn't exactly nice to the color-blind.
Why not italic for variables? Bold for keywords? You're already using a
proportional font, you might as well use font properties for visual
information, but I digress. It just looks too scrunched up for my liking.

I think this just comes down to it's totally alien to my way of thinking [5]


[1] https://gemini.circumlunar.space/
[2] gemini://clanmorgan.org/gemlog/2023-05-09-proportional-coding.gmi
[3] gopher://gopher.conman.org/0Phlog:2023/03/22.1
[4] gopher://gopher.conman.org/0Phlog:2012/01/12.1
[5] gopher://gopher.conman.org/0Phlog:2009/11/02.1

Email author at [email protected]