8月 172012
 

从删除空行说起:

命令:

这里面包含三部分:

1: g

2: /^$/

3: d

关于 :g 的使用参看:

global 用于重复执行一条命令,  ‘d’ 就是delete,相当于选择模式匹配的部分,然后执行一个d命令,也可以是:

如下命令是怎么解释的呢:

‘s’ 是一个替换命令,后面是其参数,可以适当选择合适的分隔符,如把所有的 /data1 替换为 /data2:

这里使用 ‘/’ 做分隔符显然不太合适,使用 # 就省得对 ‘/’  做转义了

 Posted by at 下午 6:23
3月 212012
 

在指定文件中找关键字:
:vimgrep keyword file

在指定目录下找关键字:
:vimgrep keyword **

在指定目录下的php文件中找关键字:
:vimgrep keyword **/*.php

查找所有匹配的关键字:
:vimgrep /keyword/g **/*.php

——————————————
:vimgrep 是vim来实现的,内置的,跨平台的搜索工具,但是效率上是差一些的,但是有很好的正则的支持
:grep 是外部工具

还有专门用来搜索的vim插件:http://www.vim.org/scripts/script.php?script_id=311

 Posted by at 上午 6:07
3月 182012
 

vim的fuf插件查找目录下的文件还是非常好使的,但是,当我双击一个PHP文件,使用vim打开的使用,总提示l9 load失败,然后fuf插件就不能用。 于是,我把l9插件 和fuf插件重现安装了一下,还是不好使。后来把vim的install.exe 也执行了一遍,还是不好使。

一个偶然的机会,我发现从快速启动栏启动vim的时候没有这种报错,而且fuf插件是好使的; 我就仔细观察了一下双击PHP文件时的报错信息,发现启动的vim是我的vim7.1, 而此前我看到过fuf插件是在vim7.2之后才好使的,其实,这时候问题已经基本明白了:我曾经是使用vim7.1的,升级到vim7.3后,vim7.1没有删除,启动栏里面启动的是vim7.3,这个没有疑问,而.php 文件关联的那个vim的版本我不太清楚了,而且比较可气的是,重新安装vim并没有修改这个关联,我手动将.php 文件关联的vim修改为vim7.3时,问题解决。

这个问题我昨天折腾了1个多小时,这次却几分钟给搞定了,看来有时候不能硬来

 Posted by at 上午 9:12
7月 302011
 

如果你在看这篇文章,大概你也在使用VIM写代码了。如果你使用了NERD_tree这个插件,可能你会用到BookMark的功能,如果还不知道,可以先看一下NERD_tree的文档。
如果你为自己的项目的根目录建立了一个BookMark,则下次进入项目的时候就不需要先打开项目目录,然后再一点一点地找到自己想看到的文件,例如,我建立了一个叫Test的项目,首先启动vim,然后执行命令 :BookMarkToRoot Test  ; 这样就直接到了我的项目目录了;
但是有一点很不痛快的是,现在使用:pwd 来查看当前目录的话,并不是项目的目录,于是查看了一下NERD_tree.vim,做了如下修改:

添加了红方框标出的一行,就可以了;

这样的话,在项目所在的目录执行一些命令也比较方便,例如一些svn的命令。

另外,当你打开树目录时,在目录树窗口中使用 "B" 命令可以打开可关闭你设置过的标签,很方便哦~

 Posted by at 上午 3:37
7月 252011
 

不解释了,把下面代码贴到.vimrc文件中就行了,然后,重新打开vim,写一个函数试试,我感觉还不错的…

 
  1. :inoremap <S-ENTER> <c-r>=SkipPair()<CR>
  2. :inoremap <S-SPACE> <ESC>la
  3. :inoremap <C-ENTER> <ESC>A;<CR>
  4. :inoremap ( ()<ESC>i
  5. :inoremap ) <c-r>=ClosePair(‘)’)<CR>
  6. :inoremap { <c-r>=ClsoeBrace()<CR>
  7. :inoremap } <c-r>=ClosePair(‘}’)<CR>
  8. :inoremap [ []<ESC>i
  9. :inoremap ] <c-r>=ClosePair(‘]’)<CR>
  10. :inoremap ;; <ESC>A;<CR>
  11. function ClosePair(char)
  12.    if getline(‘.’)[col(‘.’) – 1] == a:char
  13.       return "\<Right>"
  14.    else
  15.       return a:char
  16.    endif
  17. endf
  18. function Semicolon()
  19.    "echo getline(‘.’)[col(‘.’)]
  20.    if getline(‘.’)[col(‘.’)] == ‘)’
  21.       return "<ESC>A;"
  22.    elseif getline(‘.’)[col(‘.’)] == ‘}’
  23.       return "\<ESC>A;"
  24.    elseif getline(‘.’)[col(‘.’)] == ‘]’
  25.       return "\<ESC>A;"
  26.    else
  27.       return ";"
  28.    endif
  29. endf
  30. function SkipPair()
  31.    if getline(‘.’)[col(‘.’) – 1] == ‘)’
  32.       return "\<ESC>o"
  33.    else
  34.       normal j
  35.       let curline = line(‘.’)
  36.       let nxtline = curline
  37.       while curline == nxtline
  38.          if getline(‘.’)[col(‘.’) – 1] == ‘}’
  39.             normal j
  40.             let nxtline = nxtline + 1
  41.             let curline = line(‘.’)
  42.             continue
  43.          else
  44.             return "\<ESC>i"
  45.          endif
  46.          
  47.       endwhile
  48.       return "\<ESC>o"
  49.    endif
  50. endf
  51. function ClsoeBrace()
  52.    if getline(‘.’)[col(‘.’) – 2] == ‘=’
  53.       return "{}\<ESC>i"
  54.    elseif getline(‘.’)[col(‘.’) – 3] == ‘=’
  55.       return "{}\<ESC>i"
  56.    elseif getline(‘.’)[col(‘.’) – 1] == ‘{‘
  57.       return "{}\<ESC>i"
  58.    elseif getline(‘.’)[col(‘.’) – 2] == ‘{‘
  59.       return "{}\<ESC>i"
  60.    elseif getline(‘.’)[col(‘.’) – 2] == ‘,’
  61.       return "{}\<ESC>i"
  62.    elseif getline(‘.’)[col(‘.’) – 3] == ‘,’
  63.       return "{}\<ESC>i"
  64.    else
  65.       return "{\<ENTER>}\<ESC>O"
  66.    endif
  67. endf
 Posted by at 上午 10:45
7月 252011
 

根据帮助文档,gvim在windows下的最大化是通过模拟打开窗口菜单并点击最大化菜单项实现的,而在Linux下的方法较为灵活。

下面的方法是在vim中通过调用wmctrl实现最大化的方法:

 Posted by at 上午 8:59
7月 092011
 

vim中的变量类型和大多数高级语言的基本变量类似,大概可以分为:
1. 数值
2. 浮点数
3. 字符串
4. 函数引用变量
5. 列表
6. 字典
简单说一下函数引用变量、列表变量、字典变量。
一. 函数引用变量
函数引用变量通过function()函数得到,用在表达式里来代替函数名。例如:
:let Fn = function("MyFunc")
:echo Fn()
函数引用变量必须以大写字母、"s:"、"w:"、"t:"、或"b:"开始,引用变量不能和其他任何函数重名。这些前缀的意思和申请变量时前缀一样,分别表明其作用域(:help internal-variables):
b:   局部于当前缓冲区。  :help buffer-variable
w:   局部于当前窗口。  :help window-variable
t:   局部于当前标签页。  :help tabpage-variable
g:   全局。      :help global-variable
l:   局部于函数。    :help local-variable
s:   局部于 |:source| 的 Vim 脚本。  :help script-variable
a:   函数参数 (只限于函数内使用)。  :help function-argument
v:   Vim 预定义的全局变量。    :help vim-variable

二. 列表变量
列表变量和perl的变量很类似,比如:
:let mylist = [1, two, 3, "four"]
:let nestlist = [[11, 12], [21, 22], [31, 32]]
1. 访问列表项目时同样用索引的办法:
:let item = mylist[0];    " 得到第一个项目: 1
:let item = nestlist[0][1]  " 得到第三个项目: 3
也可以试用负数索引,它的意思就是列表倒数,比如:
:let last = mylist[-1]          " 得到最后一个项目: "four"
要避免非法索引值产生的错误,用 |get()| 函数。如果项目不存在,它返回零或者你指定的缺省值:
:echo get(mylist, idx)
:echo get(mylist, idx, "NONE")

2. 列表连接  两个列表可以用 "+" 操作符连接,比如 :let longlist = mylist + [5, 6]
3. 子列表 列表的一部分可以通过指定首末两个索引获得,方括号内以冒号分隔两者:
:let shortlist = mylist[2:-1]   " 得到列表 [3, "four"]
:let endlist = mylist[2:]       " 从项目 2 到结束: [3, "four"]
4. 列表同一 如果变量 "aa" 是列表,把它赋给另一个变量 "bb" 后,两个变量指向同一列表。因此,对列表 "aa" 的修改也同时修改了 "bb":
:let aa = [1, 2, 3]
:let bb = aa
:call add(aa, 4)
:echo bb
[1, 2, 3, 4]

|copy()| 函数可以复制列表。如上所述,用 [:] 也可。这种方式建立列表的浅备份: 改变列表中的列表项目仍然会修改复制列表的相应项目:
:let aa = [[1, ‘a’], 2, 3]
:let bb = copy(aa)
:call add(aa, 4)
:let aa[0][1] = ‘aaa’
:echo aa
[[1, aaa], 2, 3, 4]  
:echo bb
[[1, aaa], 2, 3]

可用操作符 "is" 检查两个变量是否指向同一个列表。"isnot" 刚好相反。与此对照,"==" 比较两个列表的值是否相同。
:let alist = [1, 2, 3]
:let blist = [1, 2, 3]
:echo alist is blist
0
:echo alist == blist
1
比较列表时 注意: 如果长度相同,所有项目用 "==" 的比较的结果也相同,两个列表就认为相同。有一个例外: 数值和字符串总被认为不相同。这里不进行自动类型转换,而在变量间直接用 "==" 却不是如此。例如:
echo 4 == "4"
1
echo [4] == ["4"]
0

5. 列表解包 要给列表项目解包,即把它们分别存入单独的变量,用方括号把变量括起来,如同把它们当作列表项目:
:let [var1, var2] = mylist
6. 列表修改 要修改列表的指定项目,用:let命令:
:let list[4] = "four"
:let listlist[0][3] = item
VIM内建了大量操作列表的函数,可以查阅:help function-list,找到针对列表操作的函数群,查看其用途。利用这些函数就可以修改列表。

7. For 循环 就跟perl的for循环遍历列表数据类似:
:for item in mylist
:   call Doit(item)
:endfor
就像 |:let| 命令,|:for| 也可以接受变量的列表。这需要参数是列表的列表。
:for [lnum, col] in [[1, 3], [2, 8], [3, 0]]
:   call Doit(lnum, col)
:endfor
三. 字典变量
字典是关联数组: 每个项目有一个键和一个值。这和perl的关联数组(%)类似,用键可以定位项目,而项目的存储不能确定任何特定顺序。
1. 字典建立
字典通过花括号里逗号分隔的项目列表建立。每个项目包含以冒号分隔的键和值(perl中用"=>"分隔)。一个键只能出现一次。例如:
:let mydict = {1: ‘one’, 2: ‘two’, 3: ‘three’}
键必须是字符串。用数值也可以,但它总被自动转换为字符串。所以字符串 ‘4’ 和数值4 总会找到相同的项目。注意 字符串 ’04’ 和数值 04 是不一样的,因为后者被转换成字符串 ‘4’。
2. 访问项目
常见的访问项目的方式是把键放入方括号:
:let val = mydict["one"]
:let mydict["four"] = 4
用这种方式可以给已存在的字典增加新项目,这和列表不同。

如果键只包含字母、数字和下划线,可以使用如下形式 |expr-entry|:  
:let val = mydict.one
:let mydict.four = 4

因为项目可以是包括列表和字典的任何类型,你可以反复使用索引和键进行访问:
:echo dict.key[idx].key
3. 字典到列表的转换
你可以循环遍历字典的所有项目。为此,你需要把字典转为列表,然后把它传递给:for
通常,你期望遍历所有的键,用 |keys()| 函数就可以了:
:for key in keys(mydict)
:   echo key . ‘: ‘ . mydict[key]
:endfor
要遍历所有的值,用 |values()| 函数:  >
:for v in values(mydict)
:   echo "value: " . v
:endfor

如果你想同时得到键和值,用 |items()| 函数。它返回一个列表,其中每个项目是两个项目的列表: 键和值:  
:for [key, value] in items(mydict)
:   echo key . ‘: ‘ . value
:endfor
4. 字典同一
就像列表那样,你需要用 |copy()| 和 |deepcopy()| 来构造字典的备份。否则,赋值产生的结果会引用同一个字典:  
:let onedict = {‘a’: 1, ‘b’: 2}
:let adict = onedict
:let adict[‘a’] = 11
:echo onedict[‘a’]
11
5. 字典修改
要修改字典已经存在的项目或者增加新的项目,用:let:  
:let dict[4] = "four"
:let dict[‘one’] = item
从字典里删除项目可以通过 |remove()| 或 |:unlet| 完成。从 dict 里删除键 "aaa" 的项目有三种方法:
:let i = remove(dict, ‘aaa’)
:unlet dict.aaa
:unlet dict[‘aaa’]
6. 字典函数

 Posted by at 上午 11:15
4月 112011
 

VIM和BOM

最近发现个怪现象, 从Vim中复制的文本(xsel的方式)和实际文本有点点区别, 会在头部加几个不可见的字节(0xEF 0xBB 0xBF), 粘贴到别的程序里有时会引发错误.

查了下, 原来这几个字节是Unicode的BOM(Byte order mark),  用来标记UTF-16和UTF-32编码文件的字节序, UTF-8并不需要. 但因为这个文件我曾经用Windows的记事本保存过,  它自作聪明地加了个BOM,  而Vim识别到文件有BOM就会自动打开bomb这个选项(具体解释请看Vim中bomb和fileencodings的帮助), so…

于是, 这样, 然后保存就好了:

小提示, 查看当前bomb是否打开可以这样:

——————————–

创建一个文件,输入一行中文,执行
:set fileencoding=utf-8
设置文件编码,并执行
:w
保存,然后执行
:e
重新加载,接着插入BOM头
:1s/^/\="\xef\xbb\xbf"
最后保存并退出:
😡
成功了!
xialulee@xialulee-pc3 ~/lab
$ xxd bom1.txt
0000000: efbb bfe6 b58b e8af 95e4 b880 e4b8 8b42

……………B
0000010: 4f4d 0d0a OM..
前三个字节正是ef bb bf。
他:现在好了,可以用你以前交给我的方法将大量的cue文件批量转换了。
我:什么方法?
他:就是那个-c参数啊!以非交互的方式运行Vim,如:
xialulee@xialulee-pc3 ~/lab
$ vim -c ‘set encoding=shift_jis | set fileencoding=utf-8 | w | e | 1s/^/\="\xef\xbb\xbf"/ | x’ CDImage.ape.cue
可以以非交互的方式使用,配合bash或者cmd的for循环,就可以搞定一堆cue文件了。
我:那是。要说现在cmd的for循环也蛮强大的。而且还有PowerShell可以用。在没有msys或者GnuWin32的情况下,将cmd或PowerShell与非交互的Vim结合起来进行批量处理,应该可行的。
 Posted by at 下午 8:10