*if_pyth.txt* For Vim version 6.3. 最近更新:2004年6月
VIM REFERENCE MANUAL by Paul Moore
(译者:lang2 http://vimcdoc.sf.net)
Vim 的 Python 编程界面 *python* *Python*
1. 命令 |python-commands|
2. vim 模块 |python-vim|
3. 缓冲对象 |python-buffer|
4. 范围对象 |python-range|
5. 窗口对象 |python-window|
{Vi does not have any of these commands}
Vim 的 Python 界面仅当 |+python| 特性被编译进 Vim 时才有效。
1. 命令 *python-commands* *:python* *:py* *E205* *E263* *E264* :[range]
py[thon]{stmt}
执行 Python 语句{stmt}
. :[range]
py[thon] <<{endmarker}
{script}
{endmarker}
执行 Python 脚本{script}
.Note:
此命令在没有编译进 Python 特性时无效。为了 避免这样的错误,参阅 |script-here|.{endmarker}
前面 不能 有任何空白字符。如果在 "<<" 之后省略了{endmarker}
, 在{script}
之后一定要有一个点 '.'。这和 |:append| 及 |:insert| 命令的道理是 一样的。这种形成的 |:python| 命令主要用于在 Vim 脚本中嵌入 Python 代码。 例子:function! IcecreamInitialize()
python << EOF
class StrawberryIcecream:
def __call__(self):
print 'EAT ME'
EOF
endfunction
Note:
Python 对于缩进是非常敏感的。要确保 "class" 所在行及 "EOF" 没有任何缩进。 *:pyfile* *:pyf* :[range]
pyf[ile]{file}
执行{file}
文件中包含的 Python 脚本。整个 参数被用作一个文件名。{not in Vi}
这些命令根本上都差不多 - 它们都将当前范围 |python-range| 设定为指定的行范围, 并对其执行 Python 代码。 :python 的情况所执行的代码来自命令行。 :pyfile 的情况所执行的代码来自一个指定的文件。 Python 命令不能用于 |sandbox|。 需要传递参数的话,你得使用 sys.argv[]。例如:
:python import sys
:python sys.argv = ["foo", "bar"]
:pyfile myscript.py
下面是一些例子 *python-examples*
:python from vim import *
:python from string import upper
:python current.line = upper(current.line)
:python print "Hello"
:python str = current.buffer[42]
(
Note
如同导入 (import) 模块一样,变动对后续命令持续有效。这和 Python 的解释 程序是一样的。)
2. vim 模块 *python-vim* Python 的代码所有对 Vim 的操作 (只有一个例外 - 看下面的 |python-output|) 都是 通过 "vim" 模块来进行的。该模块包括两个方法,三个常量,以及一个异常对象。在使用 它们之前你得先导入 (import) vim 模块。 总揽print "Hello" # 显示信息
vim.command(cmd) # 执行 ex 命令
w = vim.windows[n] # 获取窗口 "n"
cw = vim.current.window # 获取当前窗口
b = vim.buffers[n] # 获取缓冲 "n"
cb = vim.current.buffer # 获取当前缓冲
w.height = lines # 设定窗口高度
w.cursor = (row, col) # 设定光标位置
pos = w.cursor # 获取 tuple (行, 列)
name = b.name # 获取缓冲的文件名
line = b[n] # 获取缓冲内的一行
lines = b[n:m] # 获取数行
num = len(b) # 获取统计的行数
b[n] = str # sets a line in the buffer
b[n:m] = [str1, str2, str3] # sets a number of lines at once
del b[n] # 删除一行
del b[n:m] # 删除数行
"vim" 模块中的方法 vim.command(str) *python-command* 执行 vim (ex-模式) 命令 str. 无返回值. 例如:
vim.command("set tw=72")
vim.command("%s/aaa/bbb/g")
< 下面的定义可以执行普通模式命令:def normal(str):
vim.command("normal "+str)
#
Note
the use of single quotes to delimit a string containing# double quotes
normal('"a2dd"aP')
< *E659* ":python" 在 Python 2.2 及之前版本上不能嵌套使用。下面命令只对 Python 2.3 之后版本适用::python vim.command("python print 'Hello again Python'")
vim.eval(str) *python-eval* 使用 vim 内部的表达式处理器来对表达式 str 求值。(参阅 |expression|). 返回结果的字符串。 例:
text_width = vim.eval("&tw")
str = vim.eval("12+12") # NB result is a string! Use
# string.atoi() to convert to
# a number.
"vim" 模块中的异常对象 vim.error *python-error* 当遇到 Vim 的错误时,Python 引起一个 vim.error 类的异常。 例:
try:
vim.command("put a")
except vim.error:
# nothing in register a
"vim" 模块中的常量
Note
这些其实并非真正的常量 - 你还是可以对它们符值。但这好无意义,因为 你会丢失该 vim 对象本来代表的值。 vim.buffers *python-buffers* A sequence 对象,用来提供对 vim 缓冲的操作。该对象支持以下操作:b = vim.buffers[i] # Indexing (read-only)
b in vim.buffers # 成员测试
n = len(vim.buffers) # 成员个数
for b in vim.buffers: # 顺序存取
vim.windows *python-windows* A sequence 对象,用来提供对 vim 窗口的操作。该对象支持以下操作:w = vim.windows[i] # Indexing (read-only)
w in vim.windows # 成员测试
n = len(vim.windows) # 成员个数
for w in vim.windows: # 顺序存取
vim.current *python-current* 一个用来提供对各种各样当前 "current" 对象进行操作的对象。它包括一些特定 的属性: vim.current.line 当前行(读写) 字串 vim.current.buffer 当前缓冲(只读) 缓冲 vim.current.window 当前窗口(只读) 窗口 vim.current.range 当前行范围(只读) 范围 最后一种情况需要一些额外的解释。当用 :python 或 :pyfile 命令指定一个 范围之后,该范围将成为 "当前范围"。一个范围就如同一个缓冲,只不过所 操作的对象界限于一个行的子集。请参阅 |python-range|。 Python 的输出 *python-output* Vim 将所有 Python 代码的输出都显示在信息区。普通的输出会以一般信息 出现,错误会以出错信息出现. 用具体实现的属于来讲,这表示所有 sys.stdout (包括 print 语句的输出) 以一般信息形式出现,而所有 sys.stderr (包括 error tracebacks) 都会 被显示成出错信息。 *python-input* Vim 并不支持用 Python 来输入 (通过 sys.stdin, 包括 input() 和 raw_input())。这些调用可能会导致崩溃。可能以后会修正。
3. 缓冲对象 *python-buffer* 缓冲对象代表缓冲。你又一下这几种办法来获取缓冲的列表: - 通过 vim.current.buffer (|python-current|) - from indexing vim.buffers (|python-buffers|) - 通过一个窗口的 "buffer" 属性 (|python-window|) 缓冲对象只有一个属性 -- 缓冲的文件全名。该对象还包括三个方法 (append, mark, 及 range; 见下)。 你也可以将缓冲对象视为顺序对象。这样的话,它们就可以被像一个字符串序列一样 取存 (它们是可变的)。每一个元素是缓冲中的一行。所有的顺序存取操作,包括索引 索引赋值,切片及切片赋值,等等,都可以被使用。Note
索引(切片)操作的结果是一 个字符串(字符串序列)。这产生了一个意想不到的结果 - b[:] 和 b 是不同的。确切 一些,"b[:] = None" 会清空整个缓冲,而 "b = None" 仅仅更新变量 b 的值,完全 不会影响到缓冲。 缓冲索引从 0 开始算起,这与通常的 Python 语法一致。但这和 Vim 的行号从 1 算 起有分歧。这一点在处理标记 (见下) 是要特别留意,因为标记是以行号区分的。 缓冲对象的方法有: b.append(str) 对缓冲附加一行 b.append(list) 对缓冲附加一系列行Note
append 方法可以带一个字符串序列作为参数,这和 Python 中对应的方法是不同的。 b.mark(name) 返回一个 tuple (行,列) 用来代表该位置上的一个有名的 标记 (也可以用于 []"<>
等标记) b.range(s,e) 返回一个范围对象 (参见 |python-range|) 用来代表指定 缓冲中行 s 与 行 e 之间的部分 (包含 s 和 e |inclusive|). 例如 (假定 b 是当前缓冲)print b.name # 输出缓冲的名字
b[0] = "hello!!!" # 替换最顶上的一行
b[:] = None # 删除整个缓冲
del b[:] # 删除整个缓冲 (同上)
b[0:0] = [ "a line" ] # 在第一行前添加一行
del b[2] # 删除一行 (第三行)
b.append("bottom") # 在缓冲结尾添加一行
n = len(b) # 总行数
(row,col) = b.mark('a') # 有名的标记
r = b.range(1,5) # 缓冲内的一个范围
4. 范围对象 *python-range* 范围对象代表一个 vim 缓冲内的一个部分。你可以用一下的方法之一来获取一个缓冲 对象: - 通过 vim.current.range (|python-current|) - 通过一个缓冲的 range() 方法 (|python-buffer|) 一个范围对象在操作上几乎合一个缓冲对象完全一样。不过,其操作的目标仅显于范围 指定的行 (当然,这个行范围会随着切片赋值,行删除,或者 range.append() 等等操作而 改变). 范围对象的属性有: r.start 首行在缓冲内的索引 r.end 尾行在缓冲内的索引
5. 窗口对象 *python-window* 窗口对象代表一个 vim 窗口。你可以用一下几种方法来获取一个窗口对象: - 通过 vim.current.window (|python-current|) - 通过对 vim.windows 的索引操作 (|python-windows|) 你只能通过窗口对象的属性来控制它。这些对象没有方法,也没有序列等其它界面。 窗口的属性包括: buffer (只读) 窗口中显示的缓冲 cursor (读写) 窗口中的当前光标位置 这是一个 tuple, (行,列). height (读写) 行数表示的窗口高度 width (读写) 列数表示的窗口宽度 height 属性只有当屏幕被水平分割时才可写。 width 属性只有当屏幕被垂直分割时才可写。
vim:tw=78:ts=8:ft=help:norl:
Generated by vim2html on Tue Jul 27 00:35:24 CST 2004