如何在vimrc中轻松测试guifont?

13

我需要经常登录许多不同的机器,但它们都没有相同的漂亮字体。所以,我希望能够设置首选字体,如果在该机器上不存在该字体,则使用其他字体,以此类推。是否有人尝试过这样做?

...

所以在重新阅读了guifont的帮助文件之后,我发现应该可以通过逗号将多个字体定义分开。有趣的是,我在我的.vimrc文件中有以下一行:

set guifont=-dt-interface\ user-medium-r-normal-*-*-100-*-*-m-*-iso8859-1,Liberation\ Mono\ 8

在一台机器上(gvim 7.1),我执行了以下操作:

:set gfn?
guifont=-dt-interface user-medium-r-normal-*-*-100-*-*-m-*-iso8859-1

在另一台机器上(gvim 7.2),我得到以下结果:

:set gfn?
guifont=-dt-interface user-medium-r-normal-*-*-100-*-*-m-*-iso8859-1,Liberation Mono 8

我将尝试在错误的机器上运行7.1版本,查看是否可以解决问题,如果可以,那么这不是7.2版本的bug吗?


解决方案

以下是我编写的代码来解决问题。它似乎非常脆弱,但至少让我现在能够继续进行我的实际工作:

" SETTINGS FOR GUI ONLY MODE
: Trying to emulate how it should work but on some machines it will not select the available font
" set guifont=-dt-interface\ user-medium-r-normal-*-*-100-*-*-m-*-iso8859-1,Liberation\ Mono\ 8
let g:MyFontPre = ''
let g:MyFontPost = ''
let g:MyFontSize = '8'
if has("gui_running")
    if ( match(hostname(), 'server5-1..') >= 0 )
      let g:MyFontSize = '10'
      let g:MyFontPre = '-dt-interface\ user-medium-r-normal-*-*-'
      let g:MyFontPost = '0-*-*-m-*-iso8859-1'
    elseif ( match(hostname(), 'server5-3..') >= 0 )
      let g:MyFontPre = 'Liberation\ Mono\ '
      let g:MyFontPost = ''
    else
      " Leave it the default for now
    endif
    execute "set guifont=".g:MyFontPre."".g:MyFontSize."".g:MyFontPost
endif


" FONT SIZE SHORTCUTS
function! ToggleMyFontSize()
  if ( g:MyFontSize == 12 )
    let g:MyFontSize = 8
    execute "set guifont=".g:MyFontPre."".g:MyFontSize."".g:MyFontPost
  elseif ( g:MyFontSize == 8 )
    let g:MyFontSize = 10
    execute "set guifont=".g:MyFontPre."".g:MyFontSize."".g:MyFontPost
  elseif ( g:MyFontSize == 10 )
    let g:MyFontSize = 12
    execute "set guifont=".g:MyFontPre."".g:MyFontSize."".g:MyFontPost
  endif
endfunction
nnoremap  <silent>  <F12> :call ToggleMyFontSize()<CR>

因此,该机器上可用的vim的另一个版本是7.0,并且它提供了与我之前在7.2中看到的相同的行为...非常奇怪。这一定是与为该特定机器编译事物的方式有关?!?!还有其他人有什么想法吗?同时,我正在基于“太多php”的建议寻找解决方案。 - stephenmm
我认为我的IT部门也应该使用字体服务器xfs,这样所有的机器都可以使用相同的字体。我已经提交了一个申请让他们这样做。他们在这里谈论xfs:http://tldp.org/HOWTO/NCD-X-Terminal-6.html - stephenmm
另外,如果您想使用正则表达式,可以像这样做:如果hostname()=~'server5-1..' - too much php
最好将解决方案作为下面的答案发布,而不是作为对原始问题的编辑。这样,它可以像其他解决方案一样接受赞成或反对票。 - ggorlen
4个回答

9
如果逗号不能满足您的要求,那么如何做才能使字体优雅地降级呢?这个技巧也可以用于其他“设置”选项。
silent! set guifont=Font\ One:h8
if &guifont != 'Font One:h8'
    set guifont=Font\ Two:h8
endif

6

虽然不能直接解决您的问题,但您可以使用hostname()和条件语句来选择所需字体:

  if hostname() == 'home-pc'
      set guifont=...
  elseif hostname() == 'work-pc'
      set guifont=...
  else
      set guifont=...
  endif

抱歉,那......太糟糕了。不行。整个重点应该是使在你不太了解或没有时间完全按照你想要的配置机器上轻松设置Vim成为可能。 - Kyle Strand

1

你也可以将所有常用设置放在.vimrc中,并在特定机器的.gvimrc中选择字体(如果你是Windows用户,请使用_vimrc_gvimrc)。

我知道这不是对你问题的直接回答,但我认为指出这一点很值得。 :)


好主意;我通过在我的~/.vimrc中使用source ~/local/.vimrc来实现这一点。 - Ingo Karkat

0

仅适用于Unix系统,在Linux上进行了测试。我猜这也可以在OSX上运行,但我从未使用过OSX,抱歉。

let font = {"name" : "fontNameHere", "size" : "12"}
call system("fc-list -q " . font.name)
if has("unix") && !v:shell_error
    let &guifont=join(values(font))
end

只需在字典中用您想要的字体名称和大小替换即可 - 例如,

let font = {"name" : "DejaVuSansMono", "size" : "12"}

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