支持非等宽字体、屏幕取词的gvim v7.3

关于更适合中文用户、更适合非编程用户的vim的讨论(12)终于取得了一点实质性结果:支持非等款字体支持金山词霸、有道词典取词的 windows gvim.exe v7.3 终于出现了。感谢 Dieken、湖间小筑的技术研究、动手制作。
[image]支持金山词霸取词的gvim修改版

一、gvim的屏幕取词

问题描述:
  Windows下,金山词霸、有道词典启用屏幕取词功能,但在gvim窗口中无法取词,或不能准确地取出完整单词。
原因分析:
  程序沟通问题。
  跨平台、跨语言的gvim考虑了更复杂的情况(但没有区分):并非所有文字都是从左向右阅读,某些语言会从右向左,如阿拉伯语等。而金山词霸、有道未充分考虑此情况。

Dieken @ newsmth,2007-01-29, via

gvim 7.0.188 版本 gui_w32.c:gui_mch_draw_string():2255 这两行判断太严格了:
if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)
foptions |= ETO_IGNORELANGUAGE;

这个是为了 Hebrew 和 Arabic 文本加的,但是并没有加这个的判断, 我用
if (
#ifdef FEAT_RIGHTLEFT
curwin->w_p_rl &&
#endif
os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)
foptions |= ETO_IGNORELANGUAGE;
实验了一下,在有两个窗口,一个没有设置 rightleft,一个设置了rightleft,当光标处于后者时,还是不能取词,需要光标挪到没有设置 rightleft 的窗口内才行,这个问题还不知道怎么改,交给邮件列表处理。

对于大多数人来说,不会用到 rightleft 特性,所以可以直接把那两句注释掉,然后就可以正常取词了。

二、gvim支持非等款字体

说明一:gvim 并非不能支持非等宽字体,而是在编译时,默认忽略了非等宽字体(Ignore non-monospace fonts without further ado)。在多个平台中,gtk2下的gvim是默认支持非等宽字体的,其他平台默认不支持。

说明二:无论字体是否等宽,vim都会重新对齐。即显示效果仍然是等宽的。因此,『支持非等宽字体』的gvim,可以换用更丰富的字体,并不可以得到非等宽效果。

解决办法一:非等宽字体编译时加 -DFEAT_PROPORTIONAL_FONTS 就可以了。make 的时候加一个参数。[via milksea @ newsmth](这2句话是同一回事吗?哪位帮助整理成更准确、书面语的表述?)

解决办法二:修改源代码,取消对非等宽字体的忽略。比如,在 os_mswin.c 中查找mono,会看到一处注释说忽略非等宽字体(Ignore non-monospace fonts without further ado),把下面一行注释掉即可。via

三、下载及讨论

支持非等宽字体、支持屏幕取词的 gvim.exe v7.3 下载,及相关讨论,敬请访问
让win下的vim支持非等宽字体|湖间小筑

====
(完。初稿2007-01-23;更新2009-02-06;更新2009-05-07;更新2010-09-19)>

《支持非等宽字体、屏幕取词的gvim v7.3》有20个想法

  1. 对于非等宽字体的修改,并不是在os_win.c里面,而是os_mswin.c
    (xbeta注:多谢,本文已改正。
    另对非等宽字体一节补充了更多信息。 )

  2. 说明二:无论字体是否等宽,vim都会重新对齐。即显示效果仍然是等宽的。因此,『支持非等宽字体』的gvim,可以换用更丰富的字体,并不可以得到非等宽效果。
    ————————————————————————
    即便是用了非等宽的字体,效果还是等宽的,很多字母重叠在一起,效果反而更差了

    1. VIM根本不支持非等宽的,主要为了计算方便,特别是换行的时候,支持非等宽字体会浪费额外的内存。

        1. 这个仅仅是说我可以显示了,但是你输入i和M的宽度是一样的,看起来会很丑,基本上没人会用的

  3. 使用非等宽中文字体,在 Makefile 中加 -DFEAT_PROPORTIONAL_FONTS 选项:
    o Make_ming.mak 在
    # See feature.h for a list of options.
    # Any other defines can be included here.
    之后的
    DEFINES=-DWIN32 -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER)
    -DHAVE_PATHDEF -DFEAT_$(FEATURES)
    之后插入
    DEFINES+=-DFEAT_PROPORTIONAL_FONTS
    o Make_mvc.mak 在
    INCL = vim.h os_win32.h ascii.h feature.h globals.h keymap.h macros.h
    proto.h option.h structs.h term.h $(SNIFF_INCL) $(CSCOPE_INCL)
    $(NBDEBUG_INCL)
    前插入
    CFLAGS = $(CFLAGS) -DFEAT_PROPORTIONAL_FONTS
    不用修改源代码。

  4. 我编译了个 gvim for win32, 与官方版的不同有以下几点:
    * 使用 mingw32 编译
    * 使用目前最新版(7.3.75)的 vim 源代码编译
    * 支持非等宽字体
    * 用 :set guifont=* 打开的字体选择对话框中的字体列表包含非等宽字体
    * 关闭不常用的 ole, xpm_w32 特性, 由于关闭了 ole 特性, 所以可以作绿色软件使用
    * 关闭 arabic, farsi, rightleft 特性, 以支持金山词霸等的屏幕取词
    * 解决了 encoding 设置为 utf-8 时使用如 :!echo 中文 命令的乱码问题
    * 解决了 encoding 设置为 utf-8 时气泡提示的乱码问题
    * 打开了 lua/dyn 特性
    * 使用目前最新版的 python, python3, perl, tcl, lua, ruby 编译 vim 的相应支持:
    * python-2.7.1
    * python-3.1.3
    * ActivePerl-5.12.2.1202-MSWin32-x86-293621
    * ActiveTcl8.5.9.1.294121-win32-ix86-threaded
    * lua-5.1.4
    * rubyinstaller-1.9.2-p0

    链接: http://public.bay.livefilestore.com/y1pln3qRYglWUtX7zyFBkypFeGeKJ1crLRxeLKRqk9dhrjM7VI6VFxs1dfD36eiLgyTh-FHDHwxcO_WXPCbUm_o9A/vim73.zip

    to 楼上, 支持屏幕取词的就支持 gdi++ 了

  5.   我也遇到了上面所说的编码的问题,在GVIM中如果使用正常的编码,虽然字体比较好看,但是无法执行带有中文字的外部命令文件了。而上面所提到的编译后的gvim又无法下载(链接已失效),是否作者又有了新的版本?希望能提供下载地址给我。

  6. 目前用不到这方面的知识,刚开始学习Gvim,只能算是刚入门而已,只是在研究功能,以后再潜心扩展吧!

发表评论

电子邮件地址不会被公开。 必填项已用*标注