OS_WIN32

*os_win32.txt*  For Vim version 7.4.  最后更新: 2013年1月


                  VIM 参 考 手 册    作者: George Reilly
                                     译者: Dasn, tocer
                                     http://vimcdoc.sf.net

                                                *win32* *Win32* *MS-Windows*
本文描述 Vim Win32 版本的一些特性。

Vim 的 Win32 版本可以在 Windows NT、95、98、ME、XP、Vista 和 Windows 7
上运行,并且有 console (控制 台,就是命令提示符窗口 译者) 和 GUI (图形界面)
两个版本。

32 位版本也可运行在 64 位 MS-Windows 系统上。

有用于 Windows 3.1[1] Win32s 子系统的 GUI 版本。你也可以用 Vim 的 32 位 DOS
版本来代替。参见 |os_msdos.txt|。

1. 一些已知的问题               |win32-problems|
2. 启动                         |win32-startup|
3. 恢复屏幕内容                 |win32-restore|
4. 使用鼠标                     |win32-mouse|
5. 在 Windows 3.1 下运行        |win32-win3.1|
6. Win32 常见问题解答 (迷你版)  |win32-faq|

此外,还有一些 Win32 和 DOS 版本通用的条目:
文件位置                        |dos-locations|
使用反斜杠                      |dos-backslash|
标准映射                        |dos-standard-mappings|
屏幕的输出与颜色                |dos-colors|
文件格式                        |dos-file-formats|
:cd 命令                        |dos-:cd|
中止键                          |dos-CTRL-Break|
临时文件                        |dos-temp-files|
默认的 Shell 选项               |dos-shell|

Win32 用户图形界面              |gui-w32|

作者:
Win32 版本的作者是 George V. Reilly <george@reilly.org>。
最初 Windows NT 版本的移植工作是由 Roger Knobbe <RogerK@wonderware.com> 完成
的。
GUI 版本的作者是 George V. Reilly 和 Robert Webb。

有关编译的讨论请参考 "src/INSTALLpc.txt"。              *win32-compiling*


1. 一些已知的问题 *windows95* *win32-problems*

Vim 在 Windows 95 的控制台里运行时会出一些问题。据我们所知,这些问题在 Windows 98 和 Windows ME 上也会出现。 微软内部人士的话: "Win95 的控制台一直不稳定,并且将永远这样。" 1、不支持死键 (dead key,与重音有关的键,下文有解释 译者注)。 2、可以用命令 ":set columns=nn lines=nn" 改变窗口大小,但是此后执行外部命令可 能会使系统挂起或当机。 3、屏幕刷新慢,除非你把 'columns''lines' 设置为 非 DOS 标准值,但是这样会 引起上述第二个问题! 如果这些问题影响你的使用,你可以换用 32 位的 MS-DOS 版本 或 Win32 GUI 版本。 自动补全文件名的时候,虽然 Vim 会匹配短的文件名,但是却会寻找并使用对应的相应 的长文件名。例如,如果有一个长文件名 "this_is_a_test",其短文件名是 "this_i~1",命令 ":e *1" 编辑文件 "this_is_a_test"。

2. 启动 *win32-startup*

当前目录 *win32-curdir* 如果启动 Vim 时后面带一个文件名作为参数,并且指定了该文件的完整路径 (例如: 以 "x:\" 开头的路径),Vim 会认为该文件是从文件管理器启动,并把当前目录 (:cd 命令 查看 译者) 切换到文件所在目录。如果不想这样,只要把路径里的反斜杠 ("\") 换成斜 杠 ("/") 即可。例如: vim c:\text\files\foo.txt 当前目录切换到 "C:\text\files"。 vim c:/text\files\foo.txt 不改变当前目录。 term 选项 *win32-term* Vim 的 Win32 版本仅有的终端类型是 "win32",它是内置的。如果你把 'term' 设置成 其它的值,Vim 的行为就可能变的很奇怪。所以 Vim 不会从环境变量 "TERM" 里获取 'term' 的值。 $PATH 环境变量 *win32-PATH* Vim 可执行程序的路径被加入到变量 $PATH 中。这主要使 "!xxd" 能够运行,因为它在 工具菜单中。这也意味着当 executable() 返回 1 时,该可执行程序确实能够执行。

3. 恢复屏幕内容 *win32-restore*

如果你设定了 'restorescreen' 选项 (默认设置),当你退出 Vim 或者执行外部命令 时,Vim 能恢复控制台原来的内容。可以用 ":ser nors" 命令关掉这个选项。 |'restorescreen'|

4. 使用鼠标 *win32-mouse*

Vim 的 Win32 版本支持鼠标。如果你使用两键鼠标,可以用同时按下左右两键的办法来 模拟第三键 (中键) - 但是,请注意: 在 Win32 GUI 上,如果你的右键用来呼叫弹出菜 单 (参见 'mouse'),那么你最好先按下鼠标左键 (左右两键同时按的时候,左键略快于 右键 译者)。 |mouse-using| 如果鼠标不好用,你可以试着禁用控制台的 "快速编辑模式"。

5. 在 Windows 3.1 下运行 *win32-win3.1*

*win32s* *windows-3.1* 有一个特殊的 Win32 版本的 Gvim 可以在 Windows 3.1 和 3.11 运行。你需要用 Visual C++ 4.1 编译 gvim.exe。 要想在 Windows 3.1 或 3.11 上运行 Win32 版本的 Vim,你需要安装 Win32s (Win32s 是微软发布的一套子系统,主要作用是让 Windows 3.1x 或 WfW 3.1x 这些 16 位操作 系统借助其类库运行 32 位应用程序。译者)。也许你在安装别的软件时已经安装了 Win32s。如果 Vim 不能正常运行,请下载最新的 1.30c 版本的 Win32s。你可以在这 里下载: http://support.microsoft.com/download/support/mslfiles/pw1118.exe (微软又把它换地方了!我们现在也不知道在哪里 :-( )。 gvim.exe 之所以有两个版本,是因为 Win32s 版本是用 VC++ 4.1 编译的。这是最后一 个支持 Win32s 的 VC++。VC++ 5.0 好一些,所以用它来编译 Win32 版本。除此以外, 这两个版本没有什么不同。如果你在一个混合环境里工作,你可以使用 Win32s 的 gvim.exe,两者都支持。 Win32s 版本的 gvim 与 95/NT 系统上运行的 Win32 版本的 gvim 是一样的。在 Win32s 系统里有以下不同: -你不能使用长文件名,因为 Windows 3.1 不支持! -执行外部命令时无退出码。在 ":make" 之后,必须要自己 ":cn"。

6. Win32 常见问题解答 (迷你版) *win32-faq*

问: 为什么 Win32 版本的 Vim 在 Windows 95 里运行时屏幕的更新速度特别慢? 答: Win95 对 32 位控制台程序的支持很不好,有许多 Bug。不知道什么原因,Vim 在标 准解析模式 (80x25,80x43,80x50) 下屏幕更新速度特别慢,而 16 位 DOS 版本比 Win32 版本要快得多。如果改变一下行列的值 (例如: ":set columns=100" 或 ":set lines=40"),更新速度就会和 16 位 DOS 版本一样快。 警告: 改变 'columns' 属性可能导致 Windows 95 在刷新时死机 (要抱怨就找微软 吧!),不过在大多数情况下没什么问题,所以这一属性还保留着,但是一定要慎用 'columns'。 改变屏幕的解析度可以加快屏幕更新,但是它会带来其它的问题。比如,如果你不使 用标准的解析模式,特别是当 'columns' 的值不是 80 的时候,执行外部命令 (例 如: ":!dir") 会导致 Vim 停止响应。一旦这种情况发生,就不可能把解析模式改回 到执行外部命令之前的状态,所以在修改 'lines''columns' 的时候要特别、特 别小心!事实上,如果 'columns' 的值不是 80,Vim 不会让你执行外部命令,不然 之后死机就麻烦了。 在 Windows NT 上没有这些问题。无论 'lines''columns' 是什么值,屏幕更新 速度都很快,外部命令也不会使 Vim 停止响应。 问: Windows 95 上,既然 Win32 版本屏幕更新的速度不如 16 位 DOS 版本快,那我为 什么还要用 Win32 版本? 答: 首先,Win32 版本不像想象的那么慢,尤其是把 'lines''columns' 设置成非标 准数值后,速度还是挺快的。其次,16 位的 DOS 版本有许多的限制,例如: 不能做 过大的改动;不能处理长文件名。Win32 版本没有这些限制,并且总的来看,还是 Win32 版本快 (对于 32 位的 DJGPP DOS 版本的 Vim 也一样)。Win32 版本在对屏 幕、鼠标和键盘的控制上,要比 DJGPP 版本好。 问: 在 Windows NT 上,16 位的 DOS 版本 和 Win32 版本那个好? 答: 为什么要在 NT 上运行 16 位 DOS 版本?在 NT 上运行 Win32 版本的 Vim 时,屏 幕的更新速度和 16 位的 DOS 版本一样快,并且也没有上面所提到的一些限制。还 有, DOS 程序启动和运行的速度都比 Win32 慢。在非 Intel 构架的 NT 平台上, DOS 应用程序在 80x86 虚拟机上运行,所以特别慢,简直无法使用。 问: 怎样改变字体? 答: 在 GUI 版本里,可以用 'guifont' 选项。例如: :set guifont=Lucida_Console:h15:cDEFAULT 在控制台版本里,你需要修改控制台窗口的字体,不能在 Vim 里修改字体。 问: 为什么我使用 ":set lines=xx" 或其它相似的命令改变控制台窗口大小时,字体会 改变?(Win95) 答: 你在 MS-DOS 命令提示的字体属性里设置了 '自动',这使得 Win95 自动选择合适的 字体 (太糟了!)。明确地指定一种字体就可以解决这个问题。 问: 为什么不能在 Vim 里 "粘贴" (Win95)? 答: 在 MS-DOS 窗口的属性对话框中,找到 "杂项/快速粘贴",把前面的对勾去掉。 你也需要在 Vim 里执行 ":set paste" 以避免副作用。 |'paste'| 问: 控制台版本的 Vim 怎样在 Windows 95 里输入死键? (死键是重音键,诸如: 尖音符号 (acute),钝音符号 (grave),umlaut (元音变音) 等,它们本身不能产生字符,但是当它们后面跟另外的键时就会产生语音字符,例 如: a-acute、e-grave、u-umlaut、n-tilde 等等。(这些语音符号通常出现在字母 的上面,举个例子,比如上面提到的 e-grave 是这个样子 è,因为原文中是用语言 描述的,没有直接引用这些字符,所以简单解释一下,译者注)。这些对大多数欧洲 语言很有用。据我所知,英语布局的键盘不用死键)。 答: 不能。Windows 95 控制台的输入模块不能正确工作,我没有能力解决这些问题。下 面的话援引自微软一名资深程序员: Win95 控制台一直不稳定,而且将永远这样。 这种不稳定性是不可避免的,因为我们徘徊于 MS-DOS 的键盘 TSR (比如 KEYB,我们需要它来加工数据,对国际版本很重要) 和 Win32 两个世界之间。 于是,在 MS-DOS 上不存在的按键 (比如死键) 在 Win32 控制台上却大量存 在,有些按键的功能也迥然不同 (比如 CapsLock)。这些都使得 Win95 的控制 台变得不稳定。 更不用说多语言键盘布局的问题…… 也许你可以用二合字母机制 (digraphs) 来解决这个问题。|digraphs| 最好的解决方案是用 Win32 GUI 版本的 gvim.exe。要不然你就换一个支持死键的 DOS 版本的 Vim,有报告说那里没有问题。 问: 在 Windows NT 上怎样输入死键? 答: NT 3.51 上可以正常输入死键,和在别的程序里的输入方法一样。 NT 4.0 上,你必须保证你的区域设置 (控制面板键盘) 和你当前使用的区域设置相 同。否则 NT 会崩溃。这是 NT 的问题,不是 Vim 的问题。 问: 我用 Vim 编辑一个符号链接,这个链接指向 UNIX NFS 文件服务器上的一个文件。 当我保存这个文件时,Vim 不能通过链接保存到服务器上,而是删除了这个链接, 创建了一个新的文件。为什么? 答: 在 UNIX 系统上,Vim 可以处理链接 (符号链接或硬链接)。Vim 先把文件写入一个 备份文件中,然后用备份文件覆盖原文件。这样做是为了保证所有属性都和原文件相 同。在非 UNIX 系统上,首先原文件被改名,然后写入新文件。只有保护位和原文件 相同。但是,这个方法不能处理 NFS 文件系统,那里除了链接还有一些其它问题。 唯一的解决办法是禁用备份文件,可以通过命令 ":set nobackup nowritebackup" 实现 |'writebackup'| 问: 我正通过 Samba 使用 Vim 编辑 Unix 系统上的一个文件。当我保存文件时,文件所 有者被改变了。为什么? 答: 当保存文件时,Vim 会给原来文件换名,使之成为一个备份 (以防写入文件过程中失 败)。然后该文件作为一个新文件被保存。Samba 这时把它赋予文件系统上默认的所 有者,可能会和原所有者不一样。 为避免此问题,可以设置 'backupcopy' 选项为 "yes"。Vim 会用复制的方式建立备 份,然后再覆盖原文件。这样文件所有者就不会改变了。 问: 执行 ":make" 的时候怎样看到输出? 答: 通常,你需要一个 tee 程序,它可以把输入 (make 的输出) 复制到标准输出和错误 信息文件里。你可以在以下地址找到 tee (还有其它 GNU 工具)。 http://gnuwin32.sourceforge.net 或 http://unxutils.sourceforge.net 或者你也可以在 http://www.cygwin.com/ 下载 Cygnus 版本的 GNU 工具。 其它 Win32 上运行的 Unix 风格的工具可以在以下地址找到。 http://directory.google.com/Top/Computers/Software/Operating_Systems/Unix/Win32/ 得到了 tee 程序之后,你需要把下面的命令添加到你的 _vimrc 文件中: :set shellpipe=\|\ tee 问: 我把文件保存到一台运行 VisionFS 的远程计算机上,但是文件找不到了! 答: VisionFS 不能处理特定的句号 (.) 加三个字母的扩展名,SCO 声称这是为了兼容 16 位的 DOS/Windows 环境。下面的两个命令可以说明问题: echo Hello > file.bat~ dir > file.bat "dir" 命令的输出被定向到 "file.bat~" 文件,而并没有新建一个 "file.bat" 文 件。这种行为在 Vim 里的体现就是,当你编辑一个名为 "foo.bat" 的文件时,Vim 会自动创建名为文件名加上 '~' 字符的临时文件,也就是 "foo.bat~"。写入 "foo.bat" 文件时,最后它倒被删除了 (译者注: Vim 想删除的本来是临时文件)。 解决办法: 在你的 _vimrc 文件里加入: :set backupext=.temporary 问: 怎样改变光标闪烁的频率? 答: 不能改。这是 NT 控制台的一个限制,据报告,NT 5.0 可以一次改变所有控制台的 闪烁频率。 *:!start* 问: 如何异步地执行一个外部命令? 答: 执行外部命令的时候,你可以用 ":!start" 代替 ":!" :!start winfile.exe<CR> 用 "start" 命令不像 ":!" 那样 (切换到另一个屏幕、调用一个新的控制台,然后 等待程序执行结束);该命令的使用,意味着你所运行的程序不会影响到当前编辑的 文件。用 ":!start" 命令运行程序不会得到 Vim 的打开文件句柄,这意味着他们不 需要在 Vim 之前退出。 要避免这种特殊照顾,可以用 ":! start"。 有两个可选的参数 (见下个问答): /min 最小化方式打开窗口 /b 不打开控制台窗口 一次只能使用一个参数。第二个参数会被当作命令的一部分。 问: 如何避免异步远行的程序打开窗口? 答: 取决于你实际需要,有两个方案: 1) 用 /min 标志位,以最小化方式运行,其他不作改变。对控制台和 GUI 应用一样有效。 2) 用 /b 标志位以运行控制台程序,而不建立控制台窗口 (GUI 应用不受影响)。 只能用于不需要输入的应用。否则会得到 EOF 错误,因为输入流 (stdin) 会重定向到 \\.\NUL (stdout 和 stderr 也是如此)。 运行 Exuberant ctags 的控制台示例: :!start /min ctags -R . 程序结束时你会看到名为 "tags" 文件在当前目录出现。你会注意到底下任务栏上 窗口标题在闪烁。尤其对需时较长的命令更容易看到。 现在删除 "tags" 文件,然后执行: :!start /b ctags -R . 还是会产生 "tags" 文件,但这次任务栏不会闪烁了。 GUI 应用的示例: :!start /min notepad :!start /b notepad 前一个命令以最小化方式运行 notepad,后一个命令以正常方式运行。 问: 我用 Win32s 版本,每当我执行外部命令时 (比如 "make"),Vim 不等程序执行完毕 就返回了!帮帮忙! 答: 问题出在 32 位应用程序 (Vim) 不能从 16 位应用程序 (你的 DOS 程序) 中得到程 序执行完成的信号。Vim 可以解决类似的问题,但是必须设置一下你的 DOS 命令, 让它在窗口里运行,而不是全屏状态。不巧的是,安装 Windows 后的默认值是 "全 屏"。要改变这一设置: 1) 打开 PIF 编辑器 (在主程序组里)。 2) 打开 "_DEFAULT.PIF" 文件 (在 Windows 目录下)。 3) 把显示选项从 "全屏" 改为 "窗口"。 4) 保存退出。 测试,启动 Vim,输入 :!dir C:\<CR>" 你应该看到一个 DOS 窗口短暂出现,显示文件及目录列表。 问: 我在 Win32s 和 NT 上使用 Vim。在 NT 上,我可以把控制台的默认值设置为 50 行,这样当我用 ":sh" 命令时,就会得到一个 80x50 的 shell。我可以在 Win3.1x 下这样做么?我会不会只能使用 80x25? 答: 编辑 SYSTEM.INI 文件,在 [NonWindowsApp] 一节加入 "ScreenLines=50"。这样, DOS 窗口和外部 DOS 命令就会在 50 行的窗口里运行。 vim:tw=78:fo=tcq2:ts=8:ft=help:norl:

Generated by vim2html on Thu Sep 19 06:21:44 UTC 2013