编程方式如何判断当前字体是否具有Powerline补丁?

4

我使用带有vim-airline的vim,可以使用修补过的字体来增强显示效果。

vim-airline

我还使用fish shell(如果您想使用zsh,因为它对于分析是等效的)和一个主题,该主题还使用修补过的字体。

我将我的dotfiles在线保存,并在不同的系统中使用它们。但在其中一些系统中,我没有修补过的字体。 我非常希望拥有通用的dotfiles,例如,如果当前字体未经修补,则不使用需要修补字体的主题。因此,在我的vimrc中,我禁用了使用修补字符的vim-airline。

是否有一种编程方法可以知道当前正在使用的字体是否被修补过,以便编写适用于所有情况的通用dotfiles?


这太酷了。一种方法可能是通过编程方式修补字体:https://github.com/powerline/fontpatcher(查看该网站可能会为解决您实际提出的问题提供线索)。 - Chris Kitching
实际上,阅读这篇文章:http://unix.stackexchange.com/questions/140327/can-we-patch-an-already-patched-font 听起来像是在已经打了补丁的字体上运行补丁程序是没有意义的。因此,您可以通过复制字体文件、打补丁并将md5sum与原始文件进行比较来实现您想要的效果。如果文件没有更改,则已经打过补丁;如果有更改,则没有。 - Chris Kitching
如果你已经将补丁文件复制到系统中,那么最好再迈出一步,直接在终端仿真器中配置使用该补丁字体。 - chepner
2个回答

5
在Vim中,您需要直接询问终端仿真器当前使用的字体。确切的方法肯定因终端和操作系统而异。如果可能的话。
如果您在所有系统上都拥有它,您可以使用lsof查找给定程序当前使用的字体。
$ lsof | grep iTerm | grep '\.\(otf\|ttf\)'

在GVim/MacVim中,你可以通过以下方式检查当前字体名称是否与某个模式匹配:
if &guifont =~? 'powerline'
    " do something
else
    " do something else
endif

假设你的字体文件名包含那个模式,这是前提条件。

但是,不可能保证实际的“powerline字体”在文件名中包含powerline,同样也不可能保证在文件名中包含powerline的字体就是实际的“powerline字体”。

更安全的方法是检查字体中是否存在Powerline字符串,类似于:

$ xxd ~/Downloads/FuraMono-Bold\ Powerline.otf | grep Powerline

但这是基于以下假设:

  • xxd 已经可用,
  • 您能够从终端模拟器或 GVim/MacVim 中收集到的信息中推导出实际字体的路径。

这是很多假设,似乎为了一个表面上的“powerline字体”而付出了很多努力。


Vim自带xxd,但其余部分仍然有效 :) - D. Ben Knoble

2

您可以反过来做,只在已知的机器上通过 .vimrc 启用 Powerline 字体,例如:

let hostname = substitute(system('hostname'), '\n', '', '')
let patched_font_hosts = ['host1', 'host2', 'host3']   " List of know patched hosts
if(index(patched_font_hosts, hostname) >= 0)
  let g:airline_powerline_fonts = 1
endif

如果您已经打了补丁,那么知道哪些主机已经打了补丁会更容易,而且如果列表不是最新的也不是真正的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接