今天初步学习了下vim的脚本知识,并尝试写了一个简单的脚本。当然,这个脚本很简单,使用的方法也很笨拙。不过,这仅仅是一个开始,等以后随着对vim语法的深入了解,会不断优化这个脚本的。先记录下来

" annotation.vim
" Version:      1.0
if exists("g:zsl_loaded_annotation") || &cp || v:version < 700
  finish
endif
let g:zsl_loaded_annotation = 1
"更改java默认注释符号
autocmd FileType java set commentstring=/*%s*/ "获取当前文件的注释标签
function! s:surroundings() abort
  return split(substitute(substitute(
        \ get(b:, 'commentary_format', &commentstring)
        \ ,'\S\zs%s',' %s','') ,'%s\ze\S', '%s ', ''), '%s', 1)
endfunction "添加注释行首跟行尾
function! s:AddAnnotion(type, linenum)
  let [l, r] = s:surroundings()
  let time = "2016-01-01"
  let anno = "modify by zhangshui time begin"
  let anno = l.anno.r
  if exists("*strftime")
    let time = strftime("%Y-%m-%d")
  endif
  let anno = substitute(anno, "time", time, '')   if a:type ==0
    call append(a:linenum, anno)
  elseif a:type == 1
    call append(a:linenum, substitute(anno, "begin", "end", ''))
  endif
  "光标会自动跳转到操作行
  execute (a:linenum+1)." normal =="
endfunction "普通模式下基础函数
function AnnotationN()
  call s:AddAnnotion(0, line("."))
  call s:AddAnnotion(1, line("."))
endfunction "可视模式下基础函数
function! s:AnnotationV()
  call s:go(line("'<"), line("'>"))
  call s:AddAnnotion(0, line("'<")-1)
  call s:AddAnnotion(1, line("'>"))
endfunction "注释掉选中文本
function! s:go(type,...) abort
  if a:0
    let [lnum1, lnum2] = [a:type, a:1]
  else
    let [lnum1, lnum2] = [line("'["), line("']")]
  endif   let [l, r] = s:surroundings()
  let uncomment = 2
  for lnum in range(lnum1,lnum2)
    let line = matchstr(getline(lnum),'\S.*\s\@<!')
    if line != '' && (stridx(line,l) || line[strlen(line)-strlen(r) : -1] != r)
      let uncomment = 0
    endif
  endfor   for lnum in range(lnum1,lnum2)
    let line = getline(lnum)
    if strlen(r) > 2 && l.r !~# '\\'
      let line = substitute(line,
            \'\M'.r[0:-2].'\zs\d\*\ze'.r[-1:-1].'\|'.l[0].'\zs\d\*\ze'.l[1:-1],
            \'\=substitute(submatch(0)+1-uncomment,"^0$\\|^-\\d*$","","")','g')
    endif
    if uncomment
      let line = substitute(line,'\S.*\s\@<!','\=submatch(0)[strlen(l):-strlen(r)-1]','')
    else
      let line = substitute(line,'^\%('.matchstr(getline(lnum1),'^\s*').'\|\s*\)\zs.*\S\@<=','\=l.submatch(0).r','')
    endif
    call setline(lnum,line)
  endfor
  silent doautocmd User CommentaryPost
endfunction
xnoremap <silent> <Plug>AnnotationV     :<C-U>call <SID>AnnotationV()<CR>

函数调用的方式,是在.vimrc中配置如下内容

map <silent>fj :call AnnotationN()<cr>
vmap <silent>fj <Plug>AnnotationV

vim 脚本之快捷注释的更多相关文章

  1. vim脚本语言

    转自:http://man.chinaunix.net/newsoft/vi/doc/usr_41.html#usr_41.txt Vim 脚本语言在很多地方用到,包括 vimrc 文件, 语法文件, ...

  2. grep 查找bash脚本中的注释代码

    出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码.也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉.假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释 ...

  3. Vim 自动文件头注释与模板定义

    Vim 自动文件头注释与模板定义 在vim的配置文件.vimrc添加一些配置可以实现创建新文件时自动添加文件头注释,输入特定命令可以生成模板. 使用方法 插入模式输入模式输入seqlogic[Ente ...

  4. Unity脚本自动添加注释脚本及排版格式

    Unity脚本自动添加注释脚本及头部注释排版格式 公司开发项目,需要声明版权所有,,,,标注公司名,作者,时间,项目名称及描述等等. 自己总结实现的现成脚本及头部注释排版文本,添加到模版即可. 文件不 ...

  5. vim删除空行和注释

    vim删除空行和注释 来源:  http://jpuyy.com/2015/06/vim-delete-lines-using-regexp.html 删除空行 :g/^$/d 删除空行以及只有空格的 ...

  6. (转)Vim 脚本语言

    2012 年 10 月 20 日 by name5566 Categories: Computer Science, Tools 参考文献列表: http://vimdoc.sourceforge.n ...

  7. vim 脚本——插件

    :help usr_41.txt 查看vim默认可添加插件的路径 :set runtimepath? 查看vim系统插件与脚本位置 :echo $VIMRUNTIME :echo $VIM 查看所有插 ...

  8. AutoHotkey批量L版代码转H2的vim脚本

    原脚本尽量用表达式的语法写,错误会比较少,比如"If a=", "fun(a=1)"这种语法在V2会出错文件放vim的autoload目录下,可使用以下map使 ...

  9. <实训|第五天>通过搭建NFS,FTP实现共享文件附Vim脚本游戏

    先说个事情:我周末是不更新这个系列教程的,不过其他内容的会更新,我周末就整理这一周的各种内容到我的微信公众号中,提供给大家! 期待已久的linux运维.oracle"培训班"终于开 ...

随机推荐

  1. 模块 –OS & OS.PATH

    模块-Os模块: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 In [25]: os.getcwd() Out[25]: 'C:\\Users\\***' os.c ...

  2. SVN配置以及自己主动部署到apache虚拟文件夹

    SVN配置以及自己主动部署到apache虚拟文件夹 一.VisualSVN server 服务端和TortoiseSVNclient下载 VisualSVN下载:http://subversion.a ...

  3. zoj_3735,dp,长沙站j题

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> us ...

  4. hdoj--5567--sequence1(水题)

    sequence1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  5. 熟悉了下HTTP协议

    HTML是一种用来定义网页的文本,会HTML,就可以编写网页: HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信.200表示一个成功的响应,后面的OK是说明.失败的响应有404 Not ...

  6. [Swift] 随机数 | Random numbers

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. Linux系统下安装redis

    Linux 下安装 下载地址:http://redis.io/download,下载最新文档版本. 本教程使用的最新文档版本为 2.8.17,下载并安装: $ wget http://download ...

  8. 事件处理:pull与push

    push:对应函数调用:属于发起方主动型 pull :对应消息循环:模型为信息池+事件循环+派发:属于接收者主动: 通常这种模式的角色对应于消息中心(事件派发中心). 观察者模式:变化+派发.

  9. Linux Putty 复制粘贴

    从putty复制:    用左键选中文字,再其他地方点中键就可以粘贴了,不需要右键粘贴. 在putty中粘贴:    在其他地方用左键选中文字,不用右键复制,保持选中文字高亮,然后在putty中点中键 ...

  10. iOS开发——设置屏幕亮度

    想在APP里面调节屏幕的亮度,这只是个小众需求.而且,虽然可以直接调节手机的亮度,但是它还是个需求,客户有需求,剩下的就是我们的事了,好了,吐槽到此结束. 刚拿到这个需求的人,或许想的是直接对view ...