aboutsummaryrefslogtreecommitdiff
path: root/fixterm
blob: 4f41b0ded3ecb612e0e1673adc62e54c3b281c63 (plain)
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
#!/usr/bin/perl -w

# For when a misbehaving curses app leaves xterm or urxvt in a state
# where it prints gibberish. This also can happen when a binary is
# catted to the terminal. If the sequence "Escape ( 0" gets printed,
# we get stuck in gibberish mode (there might be a couple other escape
# sequences that do the same).

# We get crap like this: 
# <┤⎼␌␤┌▒≤@└⎺┼⎺┌␋├␤:·/⎽␉⎺±␋├/▒┤␍␋⎺/␍⎼┤└┐┴1>$

# I *think* the explanation below is accurate:

# There are 2 character sets called G0 and G1. Either of these can be
# set to various settings. The normal setting is "United States". There's
# also a "United Kingdom" and "Special chars & line set". We can set G0
# and G1 to any of these, and switch between whatever G0 and G1 are with
# Esc(1 and Esc)1.

# When the terminal gets stuck in gibberish mode, what's happened is that
# "Special chars & line set" has become the active character set. The
# fix is to set both the "G0" and "G1" character sets to US.

# Reference:
# http://ascii-table.com/ansi-escape-sequences-vt-100.php

# urxvt and IIRC xterm actually support 4 character sets, G0 thru
# G3, any of which can be switched between various types. So fix
# all 4 here.

# This script seems to work OK for urxvt but not for xterm.
# For either, it fixes your shell... but on xterm, links is
# sometimes still messed up (and sometimes it isn't, I dunno
# what's different).

print chr(27).')B';
print chr(27).'(B';
print chr(27).'*B';
print chr(27).'+B';
print chr(27).'(1';