Skip to content

Instantly share code, notes, and snippets.

@evocateur
Created March 15, 2009 00:15
Show Gist options
  • Save evocateur/79238 to your computer and use it in GitHub Desktop.
Save evocateur/79238 to your computer and use it in GitHub Desktop.
Fix Consolas's line-height on OS X
#!/bin/bash
#
# Requires ftxdumperfuser from http://developer.apple.com/textfonts/download/
#
# Usage: fixconsolas [files ...]
# When called with no arguments, it attempts to operate on every TrueType
# file in the current directory.
#
# References:
# http://bandes-storch.net/blog/2008/12/21/consolas-controlled/#comment-2042
# http://lists.macromates.com/textmate/2009-March/028282.html
# test for ftxdumperfuser in PATH
ftxdumperfuser &>/dev/null
if [ $? -eq 127 ]; then
echo "The ftxdumperfuser utility was not found!"
echo "Please download and install to continue:"
echo " http://developer.apple.com/textfonts/download/"
exit $?
fi
# protect against spaces in filenames
# hat tip Alexey Blinov
# and http://tldp.org/LDP/abs/html/internalvariables.html#IFSH
IFS=$'\n'
if [ $# -eq 0 ]; then
# when no arguments passed,
# set positional parameters
# to ttf in current directory
set -- $(ls *.[Tt][Tt][Ff])
fi
unset IFS # reset to default
E_NOARGS=85
if [ -z "$1" ]; then
echo "Error: No TrueType font files found!"
echo "Usage: `basename $0` [Consolas.ttf]"
exit $E_NOARGS
fi
ASC="1884" # ascender
DSC="514" # descender, already negative in file
GAP="0" # lineGap
D='[0-9]\{1,\}' # BRE equivalent of PCRE \d+
# iterate through positional parameters
for font
do
# error-checking, what a concept
if [ ! -e "$font" ]; then
echo "$font does not exist."
continue
fi
# dump hhea table
ftxdumperfuser -t hhea "$font" | \
# replace desired values
sed \
-e "/ascender=/s/$D/$ASC/" \
-e "/descender=/s/$D/$DSC/" \
-e "/lineGap=/s/$D/$GAP/" | \
# fuse hhea table back into font
ftxdumperfuser -F -t hhea "$font"
echo "Fixed $font"
done
exit $?
@erikarvstedt
Copy link

In case anyone wants a python solution...

Awesome, that fixed consolas for me in Emacs/X11, where the glyphs appeared shifted upwards, touching the top of the mode line.
I prefer the following parameters, which fix the shift and only slightly increase the line height:

shift_down = 100
extra_ascent = 100
tt['hhea'].ascent += shift_down + extra_ascent
tt['hhea'].descent += shift_down
# tt['hhea'].lineGap in unchanged

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment