Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support native macOS monospace font (SF Mono) #1463

Merged
merged 1 commit into from
Dec 8, 2023

Conversation

ychin
Copy link
Member

@ychin ychin commented Dec 7, 2023

Can now set guifont to -monospace- to use the system default monospace font, which is SF Mono on recent macOS versions (but could be updated to other fonts in future macOS releases). The reason why this is necessary instead of specifying the actual font name is that Apple does not expose the SF Mono font for the user and instead only exposes an AppKit API monospacedSystemFontOfSize:weight: to access it. The actual font name (.AppleSystemUIFontMonospaced in macOS 14) is internal and subject to change in different OS versions.

In older macOS versions, setting -monospace- will just use Menlo-Regular just like the default font.

Also allow specifying the font weight for the font, e.g. -monospace-Semibold / -monospace-Light. The list of weights follows the NSFontWeight enum, but not all values yield unique fonts. E.g. "UltraLight", "Thin", "Light" will all use the "Light" version of SF Mono. The list of all font weights can be tab-completed but only if the user has already filled in -monospace- in :set guifont=. This helps prevents showing too many options when the user does tab completion just to see the list of all fonts.

Note that SF Mono is currently available to be downloaded from Apple's website as a standalone for testing. That font is mostly the same but seems to have slightly different line spacing behavior, and when using bold it uses the "Bold" font variant, whereas the system monospace font uses "Semibold" variant instead.

Also make font panel not show misc formatting options like underline as they aren't used by MacVim. Keep the background/foreground option just so the font preview colors in the panel can be adjusted.

Also fix an existing potential buffer overflow issue in the Core Text renderer in that changeFont: (when setting a new font using font panel or using font size up/down) isn't setting wideLen which could cause an unsafe memory access in Vim side.

Notes:

  • Known issue: When using macaction fontSizeUp:/fontSizeDown: (Cmd +/-), -monospace- will get replaced by the internal font name (e.g. .AppleSystemUIFontMonospaced-Regular) instead due to how the changeFont: currently works. This could be fixed but it's low enough priority that it's ok for now.
  • In the future, this may become the default font instead of Menlo, to make MacVim more consistent with Apple software like Terminal and Xcode.

@ychin ychin added this to the Release 179 milestone Dec 7, 2023
Can now set guifont to `-monospace-` to use the system default monospace
font, which is SF Mono on recent macOS versions (but could be updated to
other fonts in future macOS releases). The reason why this is necessary
instead of specifying the actual font name is that Apple does not expose
the SF Mono font for the user and instead only exposes an AppKit API
`monospacedSystemFontOfSize:weight:` to access it. The actual font name
(`.AppleSystemUIFontMonospaced` in macOS 14) is internal and subject to
change in different OS versions.

In older macOS versions, setting `-monospace-` will just use
`Menlo-Regular` just like the default font.

Also allow specifying the font weight for the font, e.g.
`-monospace-Semibold` / `-monospace-Light`. The list of weights follows
the NSFontWeight enum, but not all values yield unique fonts. E.g.
"UltraLight", "Thin", "Light" will all use the "Light" version of SF
Mono. The list of all font weights can be tab-completed but only if the
user has already filled in `-monospace-` in `:set guifont=`. This helps
prevents showing too many options when the user does tab completion just
to see the list of all fonts.

Note that SF Mono is currently available to be downloaded from Apple's
website as a standalone for testing. That font is mostly the same but
seems to have slightly different line spacing behavior, and when using
bold it uses the "Bold" font variant, whereas the system monospace font
uses "Semibold" variant instead.

Also make font panel not show misc formatting options like underline as
they aren't used by MacVim. Keep the background/foreground option just
so the font preview colors in the panel can be adjusted.

Also fix an existing potential buffer overflow issue in the Core Text
renderer in that `changeFont:` (when setting a new font using font panel
or using font size up/down) isn't setting `wideLen` which could cause an
unsafe memory access in Vim side.

Notes:
- Known issue: When using macaction `fontSizeUp:`/`fontSizeDown:` (Cmd
  +/-), `-monospace-` will get replaced by the internal font name (e.g.
  `.AppleSystemUIFontMonospaced-Regular`) instead due to how the
  `changeFont:` currently works. This could be fixed but it's low enough
  priority that it's ok for now.
- In the future, this may become the default font instead of Menlo, to
  make MacVim more consistent with Apple software like Terminal and
  Xcode.
@ychin ychin force-pushed the guifont-system-monospace branch from 8d68a01 to f449e0d Compare December 8, 2023 01:43
@ychin ychin merged commit 78cef1b into macvim-dev:master Dec 8, 2023
4 checks passed
@ychin ychin deleted the guifont-system-monospace branch December 8, 2023 10:09
ychin added a commit that referenced this pull request Jan 5, 2024
Updated to Vim 9.1.0

Vim 9.1 is now released! See
[announcement](https://www.vim.org/vim-9.1-released.php).

Features
====================

System monospace font (SF Mono)
--------------------

MacVim's `guifont` option now supports a new `-monospace-` value, which
instructs it to use the system monospace font, which is SF Mono in
recent macOS versions. As mentioned below, you can now use
tab-completion to see the available values in cmdline. See `:h
macvim-guifont` for more details on how to use it (including using
different font weights). #1463

Note: I'm contemplating changing the MacVim defaults to use
`-monospace-` in the future so MacVim will always use the native
monospace font instead of being hard-coded to Menlo. This makes it more
consistent with Apple Terminal and Xcode. Feel free to leave a comment
on #1277 if you have opinions on this.

New Vim features
--------------------

- Command-line tab completion improvements and bug fixes
    - Most string option values can now be completed. v9.0.1958
    - MacVim options (guifont, fuoptions) also support tab completion.
      #1436
    - ++opt (e.g. `:e ++`) and `:terminal ++` completion works as well.
      v9.0.2025
- New options:
    - `set jumpoptions=stack`. Ported from Neovim. v9.0.1921
- API changes
    - `getmousepos()` returns a new "coladd" for tab characters.
      v9.0.2032
- `:Man` now works properly when `gdefault` is set.
- A new small Vim script library that may expand in the future. See `:h
  vim-script-library`.
- Vim9 script improvements.
- Miscellaneous security fixes.

Misc
--------------------

New settings:

- "Scroll in one direction only" (Input). Prevents accidental horizontal
  scrolling when scrolling vertically using a trackpad. #1442

Clean mode (#1453):

- Vim can be opened in clean mode (does not use .vimrc or plugins) via
  the new menu item "New Clean Window". The new menu isn't localized in
  most languages. Please comment on the issue if you would like to help
  in localization.
- MacVim can be launched without loading user defaults for a clean
  experience via a command-line flag. See `:h macvim-settings`.

General
====================

- Sparkle (updater for MacVim) is now updated to 2.5.2. The updater can
  now show multiple release notes when updating MacVim across multiple
  versions. #1446 #1469
- Binary release is now built with more optimized compiler settings. Vim
  will now run slightly faster than before. #1444
- macOS 14 Sonoma:
    - Binary release is now built using the macOS 14 SDK (#1434, #1440,
      #1448). One small change is that very tall characters (e.g. "นี้")
      on the first line will now draw into the title bar instead of
      being clipped.
    - Fixed printing with `:hardcopy` under macOS 14. *NOTE:* Starting
      from macOS 14, you have to install `ps2pdf` (available from
      Ghostscript) yourself before you can print. See #1464
- Python 2 support: The default location for locating the Python 2 lib
  in the binary release is now under /Library/Frameworks rather than
  /usr/local. Note: Python 2 has long been obsolete. If you rely on
  Python 2 plugins, consider this a warning as it's only supported as
  long as it's feasible and could be removed in the future. #1434

Fixes
====================

- Fixed non-native full screen mode when using a MacBook with a notch
  and having the "Show menu bar in non-native mode" option set. Changing
  the screen resolution while using non-native full screen also works
  properly now. #1450
- Fixed Help menu's documentation search not working with tags with
  special characters like `<Down>`. #1455

Compatibility
====================

Requires macOS 10.9 or above. (10.9 - 10.12 requires downloading a
separate legacy build)

Script interfaces have compatibility with these versions:

- Lua 5.4
- Perl 5.30
- Python2 2.7
- Python3 3.9 or above
- Ruby 3.2
@etiennebarrie
Copy link

Hey! This is great, but I'm seeing weird results in terms of line height/line spacing. Opening up Terminal.app using SF Mono side-by-side with MacVim, I need to change the line spacing to 0.88 to get the same results:
image

Put another way, there's a bit too much line spacing on MacVim, when I change from SF\ Mono\ Regular (that I get with Homebrew) to -monospace-, I can see fewer lines.

@ychin
Copy link
Member Author

ychin commented Jan 10, 2024

I have noticed something like this before as well, and I don't really know why. In particular, at lower font sizes (11 pts or less) they seem to have the same line heights, but at higher font sizes, the -monospace- font seems to use a line spacing.

Another discrepancy is that -monospace- seems to use a Medium weight for bolded font, but the downloaded "SF Mono" font uses the Bold weight for bolded font.

I think Apple may have just configured the default -monospace- font differently from the downloadable SF Mono font but I do think this is kind of annoying. I may have to ask on Apple Developers forum but I don't think MacVim doing anything wrong per se.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants