星期一, 七月 26, 2010

VIM学习笔记 折行(Wrap)

折行显示

在默认情况下,Vim会自动折行––将超出屏幕范围的文本打断并显示在下一行。我们也可以通过以下命令,取消自动折行––超出屏幕范围的文本将不会被显示,你需要向句末移动光标,以使屏幕水平滚动,查看一行的完整内容。

:set nowrap

默认设置set sidescroll=0之下,当光标到达屏幕边缘时,将自动扩展显示1/2屏幕的文本。

sidescroll-off

通过使用set sidescroll=1设置,可以实现更加平滑的逐个字符扩展显示。

sidescroll-on

可以使用以下命令,恢复Vim的自动折行:

:set wrap

折行形式

我们可以告诉Vim在合适的地方折行:

:set linebreak

所谓合适的地方,是由breakat选项中的字符来确定的。在默认的情况下,这些字符是“^I!@*-+_;:,./?”。如果我们不希望在下划线处打断句子,只要用下面的命令将“_”从这个列表移除就可以了:

:set breakat-=_

如果一行被打断,Vim可能不会在句子连接处显示任何内容。我们可以通过设置showbreak选项,来显示所希望的指示信息:

:set showbreak=->

我们可以使用以下命令,取消自定义折行:

:set nolinebreak

在折行内移动

如果设置了wrap选项,那么很长的行将被折回并连续显示在屏幕上。但使用j命令,将移动屏幕上显示为多行的一行;而如果希望在折行内向下移动,则需要使用gjg<Down>命令。同理,gkg<Up>命令,用于向上移动。

j-gj

vimrc配置文件中,定义以下键盘映射,可以使jk命令自动判断是在折行内或是在折行间进行移动:

noremap j (v:count == 0 ? 'gj' : 'j')
noremap k (v:count == 0 ? 'gk' : 'k')

命令小结
:set wrap启用自动折行
:set nowrap取消自动折行
:set linebreak自定义折行

Ver: 1.1<上一篇 | 目录 下一篇>

星期六, 七月 17, 2010

虚伪的矛盾和矛盾的虚伪

不公正在增加,不平等在恶化,无知在成长,悲惨在扩大。这个能够把复杂工具送到另一个星球去研究那里的岩石结构的神经分裂的人类,却可以对数百万人因饥饿而死亡无动于衷。去火星仿佛比拜访自己的邻居更容易。

––若泽·萨拉马戈(葡萄牙语作家)

寻找世界和平就像寻找天空的蓝一样,表面上存在,其实只是幻象。

––安东尼.罗宾(世界潜能激励大师)

相比起能把人载上天空的飞行技术,人们却对飞机上的无线网络表现出了更多的惊讶和兴趣。

––弗里德曼(喜剧演员)

为什么看着动物被浸在石油里我会不住伤心,而看着动物在油锅被煎炸成快餐我却垂涎三尺?

––科拜尔(喜剧演员)

星期三, 七月 14, 2010

VIM学习笔记 换行 (Line Feed)

换行方式

在早期的打印机时代,开始新的一行要占用两个字符的时间。如果到了一行的结尾处,你要快速回到新的一行的开头,需要打印针头在纸面上飞快地掠过,常常会在纸面上留下污点。解决这个问题的办法就是,用两个字符:一个字符<Return>来移到第一列,另一个字符<Line feed>来新增一行。

计算机产生以后,存储较为昂贵,在如何解决回车换行这个老问题上,人们产生了不同的意见。UNIX人认为在到达一行的结尾时新增一行<Line feed> (LF),而Mac人则认同<Return> (CR)的解决办法,MS则坚持古老的<Return><Line feed> (CRLF)的方法。这就意味着,如果你将一个文件从一个系统转移到另一个系统,就面临着回车换行的问题。而Vim编辑器则会自动识别出出这种文件格式方面的区别,并做出相应处理。

fileformats选项,用于处理文件格式。以下命令告诉vim将UNIX文件格式做为第一选择,而将MS-DOS的文件格式做为第二选择:

:set fileformats=unix,dos

检测到的文件格式会被存放在fileformat选项中,我们可以用以下命令来查询:

:set fileformat?

我们还可以利用fileformat选项,来转换各种文件格式。例如,使用以下命令将名为readme.txt的MS-DOS格式的文件,转换为UNIX格式的文件。

:set fileformat=unix

在默认情况下,Vim认为文件是由行组成的,并且文件最后一行是以<EOL>为结束符的。如果你想设置文件以<EOL>结束符结尾,则可以用以下命令:

:set endofline

如果你想设置文件不以<EOL>结束符来结尾,则可以使用以下命令:

:set noendofline

显示换行

使用以下命令进入<list mode>,那么就可以清楚的看到以“$”表示的换行符和以“^I”表示的制表符。

:set list

line_feed

你可以使用以下命令退出<list mode>:

:set nolist

删除换行

line_feed_Ctrl_M

可以用以下命令删除换行符:

:%s/\n//g

可以用以下命令删除DOS文件中的回车符:

:%s/\r//g

可以用以下命令删除DOS回车文件中的“^M”:

:%s/ˆM//g

可以用以下命令删除行尾的空格以及DOS回车符。它没有使用“/”字符作为替换命令各个参数间的分隔符,而是使用了“#”字符。命令还使用了“\?”正则表达式,用来匹配它前面出现的字符0次或1次。

:%s#\s*\r\?$##

可以用以下命令删除三行空行:

:%s/^\n\{3}//

可以用以下命令将连续的两个空行替换成一个空行:

:%s/\n\n/\r/g

自动换行

在默认情况下,Vim是不会自动换行的,也就是说我们需要自己决定回车的位置。但是我们也可以通过指定textwidth选项,让Vim自动在指定位置换行。例如,使用以下命令指定在30列时自动换行。由于在遇到空格时才会自动换行,所以换行的精确位置可能会小于你指定的列宽。

:set textwidth=29

而以下命令告诉Vim从右面算起当达到10个字符的空格时要换行:

:set wrapmargin=10

注意:选项textwidth优先于wrapmargin。如果要使wrapmargin选项生效,必须将textwidth设置为0(这也是默认值)。

在指定了文本宽度的情况下,当我们将一行中的前几个文字删掉时,Vim并不会将后面行中的文本移动上来,而是形成了一些长短不一的段落。可以使用以下几种方法来处理这个问题:

一种方法是,在可视化模式下选中这些文本,然后用gq命令来格式化选中的段落。

line_feed_gq

另一种方法是,使用gqmotion命令来完成格式。例如:gq4j命令,告诉Vim要格式化本行,以及之后的4行,这样就达到了格式化5行的目的。如果要格式化整个段落,可以将光标放在段落的第一行上,然后执行命令gq}。而使用命令gqip可以格式化当前段落,而且并不必要将光标放在段落的第一行上。如果要想格式化一行,可以使用命令gqgq,也可以简记为gqq

合并行

命令J可以将本行和下一行合并为一行,同时用空格分隔这两行。我们也可以使用数字前缀来合并多行。例如3J会将当前行及之后的三行合并为一行。

通过设置joinspace选项,可以控制合并两行时的分隔符(如果一行是以标点符号来结尾)。如果设置:set nojoinspaces,用J命令合并两行时会用一个空格来分隔;如果设置:set joinspaces,用J命令合并两行时会用两个空格来分隔。如果不希望用空格来分隔合并的行,可以使用gJ命令。

不带参数的:join命令,可以将当前行及下一行合并为一行并使用空格来分隔各行。加入范围参数的:[range]join命令,可以合并多行。例如:1,3join命令,将合并第一到第三行。如果不希望加入空格分隔多行,那么可以使用:join!命令。

命令小结
:set fileformat设置文件格式
:set endofline设置文件结束符
:set noendofline取消文件结束符
:set list进入List Mode
:set nolist退出List Mode
:%s/\n//g删除换行符
:set textwidth设置行宽
:set textwidth设置行边距
:gq格式化文本
:join合并多行
J合并两行

Ver: 1.0<上一篇 | 目录 下一篇>

星期日, 七月 11, 2010

世界杯,不可能精彩的比赛

1990年,第一次看意甲,第一次看世界杯。也是从那时起,喜欢上这项运动。时间慢慢走过,也渐渐明白——为什么那些年龄越来越大的朋友,对足球也越来越没有兴趣。因为,终于懂事起来——那么丑陋、无聊的社戏实在不值得付出任何时间和热情。

明明享用的就是职业足球的排泄物,这是哪门子的盛宴?

每到世界杯,所有媒体都众口一词地宣称那里有最精彩的比赛。对于稍有鉴赏力的球迷来说,这样的宣传根本就是谎言。穆里尼奥就曾说过:“我不会去看世界杯,因为在我看来,世界杯的精彩程度根本比不上欧冠”。

32支球队,绝对是鱼龙混杂,滥竽充数者大有人在。每个洲为了名额争吵不断,技术性的足球变成了官僚的政治游戏,那些永远出不了线的垃圾球队也就有了机会占着位子。球队的质量,也就决定了比赛的质量。我不知道,有谁会有兴趣看德国对沙特,这样的比赛还不如切沃对乌迪内斯精彩。连中国队都能进入的决赛圈,也可以想像这种比赛已经烂到了何种程度。

已经参差不齐的球队,还是由散布在各个联赛甚至各个大洲的球员组成,他们一年也见不了几次面,一起训练的时间还没有和自家小狗玩耍的晨光长。还有很多球员因为各种原因是老死不相往来的,他们碰到一起擦出的不是灵感的火花,而是无休的内讧。顶尖球员,一年要参加近百场的职业比赛,即使没有伤病困扰,到了人困马乏的季末也是强弩之末了。如果奢望生理和心理都处在最差状态的球员能打出心领神会的精妙配合,简直就是痴人说梦。

曼联的长盛不衰,国米的脱胎换骨,每每证明:一支伟大的球队必须有一个伟大的教练。当你环顾世界杯赛场,没有穆里尼奥、弗格森、安切洛蒂、温格这样的顶级名帅,而有的只是些初出茅庐的新手和静待退休的老人,当然还有只会熊抱的前球王。打造一支稳定且强大的球队,需要主教练花费大量时间选择球员、悉心调教、磨合战术。这显然不是一朝一夕就能完成的任务,而世界杯只有两个礼拜,让球队准备一个月的比赛。不知道,这点时间能不能在马戏团训练一只狗熊穿过火圈?所以世界杯,也就没有什么战术可言,教练员不会也没有时间演练这些复杂高深的东西。他们主要的工作就是——看着球员不要和女朋友做爱,然后背熟离职宣言,随时准备做替罪羔羊。也有些积极进取的教练会忙些更重要的事——比如精心打扮或者奇装异服;比如任人唯亲或者拉帮结派。当然,那些工作的都不会技战术扯上关系,他们只是在争取做一个曝光率高的临时管家。

众所周知,世界杯是极尽功利的赛事,球员和教练都承受着极大的压力,他们不是为了快乐,不是为了球迷,甚至不是为了比赛而比赛,他们想的只是晋级夺冠。任何一个失误、一次失败,都可能使他们成为千古罪人,除了连篇累牍的指责,甚至还有子弹等着他们。世界杯简直就是一场残酷的审判和迫害。在这变态的紧张气氛中,球员又如何能有正常的发挥?赛会制的比赛,本来就存在极大的偶然性,再加上连续做战的疲劳,别说精彩的比赛,你连球星的真正风采都领略不到。

如果你想看精彩足球,每年都有无数场职业足球的巅峰对决——国际米兰对AC米兰、皇马对巴萨、河床对博卡......哪一场不是星光熠熠、激情四射!那才是“真球迷”的饕餮盛宴。而世界杯的主体看客是为数众多的“伪球迷”,他们不知道什么叫阵形,不知道什么叫越位,甚至连球场上的队员都认不出,他们只不过是被媒体绑架而来装点门面的人头。所以,世界杯不是以精彩的比赛为基础,而是以组织者、商家和媒体共同营造的营销为支撑的。

如果你还在看世界杯,那么请说清楚:“哥看的不是比赛,是热闹!”

星期三, 七月 07, 2010

听他们说英雄主义这回事 About Hero

一个指望英雄的国家是不幸的国家。

── 贝托尔特·布莱希特(Bertolt Brecht)

指望英雄是无能的表现,是一种为自己做不到某事而寻找借口的行为。如果某国家的铁路系统出现了故障,人们要做的应该是去调查各个站长、调度或其他人的责任,而不是等待某个英雄拯救者的出现。

── 翁贝托·埃科

星期日, 七月 04, 2010

简洁才是美

It seems that perfection is reached not when there is nothing left to add, but when there is nothing left to take away.

当你认为一项设计达到完美时,并不意味着没法在往里面添加任何东西,而是指没法从里面除掉什么。

--Antoine de Saint-Exupery,Terre des hommes, 1939

Brevity is the soul of wit.

简练是智慧的灵魂。

--莎士比亚《哈姆莱特》

Simplicity is the ultimate sophistication.

--Leonardo da Vinci

After-dinner speechs should be like ladies' skits - long enoug to cover the subject, and short enough to be interesting.

宴会席上的演讲要像女士们的裙子--长得足够蔽体,短得能引人入胜。

--乔志高《美语录(第二辑)听其言也》

Less is more.

--Mies van der Rohe

星期六, 七月 03, 2010

南岳山光明寺

建筑,让生活更美好。城市,不能。

浄土真宗本願寺派
夜景:屏幕截图自官方网站:www.koumyouji.com/

浄土真宗本願寺派
日景:屏幕截图自自官方网站:www.koumyouji.com/

南岳山光明寺位于日本四国西条市,其主殿迄今已有250年的历史,今天已经无法修复使用,因而需要重建。水网密布成为该城市主导性的自然生态特征。安藤忠雄设计时充分考虑了这一地域特点,设计规划时充分尊重了原有的历史环境,没有影响现存的钟楼和大门建筑,而是将光明寺大殿布置在毗邻原有历史建筑的一片水池中,成为一方净土。建筑设计并不突出材质的强壮,而是强调线的纤细。

南岳山光明寺

南岳山光明寺

梁下4段椽子整齐的排列继承了日本古建筑的肃然之美。与建筑墙体相垂直方向挑出椽子的做法是日本古建筑的特征。另一方面,15cm见方的纤细立柱与高达8m的柱间玻璃以15cm的间距交替排列,形成皮膜状的外墙,又是一种典型的现代设计。传统的椽子与崭新的柱群奏出线的和声。

南岳山光明寺

VIM学习笔记 多编码处理 (Multi-Encodings)

在Vim中有四个与编码有关的选项:“fileencodings (fencs)”、“fileencoding (fenc)”、“encoding (enc)”和“termencoding (tenc)”,任何一个选项出现错误,都会导致出现乱码。

encoding

encoding是Vim内部使用的字符编码方式。Vim内部所有的buffer、寄存器、脚本中的字符串等,都会使用encoding设置的编码。如果编码方式与Vim的内部编码不一致,那么会先把编码转换成内部编码。如果编码中含有无法转换为内部编码的字符,那么这些字符就会丢失。因此,在选择Vim内部编码时,一定要使用一种包容力足够强的编码。由于encoding选项涉及到Vim中所有字符的内部表示,因此只能在Vim启动的时候设置一次。在Vim工作过程中修改encoding会造成非常多的问题。

建议将encoding设置为utf-8,同时设置以下选项,以避免在非UTF-8系统(如Windows)下,菜单和系统提示出现乱码:

set encoding=utf-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8

当然,你也可以设置菜单和信息都显示为英文,这样也可以避免Vim程序界面乱码的问题:

set langmenu=en_US
let $LANG = 'en_US'
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

termencoding

termencoding是Vim用于屏幕显示的编码。Vim会把内部编码转换为屏幕编码,再用于输出。内部编码中含有无法转换为屏幕编码的字符时,该字符会变成问号,但不会影响对它的编辑操作。如果termencoding没有设置,则直接使用encoding而不进行转换。

例如,你在Windows下通过telnet登录Linux工作站时,由于Windows的telnet是GBK编码的,而Linux则使用UTF-8编码,因此telnet下的Vim中就会乱码。此时有两种消除乱码的方式:你可以将Vim的encoding改为gbk,或者保持encoding为utf-8,而将termencoding改为gbk。显然,使用前一种方法时,如果编辑的文件中含有GBK无法表示的字符时,这些字符就会丢失。但如果使用后一种方法,虽然由于终端所限,这些字符无法显示,但在编辑过程中这些字符并不会丢失。

你可以利用以下命令设置termencoding:

set termencoding=utf-8

对于图形界面下的GVim,它的显示不依赖TERM,因此termencoding对于它没有意义。在GTK2下的GVim中,termencoding永远是utf-8,并且不能修改。而Windows下的GVim则忽略termencoding的存在。

fileencoding

当Vim从磁盘上读取文件时,会对文件编码进行探测。如果文件的编码方式和Vim的内部编码方式不同,Vim就会对编码进行转换。转换完毕后,Vim会将fileencoding选项设置为文件的编码。当Vim存盘时,如果encoding和fileencoding不一致,Vim就会进行编码转换。因此,通过打开文件后设置fileencoding,可以将文件由一种编码转换为另一种编码。

set fileencoding=utf-8

注意:因为Vim是在打开文件时,自动探测和设置fileencoding的,所以,如果出现乱码,就无法通过在打开文件后重新设置fileencoding来纠正乱码。

fileencodings

编码的自动识别,是通过设置fileencodings实现的。fileencodings是一个用逗号分隔的列表,列表中的每一项是一种编码的名称。当我们打开文件时,Vim按顺序使用fileencodings中的编码进行尝试解码,如果成功的话,就使用该编码方式进行解码,并将fileencoding设置为这个值;如果失败的话,就继续检验下一个编码。因此,我们在设置fileencodings时,一定要把严格的编码方式放在前面,把宽松的编码方式放在后面。例如,latin1是一种非常宽松的编码方式,任何一种编码方式得到的文本,用latin1进行解码,都不会发生解码失败。当然,解码得到的结果也很可能会是乱码。因此,如果你把latin1放到fileencodings的第一位,那么打开任何中文文件都会显示乱码了。推荐使用以下fileencodings设置:

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,latin1

其中, ucs-bom 是一种非常严格的编码,非该编码的文件几乎没有可能被误判为ucs-bom,因此放在第一位。utf-8 也相当严格,除了很短的文件之外也是几乎不可能被误判的,因此放在第二位。接下来是 cp936gb18030big5 这些编码相对宽松的编码。 而最为宽松的 latin1 编码,则放在列表的最后。

如果编码被误判了,解码后的结果就会显示为无法识别的乱码了。此时,如果你知道这个文件的正确编码,可以把fileencodings改成只有这一种编码,阻止任何 fall-back 发生,然后重新打开这个文件。

编码转换

当我们看到类似“&#24573;&#28982;”的编码时,可以通过以下命令将&#后的数字,经由函数nr2char()转换为可读的文字:

:%s/&#\([0-9]\+\);/\=nr2char(submatch(1))/g

命令小结
set encoding设置Vim的内部编码方式
set termencoding设置Vim的屏幕显示编码
set fileencoding设置文件的编码方式
set fileencodings设置Vim的解码列表

Ver: 1.0<上一篇 | 目录 下一篇>