没有样式就是最好的样式

Archive for January, 2007


ruby string join中的一个陷阱

Jan 26, 2007 Author: | Filed under: Uncategorized

用ruby的string join方法为一个textarea准备多行数据。

%w{word1 word2}.join ‘

结果总是不对,textarea在一行中显示 “word1
word2″

以为是textarea需要什么奇迹淫巧来显示多行数据,于是google,再google…

折腾了半天没有结果,突然间电光火石,难道说。。。

%w{word1 word2}.join ”

果不其然,被ruby的一个小小语法陷阱害了。ruby中双引号中的字符串可以包含转义字符,比如 ,
, 但单引号中的每一个字符只是被忠实的表述,不做任何转义处理。所以文中开头的一句代码,实际上产生的是 “word1\nword2″,’
‘代表两个字符,前面的”"在生成最终的结果时被转义成了”\”。

IE6IE7Firefox的hack代码

Jan 26, 2007 Author: | Filed under: Uncategorized

via http://www.hoofei.com/2006/12/05/css-for-ie6-ie7-and-firefox/

#example { color: #333; } /* Firefox */

* html #example { color: #666; } /* IE6 */

*+html #example { color: #999; } /* IE7 */

恢复 firefox 2.0 backspace 键页面后退功能

Jan 25, 2007 Author: | Filed under: Uncategorized

firefox 2.0 backspace 键页面后退功能没有了(成为 向上翻页 了)。只能使用 alt+右方向键。据说是为了解决一个bug(On Linux, backspace should be page up, not history back),要恢复的话在 about:config

过滤器 browser.backspace_action

值改为1即可。

vim 学习笔记

Jan 25, 2007 Author: | Filed under: Uncategorized

vim 直接ftp修改远程文件(类似于 editplus)

vim ftp://192.168.150.20/index.php

vim 打开文件管理器

e.

d 新建目录

- 回到上级目录

s 改变排序方式

x 执行当前(光标所在处)文件

半个中文显示

ambiwidth=double:把所有的“不明宽度”字符 [9]——指的是在 Unicode 字符集中某些同时在东西方语言中使用的字符,如省略号、破折号、书名号和全角引号,在西方文字中通常字符宽度等同于普通 ASCII 字符,而在东方文字中通常字符宽度等同于两倍的普通 ASCII 字符,因而其宽度“不明”——的宽度置为双倍字符宽度(中文字符宽度)。此数值只在 encoding 设为 utf-8 或某一 Unicode 编码时才有效。需要额外注意的是,如果你通过终端使用 Vim 的话,需要令终端也将这些字符显示为双宽度。比如,XTERM [12] 的情况下应该使用选项“-cjk”,即使用命令“uxterm -cjk”来启动使用双宽度显示这些字符的 Unicode X 终端;使用 PuTTY 远程连接的话则应在配置的 Window-Translation 中选中“Treat CJK ambiguous characters as wide”

需要设定的选项通常放在用户的 Vim 资源配置文件中,即在 ~/.vimrc 文件中加入:

set encoding=utf-8

set fileencoding=chinese

set fileencodings=ucs-bom,utf-8,chinese

set ambiwidth=double

如果想进一步了解这些选项的话,可以使用“:help ‘选项’”查看帮助文档中的相关(英文)信息。帮助中也可以查到这些选项(以及命令)的缩写:本文中为方便理解,除一些极少有人使用完整拼写的命令如“: e(dit)”、“:s(ubstitute)”等之外,一般使用完整拼写而不说明或使用缩写。关于配置文件 .vimrc,可以使用“:help .vimrc”查看相关信息。

在使用内部编码 UTF-8 的情况下,如需编辑 fileencodings 之外(其不能自动识别)的文件,则可以使用以下命令:“:e ++enc=编码 文件名”。详情可参考“:help ++enc”。

鼠标支持

要激活文本界面中的鼠标支持也很容易,只需要执行一句“:set mouse=a”即可。

启用了鼠标支持之后,Vim 主要支持的鼠标操作有:

* 单击移动光标到点击的位置;

* 在帮助的关键字上双击显示该关键字相关的帮助信息;

* 在普通文本上双击选中点击位置的单词;

* 拖动鼠标选中文本;

* 使用鼠标滚轮滚动当前缓冲区中的文本;

* 多窗口编辑时可以拖动窗口分栏的位置。

进一步的信息可参看“:help ‘mouse’”、“:help mouse-using”和“:help scroll-mouse-wheel”。

特别需要值得一提的是,在远程访问 Linux 系统时也是可以使用鼠标的。如果使用 X Window 系统,自然不必说;而使用 SSH 远程连接时,大部分 Linux 下的终端客户程序,如 XTERM、GNOME-Terminal [13]、较新版本的 Konsole [14],以及 Windows 下的 PuTTY,支持鼠标的使用:你只需简单地启动 Vim、执行一句“:set mouse=a”就可以了(当然,也可以把上面的语句去掉起始的冒号放到 .vimrc 文件中)。

替换内容的

在模式中使用的是“
”,而被替换的内容中却不能使用“
”,而只能使用“
”。原因是历史造成的,详情如果有兴趣的话可以查看“:help NL-used-for-Nul”。

! 执行外部命令

最正规的执行外部命令的方法,如前所述,就是“:!”。比如,我们想要显示当前目录下的所有文件,就可以直接执行:“:!ls”。Vim 会在一个终端窗口中进行文件列表,然后提示我们按键返回 Vim 中。事实上,这种方式对于“cp”、“rm”这样基本不需要输出的命令比较实用,而对于“ls”这样关注于输出的命令并不太适用。

如果想把外部命令执行的结果插入到当前编辑的缓冲区中,可以考虑使用“:r!”。比如,我们使用“:r!ls”,就可以把“ls”命令的执行结果插入到缓冲区中光标所在行下面。在使用宏时,这可能会特别有用。

Vim 的“:!”命令还有一个特别强大的技巧可以使用。拿一个实际例子,我们需要对在一个文件的每一行之前插入一个编号,该怎么做呢?——用 Vim 的宏或者脚本可以完成这一工作,但这不是最高效、最灵活的工作方式。Linux 下一般带有的 GNU 的 nl,可以用非常灵活的方式来完成这一任务——要对所有的非空行进行编号,只需要“:%!nl”;要对包含空行的所有行进行编号?OK,“:%!nl -ba”。

稍作一点解释。当使用可视模式选中文本行后然后键入“:!”(命令行上将出现“:’<,'>!”,表示命令的范围是选定的文本),或者使用“:%!”(表示命令的范围是整个缓冲区中的文本),Vim 在执行后面的命令时,将把命令范围里的文本行作为后面执行的命令标准输入,并用命令执行后的标准输出替换当前缓冲区中的这些文本行。这就是上面的命令行的工作原理。

小技巧

* %(跳转到与之匹配的括号处)

* .(重复上次的修改命令)

* .(跳转到最近修改过的位置)

* ZQ(无条件退出)

* ZZ(存盘退出)

* ga(显示光标下的字符在当前使用的 encoding 下的内码)

* guw(光标下的单词变为小写)

* gUw(光标下的单词变为大写)

* :TOhtml(根据 Vim 的语法加亮的方式生成 HTML 代码;在图形界面中也可以使用菜单“Syntax—Convert to HTML”达到同样效果)

无聊的时候,还可以试试(呵呵!):

* :help!

* :help 42

* :help holy-grail

# 它原来是没有前面的目录的。

后来问题渐多,加个目录可能好一些。

目录怎么做呢?

当然一行行复制粘贴是可以的,但这岂不是埋没了vim!

只要一条命令:

:g/(d{1,2})/t$

这样就生成了正序的目录(在文章最后)。或者,

:g/(d{1,2})/t0

这样生成了逆序的目录(在文章开头)。

# 上述应用引申一下,

你也可以打开比如 神雕侠侣.txt

执行:g/杨过说/m$

把杨过说的话都整理在文章最后。

# 文中的———–是如何输入的?

72i-

就这么简单啊

# 再引申一下g的用法

:g/^/m0

把整个文件的行顺序倒过来。

:g/^/pu _

则可以在行间插入空行

更多g的用法,见http://www.vim.org/tips/tip.php?tip_id=227

vim 全部转小写

Jan 25, 2007 Author: | Filed under: Uncategorized

打开文件后,不用任何鼠标、菜单,只须在键盘上按下“ggguG”就行了。

  极品软件就是这样:唯有功能强到极致,操作才能简到极致!

解释一下:ggguG分作三段gg gu G

gg=光标到文件第一个字符

gu=把选定范围全部小写

G=到文件结束

Vim 正则匹配次数需要 a/{2} 而不仅仅是 a{2}

vim 技巧(转)

Jan 25, 2007 Author: | Filed under: Uncategorized

来自 li3的笔记

1 ;:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

2 ;:文档来源: http://www.rayninfo.co.uk/vimtips.html

3 ;:翻译参考: 没有记,请原作者见谅

4 ;:文档日期: 2006-10-13 11:19:04

5 ;:更新记录:

6 ;:作  者: li3

7 ;:生成工具: 2Html.vim

8 ;:blog.asp?name=li3

9 ;:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

10

11 ;:——————————————————————————–

12 ;:如果你使用的是MS-Windows,可能有的键已经被定义为Windows中的一些默认功能键。如果不

13 ;:想这样,请编辑$VIMmswin.vim

14 ;:——————————————————————————–

15 /joe/e ;: 设置光标到匹配”joe”的末尾

16 /joe/e+1 ;: 设置光标到匹配”joe”的末尾再后移一位

17 /joe/s-2 ;: 设置光标到匹配”joe“的开头再前移两位

18 /joe/+3 ;: 搜索“joe” 找到后将光标下移3行

19 /^joe.*fred.*bill/ ;: 匹配以’j'开头且”joe”到”fred”到”bill”之间至少有一个字符

20 /^[A-J]+/ ;: 搜索行首非’A'到’J‘重复一次以上的行

21 /begin\_.*end ;: 多行匹配

22 /fred\_s*joe/i ;: 多行搜索可以是任何空白字符包括
, 等等

23 /fred|joe ;: 搜索fred或者joe

24 /.*fred&.*joe ;: 搜索同时包括fred跟joe的行

25 //i ;: 搜索独立的单词fred

26 / ;: 搜索独立的4位数字

27 /DddddD ;: 搜索恰好4位的数字

28 / ;: 同/

29 /([^0-9]|^)%.*% ;: 查找以非0~9数字或在行首的%%所包括的内容

30 ;:” 查找空行

31 /^
{3} ;: 匹配三连续的空行

32 ;:” 使用正则表达式组查找

33 /(fred).*(joe).*2.*1

34 ;:” 正则表达式重复

35 /^([^,]*,){8}

36 ;:” visual 下搜索

37 :vmap // y/ ;: visually模式下的键盘映射,把//映射成匹配当前选中的文本

38 :vmap // y/=escape(@”,’\/.*$^~[]‘) ;: 包括空白字符

39 ;:” zs 和 ze 匹配原 :h /zs

40 /]*ze> ;: 匹配<与>所包含的内容

41 ;:” 零宽度匹配 :h /@=

42 /<@<=[^>]*>@= ;: 查找<与>所包含的内容

43 /<@<=\_[^>]*>@= ;: 多行匹配<与>所包含的内容

44 ;:” 多行查找 \_ 的意思是包括换行符

45 / ;: 匹配<与>所包含的所有内容

46 /fred\_s*joe/i ;: 匹配fred开始到joe,之间一定得是空白字符

47 /bugs(\_.)*bunny ;: 匹配所有bugs到bunny的字符串

48 :h \_ ;: help

49 ;:” 查找函数声明,nmap为normal模式下的键盘映射

50 :nmap gx yiw/^(subfunction)s+

51 ;:” 查找多个文件

52 :bufdo /searchstr/ ;: 在多个文件缓冲区里执行查找

53 ;:” 更好的多文件查找定位方法

54 :bufdo %s/searchstr/&/gic ;: 在多个文件缓冲区里查找,按下n停止

55 ;:” 怎样不使用 / 来查找网址

56 ?http://www.vim.org/ ;: 向后查找

57 ;:” 查找指定字符以外的字符串

58 /cv([^aeiou]&a){4} ;: 查找4个辅音字母

59 ;:—————————————————————————–

60 ;:#替换

61 :%s/fred/joe/igc ;: 普通替换命令

62 :%s/
//g ;: 删除 DOS 的换行符 ^M

63 ;:” 你的文本文件是否乱七八糟的排成一行?使用如下命令

64 :%s/
/
/g ;: 转换 DOS 回车符 ^M 为真正的回车符

65 :%s= *$== ;: 删除行尾空白

66 :%s= +$== ;: 同上

67 :%s#s*
?$## ;: 删除尾部空白和dos换行符

68 :%s#s*
*$## ;: 同上

69 ;:” 删除空行

70 :%s/^
{3}// ;: 删除连续3个空行

71 :%s/^
+/
/ ;: 压缩空行,多个替换为一个

72 :%s#<[^>]+>##g ;: 删除html的tag部分

73 :%s#<\_.{-1,}>##g ;: 多行删除 html 的tags (非贪婪方式)

74 ;:” IF YOU ONLY WANT TO KNOW ONE THING

75 :’a,’bg/fred/s/dick/joe/igc ;: 非常有用

76 ;# 译释:”a,”b指定一个范围:mark a ~ mark b

77 ;# g//用一个正则表达式指出了进行操作的行必须可以被fred匹配

78 ;# 看后面,g//是一个全局显示命令

79 ;# s/dick/joe/igc则对于这些满足条件的行进行替换

80 ;:” 复制列

81 :%s= [^ ]+$=&&= ;: 复制最后一列

82 :%s= f+$=&&= ;: 复制最后一列

83 :%s= S+$=&& ;: 复制最后一列

84 ;:” 记忆(反向引用)

85 :s/(.*):(.*)/2: 1/ ;: 将两个字段颠倒

86 :%s/^(.*)
1$/1/ ;: 删除重复行

87 ;:” 非贪婪匹配 {-}

88 :%s/^.{-}pdf/new.pdf/ ;: 删除第一个pdf

89 ;:” use of optional atom ?

90 :%s#<[zy]?tbl_[a-z_]+>#L&#gc ;: lowercase with optional leading characters

91 ;:” 跨越尽量多的行

92 :%s/// ;: 删除多行注释

93 :help /{-} ;: 查看非贪婪匹配的更多帮助

94 ;:” 使用寄存器替换

95 :s/fred/a/g ;: 将fred替换为寄存器a里的内容 #为按下Ctrl与r

96 :s/fred/asome_texts/g

97 :s/fred/=@a/g ;: 比较好的办法,不显示替换内容

98 ;:” 在一行里写多种命令

99 :%s/f+.gif>/
&
/g | v/.gif$/d| %s/gif/jpg/

100 :%s/a/but/gie|:update|:next ;: 当使用 @: 来重复

101 ;:” 或运算

102 :%s/suck|buck/loopy/gc ;: 替换suck或者buck(这里|不是管道)

103 ;:” 调用vim函数

104 :s/__date__/=strftime(”%c”)/ ;: 将__date__替换成当前日期,使用strftime函数

105 ;:” 处理列,替换所有在第三列中的str1

106 :%s:((w+s+){2})str1:1str2:

107 ;:” 交换第一列跟第四列

108 :%s:(w+)(.*s+)(w+)$:321:

109 ;:” 过滤form中的内容放在寄存器里

110 :redir @*|sil exec ‘g#<(input|select|textarea|/=form)>#p’|redir END

111 :nmap ,z :redir @*sil exec ‘g@<(inputselecttextarea/=form)>@p’redir END

112 ;:” 两位以上的数字减三(带进位。这个命令挺有趣)

113 :%s/d+/=(submatch(0)-3)/

114 ;:” 包含loc或者functions的行中的数字加6

115 :g/loc|function/s/d/=submatch(0)+6/

116 ;:” 比上面更好的方法

117 :%s#txtdevzsd#=submatch(0)+1#g

118 :h /zs ;查看帮助

119 ;:” 前缀为gg的数字加6

120 :%s/(gg)@<=d+/=submatch(0)+6/

121 :h zero-width ;查看帮助

122 ;:" 替换一个特定字符串为数字

123 :let i=10 | 'a,'bg/Abc/s/yy/=i/ |let i=i+1 ;# 将yy转换成10,11,12等等

124 ;:" 比上面的更精确

125 :let i=10 | 'a,'bg/Abc/s/xxzsyyze/=i/ |let i=i+1 # 将xxyy 转换成 xx11,xx12,xx13

126 ;:" 将查找内容放入内存,然后用zs进行简单替换

127 :%s/"([^.]+).*zsxx/1/

128 ;:" 将xx替换为此行内容

129 :nmap z :%s#<=expand(”“)>#

130 ;:” 将Vis选中的内容用<>括起来

131 :vmap z :%s/<*>/

132 ;:—————————————————————————–

133 ;:” 下面举一些在替换中使用替换的例子

134 ;:” 多种分符可以被用在替换中

135 :%s,(all/.*)@<=/,_,g ;: 用 _ 替换 "all/"之后的 /

136 ;:" 同样的功能

137 :s#all/zs.*#=substitute(submatch(0), '/', '_', 'g')#

138 :s#all/#&^M#|s#/#_#g|-j! ;" 查找断行,并合并为一行

139 ;:" 在替换命令中使用替换

140 :%s/.*/='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/

141 ;:-----------------------------------------------------------------------------

142 ;:" 全局显示命令

143 :g/gladiolli/# ;: 查找并显示匹配的行号

144 :g/fred.*joe.*dick/ ;: 显示所有含有 fred,joe & dick的行

145 :g// ;: 显示单一单词fred

146 :g/^s*$/d ;: 删除所有空行

147 :g!/^dd/d ;: 删除不含字符串”dd”的行

148 :v/^dd/d ;: 同上

149 :g/fred/,/joe/d ;: 删除所有的从fred到joe

150 :g/——-/.-10,.d ;: 以——-为标记删除之前的10行

151 :g/{/ ,/}/- s/
+/
/g ;: 删除 {…}之间的空行

152 :v/S/d ;: 删除空行

153 :v/./,/./-j ;: 压缩空行

154 :g/^$/,/./-j ;: 同上

155 :g/

156 :g/^/put_ ;: 双倍行宽 (pu = put)

157 :g/^/m0 ;: 颠倒文件 (m = move)

158 :'a,'bg/^/m'b ;: 颠倒选中的 a 到 b

159 :g/^/t. ;: 重复行

160 :g/fred/t$ ;: 拷贝行从fred到结尾

161 :g/stage/t'a ;: 拷贝行从stage 到 marker a(a为标记的位置)

162 :g/(^I[^^I]*){80}/d ;: 删除最少包含80个tab的行

163 ;:" 隔行替换

164 :g/^/ if line('.')%2|s/^/zz /

165 ;:" 查找标记a与b 间所有包含 "somestr"

166 ;:" 复制所有"otherstr"后的行

167 :'a,'bg/somestr/co/otherstr/ ;: co(py) or mo(ve)

168 :'a,'bg/str1/s/str1/&&&/|mo/str2/ ;" 范围同上,进行替换

169 :%norm jdd ;: 隔行删除

170 ;:" 增加数字 (键入 ) ;#在MS-Windows中已经被定义为全选

171 :.,$g/^d/exe “norm! ” ;: 增加从当前行首到结尾的数字

172 :’a,’bg/d+/norm! ^A ;: 增加数字

173 ;:” 保存全局命令的结果 (注意必须使用添加模式) 你需要使用 qaq 清空寄存器a.

174 ;:”save results to a register/paste buffer 存储结果到 寄存器/粘贴 到 a

175 :g/fred/y A ;: 添加配备行到寄存器到 a

176 :g/fred/y A | :let @*=@a ;: 放入复制缓冲区

177 :let @a=”|g/Barratt/y A |:let @*=@a

178 :’a,’b g/^Error/ . w >> errors.txt ;” 将查找内容放入一个文件 (文件必须存在)

179 ;:” 复制每一行,然后在复制出来的每一行两侧加上一个 print ‘复制出来的内容’

180 :g/./yank|put|-1s/’/”/g|s/.*/Print ‘&’/

181 ;:” 用文件中的内容替换字符串,-d 表示删除“标记”

182 :g/^MARK$/r tmp.ex | -d

183 ;:” 精致的显示方法

184 :g/ /z#.5 ;: 带行号显示

185 :g/ /z#.5|echo “==========” ;: 漂亮的显示

186 ;:” 用 g// 执行正常命令

187 :g/|/norm 2f|r* ;: 替换第二个|为*

188 ;:” 在新窗口中显示查找结果

189 :nmap :redir @a:g//:redir END:new:put! a

190 ;:—————————————————————————–

191 ;:” 全局命令和替换命令联姻 (强大的编辑能力)

192 :’a,’bg/fred/s/joe/susan/gic ;: 可以使用反向引用来匹配

193 :g/fred/,/joe/s/fred/joe/gic ;: 非行模式

194 ;:—————————————————————————–

195 ;:” 先找fred,然后找joe

196 :/fred/;/joe/-2,/sid/+3s/sally/alley/gIC

197 ;:—————————————————————————–

198 ;:” create a new file for each line offile eg 1.txt,2.txt,3,txt etc

199 ;:” 将每一行的内容存成一个文件,文件名为 行号.txt 如 1.txt,2.txt 等

200 :g/^/exe “.w “.line(”.”).”.txt”

201 ;:—————————————————————————–

202 ;:” 绝对精华

203 ;:—————————————————————————–

204 * # g* g# ;: 查找当前光标下的单词(单个单词) () (向前/向后)

205 % ;: 匹配括号 {}[]()

206 . ;: 重复上次操作

207 @: ;: 重复上次的命令

208 matchit.vim ;: 适%能匹配