在 MS-Windows 上 Vim 可直接在系统已安装的打印机上打印文本。在其他系统上,会先
生成 PostScript 文件。对支持 PostScript 的打印机,可直接发送文件打印,对其他类
型的打印机,需要借助 ghostscript 等程序转换处理,完成打印操作。
备注: 如果 :hardcopy 打印不可用,备用方案是用 :TOhtml 导出为 HTML,再用浏
览器上打开打印。
:ha :hardcopy E237 E238 E324
:[range]ha[rdcopy][!] [arguments]
打印 [range] 范围内的所有行 (缺省是整个文件)。
在 MS-Windows 上,会显示打印对话框,用来选择打印机和
纸张尺寸等。[!] 版本跳过对话框。这里,打印机由
'printdevice' 指定。如果 'printdevice' 为空,就使用
系统缺省打印机。
对于非 MS-Windows 的系统,先写入 Postscript 临时文件,
然后通过 'printexpr' 设置的命令打印。'printexpr' 里可
通过 v:cmdarg 获取 [arguments] 参数。如果未设置
'printexpr',忽略 [arguments]。'printoptions' 可用于设
置纸张尺寸,是否双面打印等。
备注: 需要打印到 pdf 时,可通过 "ps2pdf" 等外部工具将
PostScript 转换为 PDF。
:[range]ha[rdcopy][!] >{filename}
功能同上,但不直接打印,而是保存 Postscript 文件
{filename}。
文件名支持展开 "%" 等特殊字符 cmdline-special 。
注意同名文件会被静默覆盖。
{仅当编译时加入 +postscript 特性才有效}
在 MS-Windows 上应改用打印机驱动程序的 "输出到文件" 功
能。
打印过程中会实时显示完成的页号和百分比。要中断打印,按中断键 CTRL-C (在
MS-Windows 系统上用 CTRL-Break)。
'printfont' 和 'printoptions' 选项控制打印输出。'printheader' 指定页眉格式。
打印文件会严格限定在指定的页边距 (margin) 内,不受当前窗口 'wrap' 或
'linebreak' 设置影响。'printoptions' 里的 "wrap" 项可以用来关闭回绕。
打印文本使用当前高亮色彩,但有以下修正:
1) 普通背景强制渲染为白色 (白纸的颜色)。
2) 白色文本和缺省前景统一转为黑色,保证可见!
3) 'background' 是 "dark" 时,颜色自动加深,避免在白纸上过浅看不清。
本节详细介绍控制打印行为的所有选项。选项通用设置方法可见 options.txt 。
pdev-option
'printdevice' 'pdev' 字符串 (缺省为空)
全局
:hardcopy 命令带感叹号 (!) 会跳过打印机选择对话框,本选项指定此时使用的打印
机名。在 Win32 上,必须严格匹配标准打印对话框出现的打印机名。
为空时, :hardcopy! 自动使用系统缺省打印机。
penc-option E620
'printencoding' 'penc' 字符串 (缺省值:
MS-Windows: cp1252,
Macintosh: mac-roman,
VMS: dec-mcs,
HPUX: hp-roman8,
EBCDIC: ebcdic-uk,
其他: 空)
全局
设置打印时使用的字符编码。Vim 会从 'runtimepath' 里的 "print" 目录下读取对应的
打印字符编码文件。
本选项接受 encoding-names 内所有编码值。合法名称会被转换为 Vim 标准编码名,
详见 'encoding'。无法识别的编码名会被转换为小写形式、并将下划线替换为 '-'。
'printencoding' 为空或 Vim 找不到对应编码文件时,会改用 'encoding' (仅限设置值
为 8 位编码) 查找打印字符编码文件。如果还是找不到编码文件,最后使用 "latin1"
打印字符编码文件。
'encoding' 为多字节编码时,Vim 会先将字符转换为打印编码 ('printencoding' 为空
则默认转换到 latin1),再进行打印 {仅当编译时加入 +iconv 特性才能进行到非
latin1 打印编码的转换}。如果完全无法转换,打印失败。无法转换的个别字符会被倒转
问号 (¿) 代替。
预装 Mac、VMS、HPUX 和 EBCDIC 四种平台缺省使用的打印字符编码文件。MS-Windows
平台缺省使用代码页 1252 打印字符编码。
pexpr-option
'printexpr' 'pexpr' 字符串 (缺省: 见下)
全局
{仅当编译时加入 +printer 和 +postscript 特性时才有
效}
表达式,用于执行 :hardcopy 生成的 PostScript 文件的打印。
要打印的临时 PostScript 文件名保存在 v:fname_in 。
:hardcopy 命令参数保存在 v:cmdarg 。
该表达式在打印后,必须负责删除临时文件。如果有错误,必须返回非零值。成功时则返
回零或空串。
非 MS-Windows 非 VMS 系统上,缺省操作是直接执行 "lpr" 外部命令打印文件:
system('lpr' .. (&printdevice == '' ? '' : ' -P' .. &printdevice)
.. ' ' .. v:fname_in) .. delete(v:fname_in) + v:shell_error
在 MS-Windows 上,缺省操作是将临时文件复制到当前 'printdevice':
system('copy' .. ' ' .. v:fname_in .. (&printdevice == ''
? ' LPT1:' : (' \"' .. &printdevice .. '\"')))
.. delete(v:fname_in)
在 VMS 上,缺省操作是将文件发送到缺省或者当前 'printdevice':
system('print' .. (&printdevice == '' ? '' : ' /queue=' ..
&printdevice) .. ' ' .. v:fname_in) .. delete(v:fname_in)
要自定义本选项,为了避免转义空格的麻烦,建议使用更简洁的函数形式。例如:
:set printexpr=PrintFile()
:function PrintFile()
: call system("ghostview " .. v:fname_in)
: call delete(v:fname_in)
: return v:shell_error
:endfunc
使用不带参数的函数调用更有效率,见 expr-option-function 。
小心部分打印程序在读入文件前就返回控制权,异步执行。过早删除文件会导致打印失
败。请参考程序通常自带的在打印完成后自动清理文件的选项。
E365
如果表达式计算失败或返回非零值,会报错。Vim 此时会自动清理文件。非 MS-Windows
系统上的缺省值用到一个技巧: 加上 "v:shell_error" 会在 system() 调用失败时返回
非零值。
表达式以 s: 或 <SID> 开始时,会用脚本 ID ( local-function ) 替代这些前缀。例
如:
set printexpr=s:MyPrintFile()
set printexpr=<SID>SomePrintFile()
否则,表达式会在设置本选项的脚本上下文里计算,这样就可访问该脚本的局部项目。
为了安全原因,本选项不能在 modeline 或 sandbox 里设置。
pfn-option E613
'printfont' 'pfn' 字符串 (缺省为 "courier")
全局
指定 :hardcopy 命令输出所用字体。格式和 'guifont' 选项相同,但只允许单个字
体,而且不支持 "guifont=*" 特殊语法。
在 Win32 GUI 版本上,除了字体名外,还可指定附加属性,和 'guifont' 选项类似。
在其他系统上,只识别 ":h11",其中 "11" 是字体点数 (point) 大小。忽略时默认使用
10 点字。
pheader-option
'printheader' 'pheader' 字符串 (缺省为 "%<%f%h%m%=Page %N")
全局
定义 :hardcopy 输出页眉格式。格式同 'statusline' 选项。选项为空时,缺省使用
极简只包含页号的页眉。
{仅当 Vim 编译时加入 +statusline 特性才有效,否则使用缺省页眉}
pmbcs-option
'printmbcharset' 'pmbcs' 字符串 (缺省为 "")
全局
:hardcopy 生成中日韩文字输出时,指定使用的字符集。目前,识别以下预定义值:
值 描述
中文 GB_2312-80
(简体) GBT_12345-90
MAC Apple Mac 简体中文编码
GBT-90_MAC 适配 Apple Mac 简体中文 的 GB/T 12345-90
GBK GBK (GB 13000.1-93)
ISO10646 ISO 10646-1:1993
中文 CNS_1993 CNS 11643-1993, 第一、二字面
(繁体) BIG5 标准 Big5
ETEN 带倚天扩展的 Big5
ISO10646 ISO 10646-1:1993
日文 JIS_C_1978
JIS_X_1983
JIS_X_1990
MSWINDOWS Win3.1/95J (JIS X 1997 + NEC + IBM 扩展)
KANJITALK6 Apple Mac KanjiTalk V6.x
KANJITALK7 Apple Mac KanjiTalk V7.x
韩文 KS_X_1992
MAC Apple Macintosh 韩语编码
MSWINDOWS 带微软扩展的 KS X 1992
ISO10646 ISO 10646-1:1993
上述字符集取值只有与 'printencoding' 的特定组合才有效。下表列出所有合法组合:
euc-cn gbk ucs-2 utf-8
中文 GB_2312-80 x
(简体) GBT_12345-90 x
MAC x
GBT-90_MAC x
GBK x
ISO10646 x x
euc-tw big5 ucs-2 utf-8
中文 CNS_1993 x
(繁体) BIG5 x
ETEN x
ISO10646 x x
euc-jp sjis ucs-2 utf-8
日文 JIS_C_1978 x x
JIS_X_1983 x x
JIS_X_1990 x x x
MSWINDOWS x
KANJITALK6 x
KANJITALK7 x
euc-kr cp949 ucs-2 utf-8
韩文 KS_X_1992 x
MAC x
MSWINDOWS x
ISO10646 x x
例如,要设置打印日文所需的编码和字符集,可用:
:set printencoding=euc-jp
:set printmbcharset=JIS_X_1983
'printmbcharset' 设为上表未列值时,会假定为自定义多字节字符集,此时不再检查与
'printencoding' 值是否兼容。Vim 会在 'runtimepath' 里的 "print" 目录下读取对应
字符集定义文件。
pmbfn-option
'printmbfont' 'pmbfn' 字符串 (缺省为 "")
全局
逗号分隔的字段列表,用于指定 :hardcopy 生成中日韩文字输出所用字体。每个字体
名必须指定单字符前缀,指示字体用途:
r:{font-name} 普通字符字体
b:{font-name} 粗体字符字体
i:{font-name} 斜体字符字体
o:{font-name} 粗斜体字符字体
执行中日韩文字打印时,r: 前缀字段必填。其它类型可选,省略时使用以下后备规则:
b: 未设置时,使用 r:
i: 未设置时,使用 r:
o: 未设置时,使用 b:
部分中日韩字体缺失 ASCII 编码区字符。部分代码点字形也和标准 ASCII 有差异。为
此,提供以下两组字段,控制 ASCII 编码区字符的打印方式。
c:yes ASCII 编码区统一使用 Courier 字体渲染。
c:no (缺省)
a:yes ASCII 编码区使用标准 ASCII 字符集字形 (如 "ABC")。
a:no (缺省) ASCII 编码区使用本地 (国家) 字符集字形 (如 "ABC")。
下例指定两种多字节字体,一种用于普通和斜体,一种用于粗体和粗斜体,ASCII 编码区
使用 Courier 字体但应用国家字符集字形:
:set printmbfont=r:WadaMin-Regular,b:WadaMin-Bold,c:yes
popt-option
'printoptions' 'popt' 字符串 (缺省为 "")
全局
{仅当编译时加入 +printer 特性才有效}
逗号分隔的项目列表,控制 :hardcopy 的打印排版与输出行为:
left:{spec} 左边距 (缺省: 10pc)
right:{spec} 右边距 (缺省: 5pc)
top:{spec} 顶边距 (缺省: 5pc)
bottom:{spec} 底边距 (缺省: 5pc)
{spec} 为数值加单位,可用单位包括:
"in" 英寸、"pt" 点数 (1 点等于 1/72 英寸)、"mm" 毫米、
"pc" 纸张尺寸百分比。
故意混用多种单位的示例:
left:2in,top:30pt,right:16mm,bottom:3pc
如果单位识别失败,不报错。直接使用该边距缺省值。
header:{nr} 页眉预留行数。
实际只使用第一行,所以 {nr} 为 2 时,第二行为空行。
'printheader' 控制页眉格式。
header:0 不打印页眉。
header:2 (缺省) 页眉占用两行。
syntax:n 不使用语法高亮。速度更快,方便打印大文件。
syntax:y 使用语法高亮。
syntax:a (缺省) 打印机支持彩色或者灰度打印时,使用语法高亮。
number:y 打印输出包含行号。
number:n (缺省) 不输出行号。
wrap:y (缺省) 回绕长行。
wrap:n 截断长行。
duplex:off 单面打印。
duplex:long (缺省) 双面打印 (如果可用),长边装订。
duplex:short 双面打印 (如果可用),短边装订。
collate:y (缺省) 逐份打印: 1 2 3,1 2 3,1 2 3
collate:n 非逐份打印: 1 1 1,2 2 2,3 3 3
jobsplit:n (缺省) 多份打印合并成单个打印任务。
jobsplit:y 每份单独发起打印任务。用于 N-路后期处理。
portrait:y (缺省) 纵向打印。
portrait:n 横向打印。
a4 letter
paper:A4 (缺省) 纸张尺寸: A4
paper:{规格} 纸张尺寸可选规格:
{规格} 厘米单位尺寸 英寸单位尺寸
10x14 25.4 x 35.57 10 x 14
A3 29.7 x 42 11.69 x 16.54
A4 21 x 29.7 8.27 x 11.69
A5 14.8 x 21 5.83 x 8.27
B4 25 x 35.3 10.12 x 14.33
B5 17.6 x 25 7.17 x 10.12
executive 18.42 x 26.67 7.25 x 10.5
folio 21 x 33 8.27 x 13
ledger 43.13 x 27.96 17 x 11
legal 21.59 x 35.57 8.5 x 14
letter 21.59 x 27.96 8.5 x 11
quarto 21.59 x 27.5 8.5 x 10.83
statement 13.97 x 21.59 5.5 x 8.5
tabloid 27.96 x 43.13 11 x 17
formfeed:n (缺省) 换页符 (0x0c) 当作普通字符打印。
formfeed:y 换页符使当前行在新页首行继续打印。
某项省略时使用其缺省值。使用弹出对话框选择打印机及选项时,可覆盖本选项部分参
数。示例:
:set printoptions=paper:letter,duplex:off
E455 E456 E457 E624
只要磁盘空间充足,生成 PostScript 文件当无问题。前提是运行时文件正确安装 (如果
能打开帮助文件,一般说明安装正常)。
PostScript 打印有若干限制:
- 'printfont' - 忽略字体名 (固定使用 Courier 家族字体 - 所有 PostScript 打印机
都应自带) 但可指定字体大小。
- 'printoptions' - 生成的 PostScript 输出会强制双面打印设置,但最终是否生效取
决于打印机硬件。不支持的打印机多数会直接忽略。但少数打印机会完全无法打印。
- 8 位支持 - 尽管很多 8 位打印字符编码都有支持,仍存在部分字符无法打印的问题。
这取决于打印机内置字体是否包含该字符。缺失字符缺省会用倒转问号 (¿) 代替,如
果该字形也不存在,则替换为空格。安装新版 Courier 家族字体,可完整输出当前编
码里的所有字符。
- 多字节支持 - Vim 目前会试图将多字节字符转换为 'printencoding' 指定的 8 位编
码 (为空时默认使用 latin1)。无法转换的个别字符会显示为未知字符。如果 Vim 完
全无法完成编码转换,整个打印过程会失败。
E618 E619
如需打印 8 位字符数据时使用自定义打印字符编码,需要自行编写 PostScript 字体编
码向量。编码向量的完整编写细节超出本帮助文件的范围。可查阅 Addison-Wesley 出版
的 PostScript 语言参考手册第三版,或从 https://www.adobe.com/ 获取 PDF 版本。
以下仅说明使 Vim 识别并加载自定义打印字符编码的步骤。
i. 为编码向量定义唯一名称,以不与 Vim 已识别或标准编码名 (编码名参见
encoding-names ) 冲突、也不易和他人重复为原则。
ii. 将 $VIMRUNTIME/print/latin1.ps 复制到用户 'runtimepath' 里的 "print" 子目
录下,并重命名为自定义编码名。
iii. 编辑该文件。将所有 latin1 替换为自定义编码名 (包括 %%Title: 开头的那行)。
同时,将字形名 (glyph names) 数组替换为新编码向量。该数组必须恰好有 256
项,否则打印会直接失败!
iv. 在 Vim 里,将 'printencoding' 设为自定义编码名。
设置完成后,文件打印就会使用自定义打印字符编码。
除了 %%Title: 开头一行里的编码名和 %%Version:: 开头一行里的版本外,禁止修改前
三行其他任何内容,包括行顺序,否则 Vim 会报告该资源文件有错。
[PostScript 专业技术解释 - Vim 打印时,会根据 'printencoding' 值匹配同名文件。
该文件会定义名为 /VIM-name 的 PostScript Encoding 新资源,其中 name 为 Vim 实
际使用的打印字符编码。]
E621
打印 PostScript 出现问题的通常唯一症状是完全没有打印输出。少数情况下会打印出一
张报错页,标明引发打印任务中断的 PostScript 操作符。
打印失败的若干可能原因:
- prolog 资源文件版本错误。prolog 资源文件存放 Vim 打印必需的 PostScript 脚
本。不同 Vim 版本对应不同专属版本。请确保安装了正确的运行时文件,且在用户
'runtimepath' 里的 "print" 目录下,没有存放旧版本 prolog 文件。
- 纸张尺寸不兼容。部分 PostScript 打印机会因为不支持请求的纸张尺寸而中止打印。
Vim 缺省用 A4 纸。请确认实际打印机纸张规格,并相应设置 'printoptions' 的
"paper" 项。如果无法确定规格名,可实测打印纸尺寸,对照 'printoptions' 列出的
纸张尺寸列表,选取长宽 最 接近的规格。
注意: 实测纸张尺寸与文档标注会存在微小偏差。如果确实没有相近规格,可使用以下
讨论的 PSUtils 里的 psresize 工具缩放文件。
- 双面打印 (duplex)。多数不支持双面打印的 PostScript 打印机会自动忽略双面打印
请求。但部分设备会中止打印任务。可尝试关闭 "duplex" 项再打印。
注意: 可使用 PSUtils 工具手动实现双面打印 - 见下。
- 逐份打印 (collated)。和双面打印情形类似,多数不支持逐份打印的打印机会自动忽
略此种请求。但部分设备会中止打印任务。可尝试关闭 "collate" 项再打印。
- 语法高亮。部分打印管理代码不支持在黑白打印机上打印包含语法高亮的 PostScript
文件,即使全文只使用黑色。可尝试关闭 "syntax" 项再打印。
安全 'printoptions' 设置值为:
:set printoptions=paper:A4,duplex:off,collate:n,syntax:n
将 "A4" 换成适配打印机的纸张规格。
7.1 Ghostscript
Ghostscript 是 PostScript 和 PDF 解释器,可预览和在非 PostScript 打印机上打印
PostScript 和 PDF 文件。还可将 PostScript 文件转换成 PDF 文件。
Ghostscript 可在多种平台上运行。
有三个可用的版本:
- AFPL Ghostscript (原 Aladdin Ghostscript) 对非商业用途免费。官网是:
http://www.cs.wisc.edu/~ghost/
- GNU Ghostscript 以 GNU General Public License (GPL 开源协议) 发行,官网是:
https://www.gnu.org/software/ghostscript
- 商业授权版。
Ghostscript 的更多信息可见:
http://www.ghostscript.com/
发布自带众多非 PostScript 打印机支持。如果未找到所需打印机支持,可前往
Ghostscript 网站查找额外驱动。
7.2 Ghostscript 预览器
原生 Ghostscript 界面非常原始,因此衍生了不少图形化前端程序。提供便捷
PostScript 文件选择,缩放预览,一键打印。详见相关文档。
X11
- Ghostview。获取地址:
http://www.cs.wisc.edu/~ghost/gv/
https://www.gnu.org/software/gv/
备用地址 (版本未必最新):
http://www.cs.wisc.edu/~ghost/gv/
OpenVMS
- 源码已内置支持 (未经测试)。见 (链接看来已失效):
wwwthep.physik.uni-mainz.de/~plass/gv/
MS-Windows
- GSview。获取地址:
http://www.cs.wisc.edu/~ghost/gsview/
Linux
- GSview。流行 MS-Windows 预览器的 Linux 版本。获取地址:
http://www.cs.wisc.edu/~ghost/gsview/
7.3 PSUtils
PSUtils 是一组操作 Postscript 文档的工具程序。提供多平台二进制发布与完整源码。
获取地址:
http://knackered.org/angus/psutils
常用工具包括:
- psnup. 将 PS 文件转化为 N-路打印版本。
- psselect. 选择打印页范围、调整页面打印顺序。
- psresize. 修改页面大小。
- psbook. 重新排列页面顺序和页面排版,方便打印成册。
工具支持管道串联,可组合实现复杂打印排版需求。
N - 路 打 印
psnup 工具可将 Vim 生成的 PostScript 文件转化为 n-路版本 (即在同一物理页上打印
n 个逻辑页)。生成 2-路输出的简单方法是,先创建 PostScript 文件:
:hardcopy > test.ps
然后在命令行上执行:
psnup -n 2 test.ps final.ps
注意: 部分 Ghostscript 预览器打开 psnup 生成的文件会给出警告 - 可安全忽略。
最后,使用平台打印命令,将 final.ps 发送到 PostScript 打印机。打印完毕后,手动
删除两个临时 PostScript 文件。可修改 'printexpr' 自动完成打印前所需额外转换。
双 面 打 印 的 替 代 方 法
psselect 工具可手动实现双面打印任务。该工具提供 -e 和 -o 选项,可分别打印 PS
文件的偶数页和奇数页。
先用 :hardcopy 命令生成 PS 文件,然后拆分奇数页和偶数页:
psselect -o test.ps odd.ps
psselect -e test.ps even.ps
然后,使用平台打印命令,打印 odd.ps。打印完成后取出纸张,翻面放回取纸器。最
后,使用平台打印命令,打印 even.ps。这样,偶数页就会印在奇数页背面。
要记住以下几点:
1. 首页位置。打印奇数页时如果首页出现在最上方,需要给奇数页反转页码顺序,可用
psselect 的 -r 选项完成。这样可以保证第 2 页打印在第 1 页背面。
注意: 优先反转奇数页。避免总页数为奇数时出现排版错乱。
2. 纸张方位。翻面时需要根据打印机走纸结构,选择横向翻转 (沿长边)、纵向翻转 (沿
短边)、甚至旋转 180 度。桌上型喷墨打印机走纸直观,而小型激光打印机走纸路径
不易察看,需自行测试调整。
Vim 缺省对换页控制符 formfeed 不作任何特殊处理。设置 'printoptions' 的
"formfeed" 项可使 Vim 识别换页符,读到换页符立即换页,该行剩余内容在新页里继续
打印。换页符提供了较为原始的打印控制。但有若干注意事项。
只要一行包含换页符,Vim 会先输出这一整行 (开启行号时连带行号)。如果该行是页面
第一行且首字符就是换页符,会先打印空白页,再换到下一页输出内容。
因为行号只在包含换页符的行开头打印,新页打印的该行其余部分不再打印行号。这和
'printoptions' 里置位 "wrap" 项时,长行回绕行不显示行号的逻辑一致。
换页符在行尾时,新页内容会从第二行而非第一行开始。这是因为 Vim 处理完换页符后
再处理行尾,从而在继续打印之前,先自行下移一行。
根据以上几点,推荐使用换页符处理时,关闭行号打印,且不要将换页符放在行尾。还要
合理调整换页符上方行数,防止意外输出空白页。
vim:tw=78:ts=8:noet:ft=help:norl: