vim自动设置 textwidth 的问题

2014年1月13日 20:22

Vim 里有个选项是 textwidth,作用就是设置文本宽度,当用户输入一个很长的文本时,如果文本中有空格,那么这行文本就会被 Vim 按照 textwidth 设置的长度自动拆分,拆分成每行最多 textwidth 个字符。它和 Vim 本身的自动折行区别就是,自动折行之后,原来的文字还是一整行,不能用 j k 在折行间切换,只能用 gj gk;而用 textwidth 自动拆分之后,一行文字变成了多行,每行间自动插入了换行符。可以用 j k 在行之间切换。相信只要看过 Vim 帮助文件的人都会有直观感受。

这两天在 Windows 系统上刚装了 gVim 7.4,在输入的时候发现会自动折行,用 :echo &tw 发现 textwidth 设置成了 78,于是在 _vimrc 里加上 set textwidth=0,但设置后,发现 textwidth 仍然是 78,没有被改变。于是 Google 一番,发现了这个,按照上面的方法设置了 let g:leave_my_textwidth_alone,还是没用。启动的时候 Vim 根本不认这个选项。

继续搜索,终于在万能的 StackExchange 上找到了这个,原来 Vim 启动时加载 .vim 文件是有顺序的。按照这里提供的方法,执行

:redir >d:\output.txt
:scriptnames
:redir END

得到我的 Vim 启动时加载的 vim 文件

D:\Program Files (x86)\Vim\_vimrc
D:\Program Files (x86)\Vim\vim74\vimrc_example.vim
D:\Program Files (x86)\Vim\vim74\syntax\syntax.vim
D:\Program Files (x86)\Vim\vim74\syntax\synload.vim
D:\Program Files (x86)\Vim\vim74\syntax\syncolor.vim
D:\Program Files (x86)\Vim\vim74\filetype.vim
D:\Program Files (x86)\Vim\vim74\menu.vim
D:\Program Files (x86)\Vim\vim74\lang\menu_zh_cn.cp936.vim
D:\Program Files (x86)\Vim\vim74\lang\menu_chinese_gb.936.vim
D:\Program Files (x86)\Vim\vim74\autoload\paste.vim
D:\Program Files (x86)\Vim\vim74\ftplugin.vim
D:\Program Files (x86)\Vim\vim74\indent.vim
D:\Program Files (x86)\Vim\vim74\mswin.vim
D:\Program Files (x86)\Vim\vim74\colors\desert.vim
D:\Program Files (x86)\Vim\vim74\syntax\nosyntax.vim
D:\Program Files (x86)\Vim\vim74\delmenu.vim
D:\Program Files (x86)\Vim\vim74\plugin\delimitMate.vim
D:\Program Files (x86)\Vim\vim74\autoload\delimitMate.vim
D:\Program Files (x86)\Vim\vim74\plugin\emmet.vim
D:\Program Files (x86)\Vim\vim74\plugin\getscriptPlugin.vim
D:\Program Files (x86)\Vim\vim74\plugin\gzip.vim
D:\Program Files (x86)\Vim\vim74\plugin\matchparen.vim
D:\Program Files (x86)\Vim\vim74\plugin\netrwPlugin.vim
D:\Program Files (x86)\Vim\vim74\plugin\rrhelper.vim
D:\Program Files (x86)\Vim\vim74\plugin\spellfile.vim
D:\Program Files (x86)\Vim\vim74\plugin\tarPlugin.vim
D:\Program Files (x86)\Vim\vim74\plugin\tohtml.vim
D:\Program Files (x86)\Vim\vim74\plugin\vimballPlugin.vim
D:\Program Files (x86)\Vim\vim74\plugin\zipPlugin.vim
D:\Program Files (x86)\Vim\vim74\lang\menu_zh_cn.utf-8.vim

用 grep 'textwidth' <filename>,在 vimrc_example.vim 和 menu.vim 中找到了对 textwidth 的设置。最终注释掉 vimrc_example.vim 里的

autocmd FileType text setlocal textwidth=78

 就可以了~~

Tags: vim
评论(39) 阅读(17975)

Python小程序

2010年10月18日 11:51

前段时间想学TeX的,记得以前下过一个TeXbook的压缩包,不过文件名忘了,只记得里面有.pdf和.tex的文件,就想用Python写个小程序找到这文件。

逻辑很简单,遍历磁盘文件,若后缀名为.zip(rar的没有处理,因为Python没直接处理它的库,后来网上搜了下,还是有处理rar的库的),则打开该文件,若压缩包内有文件后缀名为.tex,则打印出路径和文件名。

# -*- coding: utf-8 -*-
import os, zipfile

for root, dirs, files in os.walk('C:\\'):
    for x in (root, dirs, files)[2]:
        if x.endswith('.zip'):
            path = root+'\\'+x
            zf = zipfile.ZipFile(path, 'r')
            files = zf.namelist()
            for f in files:
                if f.endswith('.pdf'):
                    print f + ' in ' + path

先写个简单版v0.1,以后慢慢完善。

评论(32) 阅读(7644)

Python里的生成器

2010年10月16日 10:48

昨天看赖勇浩的一篇文章,讲的是生成器(具体是哪篇后来找不到了 =.=),前两天又在看这方面的内容,就稍微总结下。

我们都知道,在Python中定义一个函数可以用def,如果函数需要返回一个结果可以用return value,而如果返回的是一个结果集,可以用Python的集合类型,如列表。这里我们假设以列表返回。当列表不是很大的时候,还是很方便的,而如果要返回的数据非常多,将其放在一个列表中,会占用比较大的内存空间。Python为了解决这个问题引入了生成器。生成器每次返回列表中的一个结果,而不是将整个列表一起返回。相对于前者,生成器速度会慢一些,但是占用的空间会小一些。生成器之于列表,就相当于range()之于xrange(),或者是readlines()之于xreadline()(xreadline()在2.7中貌似没有……)

函数返回值是用return,而生成器返回是用yield,“yield语句会将函数关起,并向它的调用者返回一个值,但是保存足够的状态信息为了让其能够在函数从它挂起的地方回复。这能够允许这些函数不断的产生一系列的值,而不是一次计算所有的值,之后将值以类似列表之类的形式来返回。”“不过生成器函数也许也有一个return语句,这个语句就是用来终止产生值的。”《Python学习手册》第三版P383

代码说的更清楚点

def gensquares(N):
for i in range(N):
    yield i**2
x = gensquares(5)

gensquares()会生成0~N-1中每个数的平方,并依次返回,在IDLE中,print x会返回<generator object gensquares at 0x01202170>,而调用x.next()则会返回0~4的平方,第六次调用x.next()会返回StopIteration异常。

而这样单纯地用生成器只是返回生成器对象的地址,而不是一个集合,所以我们要把生成器放在列表解析里面,这样就有用多了:

for num in (x**2 for x in range(5)):
    print num,

for num in [x**2 for x in range(5)]:
    print num,

结果都是:0 1 4 9 16

注意:第一个函数用的是小括号,这样函数利用的就是生成器,而第二个是用的列表(这个例子有点囧,不过只为举例而用:),第一个的生成器形式是分5次依次返回0~4,而第二个列表形式是一次性返回[0, 1, 2, 3, 4]。这样可能看不出什么区别,但当返回的结果非常大时,生成器比列表占用的资源要少很多。

生成器同其他许多内置类型一样,支持迭代器,而其他很多支持迭代器的数据类型都可以产生生成器,这就是为什么遍历字典的时候不需要调用.keys(),遍历一个文件中的所有行不需要调用readlines()

for key in D:
    print key, D[key]

for line in open('test.txt'):
    print line,

PS:最近在看《Python学习手册》第三版,今天看到了模块一章,看的头昏脑胀,好像真的有点啰嗦了,看完写的这篇,好像我自己也变得啰嗦了 Orz....

PSS:初学Python,有错误的话请各位指出。

评论(1) 阅读(2676)

i++和++i

2010年9月30日 11:20

在 Chito 开发者的一篇日志中,评论下面有人说传说中 ++i 比 i++ 的效率高,看 K&R 的书,上面的自增也是用 ++i,感觉有点好奇,就照葫芦画瓢,按这篇文章中的方法用 gcc 反了一下,却发现两者汇编代码一样……

test.c

#include <stdio.h>

int main(void)
{
	int i;
	
	i = 0;
	i++;

	return 0;
}

test2.c

#include <stdio.h>

int main(void)
{
	int i;
	
	i = 0;
	++i;

	return 0;
}

 

反后的汇编代码

test.s

.file	"test.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.text
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	andl	$-16, %esp
	movl	$0, %eax
	addl	$15, %eax
	addl	$15, %eax
	shrl	$4, %eax
	sall	$4, %eax
	movl	%eax, -8(%ebp)
	movl	-8(%ebp), %eax
	call	__alloca
	call	___main
	movl	$0, -4(%ebp)
	leal	-4(%ebp), %eax
	incl	(%eax)
	movl	$0, %eax
	leave
	ret

 

test2.s

.file	"test.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.text
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	andl	$-16, %esp
	movl	$0, %eax
	addl	$15, %eax
	addl	$15, %eax
	shrl	$4, %eax
	sall	$4, %eax
	movl	%eax, -8(%ebp)
	movl	-8(%ebp), %eax
	call	__alloca
	call	___main
	movl	$0, -4(%ebp)
	leal	-4(%ebp), %eax
	incl	(%eax)
	movl	$0, %eax
	leave
	ret

具体如上了,比较了一下两者,是一样的,难道传说中的 ++i 比 i++ 效率高是假的? ==!!

我的水平很菜,若是有地方错了,欢迎各位指出。

评论(5) 阅读(2177)