`
wodamazi
  • 浏览: 1418025 次
文章分类
社区版块
存档分类
最新评论

vim括号自动补全

 
阅读更多

Vim脚本括号自动完成的实现与加强

括号是编程中最常接触的特殊符,因其往往成对出现,成对删除的特性,加上Vim强大的自定义功能,实现括号的自动完成,成对删除等各种功能,大大减少了编程手指负担。本文介绍如何对小括号进行设计达到上述功能,加深对Vim脚本的理解。

一、括号自动完成与加强

1. 括号自动完成

功能描述:当输入(时自动生成(),并使光标指向),系统保持在insert mode
分析:当键入(时,只需模拟输入()并使光标回退一个字符即可
代码1:
inoremap ( ()<LEFT>

2. 重复键入括号自动换行

功能描述:在目标一的基础上实现若光标前一字符为(,则自动换行并缩进,而非插入括号
分析:要达到该效果,必需通过命令实现,调用命令有<C-O>,<ESC>, <C-R>三种途径
<C-O>对于eol与普通字符的处理方式不一样,所以这里采取ESC进入normal模式,<ESC>离开Insert模式恒回退一个字符
代码2:功能一的命令版
function! ParenOpen()
  normal! a()
  startinsert
endfunction
inoremap ( <ESC>:call ParenOpen()<CR>
分析 2:要获得当前光标下的字符,vim似乎没有直接提供命令。但可以通过yl,或者getline('.')[col('.')-1]取得
代码 3:实现功能2
function! ParenOpen()
  let line = getline('.')
  let prev_char = line[col('.')-1]

  if prev_char == '('
    " 添加额外的字符;,以避免vim自动删除空白行
    execute "normal! a\<CR>\<ESC>==O;"
    return
  end

  " 同样需要添加;
  execute "normal! a(;)\<ESC>i"

  "当缩进被删除时,重新缩进当前行
  if line == ''
    normal! ==$h
  end
endfunction

inoremap ( <ESC>:call ParenOpen()<CR>"_cl

3. 忽略重复键入的右括号

功能描术:若当前字符为),则忽略输入的),光标指向下一字符
代码4
function! ParenClose()
  let line = getline('.')
  let char = line[col('.')]

  if char == ')'
    execute "normal! l"
  else
    normal! a)
  end
endfunction
inoremap ) <ESC>:call ParenClose()<CR>a

4. 配对删除括号

功能描述:当删除(时,若()之间为空时,则连)一起删除
分析:目前只能想到map <BS> 一条途径,通过正则判断括号间是否为空
代码5
function! ParenDelete()
  let line = getline('.')
  let prev_char = line[col('.')-1]

  if prev_char == '(' && match(line,'^\s*)',col('.')) != -1
    " 使用 cf) 代替df)使光标离开normal时左移一格用以a
    normal! cf)
  else
    execute "normal! a\<BS>"
  end
endfunction

inoremap <BS> <ESC>:call ParenDelete()<CR>a

二、代码总览:

function! ParenOpen()
  let line = getline('.')
  let prev_char = line[col('.')-1]

  if prev_char == '('
    " 添加额外的字符;,以避免vim自动删除空白行
    execute "normal! a\<CR>\<ESC>==O;"
    return
  end

  " 同样需要添加;
  execute "normal! a(;)\<ESC>i"

  "当缩进被删除时,重新缩进当前行
  if line == ''
    normal! ==$h
  end
endfunction

function! ParenClose()
  let line = getline('.')
  let current_char = line[col('.')]

  if current_char == ')'
    execute "normal! l"
  else
    normal! a)
  end
endfunction

function! ParenDelete()
  let line = getline('.')
  let prev_char = line[col('.')-1]

  if prev_char == '(' && match(line,'^\s*)',col('.')) != -1
    " 使用 cf) 代替df)使光标离开normal时左移一格用以a
    normal! cf)
  else
    execute "normal! a\<BS>"
  end
endfunction

" 函数ParenOpen执行后光标指向;,使用"_cl清除并进入insert模式
inoremap ( <ESC>:call ParenOpen()<CR>"_cl
inoremap ) <ESC>:call ParenClose()<CR>a
inoremap <BS> <ESC>:call ParenDelete()<CR>a

三、使用<C-R>代替<ESC>

<ESC>调用时会导致状态栏,-- 插入 -- 闪烁,修正代码为使用<C-R>代替<ESC>
通过与=表达式寄存器实现括号的自动完成功能{/text}
脚本正好可以不进入Normal模式,如果函数中有normal xxx,那么不得不使用<ESC>作为入口了
function! ParenOpen()
  let line = getline('.')
  let prev_char = line[col('.')-2]

  if prev_char == '('
    return "\<CR>\<ESC>==O"
  end

  return "()\<Left>"
endfunction

function! ParenClose()
  let line = getline('.')
  let current_char = line[col('.')-1]

  if current_char == ')'
    return "\<Right>"
  end
  return ')'
endfunction

function! ParenDelete()
  let line = getline('.')
  let prev_char = line[col('.')-2]

  if prev_char == '(' && match(line,'^\s*)',col('.')-1) != -1
    return "\<Left>\<C-O>cf)"
  end

  return "\<BS>"
endfunction

inoremap <silent> ( <C-R>=ParenOpen()<CR>
inoremap <silent> ) <C-R>=ParenClose()<CR>
inoremap <silent> <BS> <C-R>=ParenDelete()<CR>

四、Vim插件Auto Pairs

Auto Pairs是根据此文进一步完善的插件。支持[]{}() ' "的括号自动完成与删除。
详见:https://github.com/jiangmiao/auto-pairs


2011-06-11更新
-------------------
inoremap X <C-R>=foo()<CR> 可以用inoremap <expr> X<CR>代替
即上文可以改进为
inoremap <silent> <expr> ( ParenOpen()
inoremap <silent> <expr> ) ParenClose()
inoremap <silent> <expr> <BS> ParenDelete()

分享到:
评论

相关推荐

    Python 自动补全(vim)

    一、vim python自动补全插件:pydiction 可以实现下面python代码的自动补全: 1.简单python关键词补全 2.python 函数补全带括号 3.python 模块补全 4.python 模块内函数,变量补全 5.from module import sub-...

    SourceInsight与vim代码补全配置

    SourceInsight与vim代码补全配置

    vim完全配置

    集中了VIM大中小括号自动补全,代码自动补全,窗口列表等功能

    一个很好的vim配置(可鼠标操作,有目录,自动补全)

    插入按自动补全,检索方便,鼠标可操作,括号自动配对添加,代码折叠..更多惊喜要体验后才知道哦 要括号自动配对添加,.vimrc中需加这几句 (注意,从window贴过去可能会在每行后有^M就是\r ,需要去掉才行) set ...

    强大的vim配置文件(最新整理)

    可以括号自动补全,自动缩进,语法高亮,允许鼠标定位代码,显示信息可以实现中文显示,F7可以实现编译运行,F8可以实现c,c++的代码调试。

    vim配置文件【完美版】

    【使用说明】在主目录直接解包就行 【功能详情】--------快捷键 ...3.双引号、单引号、大括号自动补全,小括号不能自动补全【如果有人发现是什么原因,可以留言哈】 【注】祝大家更高效的玩转vim

    Vim-IDE.zip

    "Plugin 'jiangmiao/auto-pairs' "自动成对操作括号 Plugin 'mbbill/undotree' "撤销修改 "Plugin 'gdbmgr' "调试器插件 Plugin 'scrooloose/nerdcommenter' "快速注释/反注释插件 "Plugin 'Yggdroot/indentLine' ...

    vim编辑器配置文件vimrc

    使用了该vimrc配置文件, vim编辑器将有以下优点 快捷键优点 : F5 自动编译C/C++文件 F8 自动调试C/C++文件 F2 清除空行 F3 列出当前文件目录 Ctrl + P 自动补全 Ctrl + A 全选复制 ...括号 单双引号自动补全

    Vim/Gvim配置文件+配色方案_By Marslo

    自动匹配括号,自动补全一些代码(\fn: 当前文件名; \fe:当前文件名+后缀;tt当前时间) 自动载入保存fold(折叠)信息 --------------------------------------------------------------- tl: 显示taglist wm:...

    vim user manual ---vim用户手册

    j24.3j 自动补全 j24.4j 重复录入 j24.5j 从其它行复制 j24.6j 插入一个寄存器的内容 j24.7j 缩写 j24.8j 键入特殊字符 j24.9j 键入连字符 j24.10j Normal模式命令 jusr 25.txtj 编辑格式化文本 j25.1j 段行 j25.2j ...

    Sublime_Text3

    Sublime Text3 是一个轻量、简洁、高效、跨平台的编辑器,方便的配色以及兼容vim快捷键等各种优点,它可跨平台支持Windows/Mac/Linux;支持32与64位操作系统,...自动补全已经出现的单词;自动补全函数名),非常智能;

    Hacking Vim

    Ctrl+n 自动补全单词(向前查找)两者一般感觉不到区别 Ctrl+x Ctrl+k 通过字典补全单词 Ctrl+x Ctrl+t 从同义词典(thesaurus)补全 Ctrl+x Ctrl+f 文件名自动完成(很有用) Ctrl+x Ctrl+l 自动完成整行 Ctrl+x Ctrl+i ...

    sublime text 3

    自动补全已经出现的单词;自动补全函数名),非常智能; 相比于难于上手的Vim,浮肿沉重的Eclipse,VS,即便体积轻巧迅速启动的Editplus、Notepad++,在SublimeText 3面前大略显失色,无疑这款性感无比的编辑器是...

    vim编码:vim编码

    文件 编码程序猿的专属vimrc配置! 该vim配置拥有各种大气的被动和主动技能!! 一分钟极速安装(如果是windows,强烈推荐安装 ) ...各种自动补全(php,html,括号) 编辑多个文件时显示标签 保存时自动检查php文

    Sublime Text 3 优化版.7z

    Sublime Text 是一个轻量、简洁、高效、跨平台的编辑器,方便的配色以及兼容vim快捷键等各种优点博得了很多前端开发人员的喜爱!Sublime Text 这款程序员必备...自动补全已经出现的单词;自动补全函数名),非常智能。

    SublimeText 3中文版

    Sublime Text 是一个轻量、简洁、高效、跨平台的编辑器,方便的配色以及兼容vim快捷键等各种优点博得了很多前端开发人员的喜爱!Sublime Text 这款程序员必备...自动补全已经出现的单词;自动补全函数名),非常智能;

    Sublime Text编辑器

    Sublime Text 是一个轻量、简洁、高效、跨平台的编辑器,方便的配色以及兼容vim快捷键等各种优点博得了很多前端开发人员的喜爱!Sublime Text 2这款程序员必备...自动补全已经出现的单词;自动补全函数名),非常智能;

    Sublime Text 2.rar

    Sublime Text 是一个轻量、简洁、高效、跨平台的编辑器,方便的配色以及兼容vim快捷键等各种优点博得了很多前端开发人员的喜爱!Sublime Text 2这款程序员必备...自动补全已经出现的单词;自动补全函数名),非常智能;

    CodeMirror-5.60.0在线代码编辑器

    能够做到代码高亮、自动补全,语法检测,代码折叠,可配置键盘事件,vim, emacs, sublime text 风格、能完成查找替换,括号匹配,分栏显示,显示行号,自行配置字体大小和风格 最基本功能,需引入codemirror.js和...

    Vim用户手册中文版72.pdf

    24.3 自动补全 24.4 重复录入 24.5 从其它行复制 24.6 插入一个寄存器的内容 24.7 缩写 24.8 键入特殊字符 24.9 连体字 24.10 Normal模式命令 第25章 编辑格式化的文本 25.1 断行 25.2 对齐文本 25.3 缩进和制表符 ...

Global site tag (gtag.js) - Google Analytics