6

vim 手册指出:

    On systems where 'guifontset' is supported (X11) and 'guifontset' is
not empty, then 'guifont' is not used.

Spaces after a comma are ignored.  To include a comma in a font name
precede it with a backslash.  Setting an option requires an extra
backslash before a space and a backslash.  See also
|option-backslash|.  For example: >
    :set guifont=Screen15,\ 7x13,font\\,with\\,commas
will make Vim try to use the font "Screen15" first, and if it fails it
will try to use "7x13" and then "font,with,commas" instead.

所以,我想做以下事情:

if has("gui_running")
  if has("gui_gtk2")
       set guifont=Droid\ Sans\ Mono,Inconsolata,Monospace
  elseif has("gui_win32")
    set guifont=Droid\ Sans\ Mono:h10,Consolas:h11:cANSI
  endif
endif

麻烦的是它对我不起作用...我已经在 CentOS6.3 和 Debian Wheey 上尝试了几个小时,但是当我像这样编写这个命令时,VIM 只会以 Sans 字体开始。难道我做错了什么?您如何巧妙地检测系统上有哪些字体?

4

3 回答 3

5

好的,我知道这可能不是正确的方法,但它确实有效。所以,这是我为 VIM-GTK 设置后备字体的方法:

if has("gui_running")
   if has("gui_gtk2")
        let dsm=system('fc-list | grep -c Droid\ Sans\ Mono')
        let cons=system('fc-list | grep -c Inconsola')
        if ( dsm > 0)
           set gfn=Droid\ Sans\ Mono\ 10
        elseif ( cons > 0)
           set gfn=Inconsolata\ 12
        else 
           set gfn=Monospace\ 10
        endif
   elseif has("gui_win32")
      set guifont=Droid\ Sans\ Mono:h10,Consolas:h11:cANSI
   endif
endif

此代码段将检查是否Droid Sans Mono已安装,以及是否Inconsolata已安装。如果第一个是安装的,UI 字体会是Droid Sans Mono,否则会被设置为Inconsolata,最后会被设置为Monospace。在 Windows 7 上,逗号分隔的列表可以正常工作。

于 2013-03-29T15:13:50.277 回答
1

I ran into the same issue. The problem here is that when Vim calls gui_init_font (code) it expects if gui_mch_get_font (code) fails it can move on to the next font in the comma-separated list. But in GTK gui_mch_get_font calls pango_font_description_from_string (code) which will never fail, it'll just return a default.

But pango_font_description_from_string itself takes a comma-separated list of families followed by style options, size and variations and has its own fallback logic (doc) withe the following format: [FAMILY-LIST] [STYLE-OPTIONS] [SIZE] [VARIATIONS]. Thus escape your list as follows:

if has("gui_running")
  if has("gui_gtk2") || has("gui_gtk3")
    set guifont=Droid\ Sans\ Mono\\,Inconsolata\\,Monospace 10
  elseif has("gui_win32")
    set guifont=Droid\ Sans\ Mono:h10,Consolas:h11:cANSI
  endif
endif

Then Pango will do the fallback work and pick the right font for you. On GTK it seems to be best to fully escape your string and let GTK do the logic.

于 2020-12-11T13:35:22.430 回答
0

我要么未能将Oz123 的答案正确抽象为函数,要么无法在我的系统上运行。由于实际使用了两个用户(一个沙盒网络用户和我的主帐户),我遇到了其他问题;执行时出现问题fc-list)。

我的解决方法是重新分配 Monospace 字体的别名,这会影响我的所有应用程序(如果您只希望它在 gvim 中工作,请不要使用此技术)。

这种变化进入~/.config/fontconfig/fonts.conf

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
  <alias>
    <family>monospace</family>
    <prefer><family>Panic Sans</family></prefer>
  </alias>
</fontconfig>

我选择了Panic Sans这里非官方托管),它是一种非常流行的免费DejaVu Sans Mono字体的变体,因为它特别擅长渲染代码(它还解决了 DejaVu 中的下划线和破折号问题)。字体文件本身位于我的~/.fonts/Panic_Sans目录中。

以这种方式安装它可以让我~/.vimrc在系统之间共享我的,而不必担心是否在它们上安装了 Panic Sans。

这意味着 my ~/.vimrcnow 仅包含:

if has("gui_running")
  if has("gui_gtk2")
    set guifont=Monospace\ 7
  endif
  " …

这是因为 fontconfig 别名正确地将 Monospace 与 Panic Sans 匹配:

$ fc-match Monospace
PanicSans.ttf: "Panic Sans" "Regular"
于 2017-10-25T17:52:35.207 回答