Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69213
  • 博文数量: 24
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-03 10:47
文章分类
文章存档

2011年(1)

2010年(1)

2009年(22)

我的朋友

分类: LINUX

2009-09-16 22:03:25

因为原作者写了一个函数,我发现要看懂这个函数,就需要接触一下vim script。
以下是我对vim script基本语法的总结,

1.
简单的一个vim计算脚本
let i = 1
while i < 5
    echo "count is" i
    let i = i + 1
endwhile

注:这里的代码是放在脚本里面,若直接在vim中输入
加上:就可以了。

2.
关于变量的作用域:

在变量使用的时候加上变量类型的参数,参数有:
b: 局限于缓冲区,缓冲区被删时作用消失。
w: 局限于当前窗口,窗口关闭时作用消失。
g: 全局。
l: 局限于函数。
s: 局限于 :source 的 vim 脚本
a: 函数参数
v: vim 预定的全局变量

3.
表达式出了数值、字符串、常量之外,还有
$NAME 环境变量
&name 选项
@r    寄存器

环境变量:  比如 echo "home directory is" $HOME
选项:      比如 echo &laststatus (在写vim脚本时可以用它来检查各选项的指)
寄存器:    比如 echo @"

4.算术运算除了 + - * / % 之外,
可以用"."来连接字符串
还可以用 a ? b : c (居然是C中借鉴来的)

5. 各种语句
if {condition}
elseif { condition }
else
endif

while {condition}
endwhile

6.
执行表达式
1>可以用 execute 来执行一个表达式的结果:
:execute "tag " . tag_name (如果tag_name是get_cmd,则执行:tag get_cmd)
2>也可以用 normal 来执行普通模式的命令,比如我想的这个无聊的命令:
:normal 11ggy13ggGp (先到11行,复制到13行,跳到最后一行,粘贴复制内容)

所以这里可以连用execute 和 normal
比如说跑到最后一行写入I love you:
:execute "normal GoI love you \"

7.
函数

1>函数用:call 来调用
2>写自己的函数(下面的例子可以看出语法来):
  function Min(num1, num2)
    if a:num1 < a:num2
      let smaller = a:num1
    else
      let smaller = a:num2
    endif
    return smaller  //如果没有则返回0
  endfunction
调用 :call Min(5, 8)
3> 如果要重定义一个已经存在的函数,用
:function! Min(num1, num2, num3)

8.
函数范围
在函数调用命令:call前加一个表示行范围的参数,如果是像这样调用的,会有两种情况:
1>如果函数定义时有 range 关键字,表示会自动处理。
    如:1, 10call function() 这时,
        a:firstline 会赋值为 1 ,a:lastline会赋值为10。且调用一次。
2>如果没有 range,则光标移动到范围内的每一行,对该行调用此函数。比如上面,则会调用10次。


原文
""""""""""""""""""""""""""""""
" Visual
""""""""""""""""""""""""""""""
" From an idea by Michael Naumann

" @" 是未命名的寄存器
function! VisualSearch(direction) range
  let l:saved_reg = @"
  execute "normal! vgvy"
  let l:pattern = escape(@", '\\/.*$^~[]') " escape函数是系统定义的函数,用于在第一个参数,用转义字符 \ 替换第二个参数中的字符
  let l:pattern = substitute(l:pattern, "\n$", "", "") " substitute函数是系统定义函数,这里把\n都替换成了空。
  if a:direction == 'b'
    " 运行普通模式的向前搜索命令,但这里最后结尾却用^M,作者系统不是linux?
    execute "normal ?" . l:pattern . "^M"        
  else  " 向后搜索
    execute "normal /" . l:pattern . "^M"
  endif
  let @/ = l:pattern " 将pattern存进寄存器/中
  let @" = l:saved_reg
endfunction

"Basically you press * or # to search for the current selection !! Really useful
" 在键盘映射中,所定义的键在命令行上是有回显的 加入之后没有回显。
vnoremap * :call VisualSearch('f')
vnoremap # :call VisualSearch('b')

阅读(1240) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~