有没有办法在vim中使用忽略特殊字符的缩写?

时间:2017-12-16 11:38:58

标签: vim vi abbreviation

我正在撰写SQL数据库脚本,并使用iab来处理大写特殊字词,例如DATABASETABLE。我有三个问题:

  1. 有更好的工具可供使用吗?我宁愿避免使用插件,因为它们通常带有困扰我的功能。
  2. 有没有办法让iab不区分大小写?我的意思是它会将setSet更正为SET
  3. 当单词后面/前面有特殊字符或特定字符时,有没有办法使iab有效?例如,我希望execexec(分别更改为EXECEXEC(。我可以创建两个条目,但问题是我是否可以在一行中完成此任务。

2 个答案:

答案 0 :(得分:0)

更好的方式:不,缺少一个插件我看不出还有什么比这个上下文中的缩写更有用。我注意到sql_iabbr.vim至少容易阅读,并且似乎没有隐藏陷阱的方式。它本质上是一大堆:

inoreabbr <silent> <buffer> select <C-R>=SqlIab_ReplaceConditionally('select', 'SELECT')<CR>

具有以下功能:

function! SqlIab_ReplaceConditionally(original, replacement)
  " only replace outside of comments or strings (which map to constant)
  let elesyn = synIDtrans(synID(line("."), col(".") - 1, 0))
  if elesyn != hlID('Comment') && elesyn != hlID('Constant')
    let word = a:replacement
  else
    let word = a:original
  endif

  let g:UndoBuffer = a:original
  return word
endfunction

我认为值得指出Abolish更强大的缩写。

不区分大小写:我认为答案是'否'(基于the help的合理彻底检查。

特殊/某些字符:抱歉,如果您需要在一个缩写中完成,我认为您再次失去运气!

答案 1 :(得分:0)

这么多问题:

  

有更好的工具可供使用吗?我更喜欢避免使用插件,因为它们通常具有困扰我的功能。

蒂姆·波普的Abolish.vim是最接近你的需求的插件。然而,随着更先进的扩展,我觉得它也将无法实现。我不确定你过去的插件体验,但Tim的插件通常表现良好而且关注度很低。

  

有没有办法让iab不区分大小写?我的意思是它会纠正set和Set到SET?

不,没有我所知道的原生方式。如果你经常这样做并且扩展更简单,我会建议使用Abolish。或者一直使用片段插件。

  

当单词后面/前面有特殊字符或特定字符时,有没有办法使iab有效?例如,我想要exec和exec(分别更改为EXECEXEC(。我可以创建两个条目,但问题是我是否可以在一行中完成此操作。

这可以通过更高级的扩展来完成。事实上它与Rails.vim的缩写非常相似。

将以下内容添加到~/.vim/after/ftplugin/sql.vim

function! s:selective_expand(root, good, ...)
    let [pat, extra; _] = a:0 ? a:000 : ['', '']
    let c = nr2char(getchar(0))
  if c == "" || c == "\t"
        return a:good
    elseif c =~ '\s'
        return a:good . c
    elseif pat != '' && c =~# pat
        return a:good . extra
  else
    return a:root . c
    endif
endfunction

function! s:paren_expand(root, good)
  return s:selective_expand(a:root, a:good, '[(]', "()\<left>")
endfunction

function! s:sql_expand(root, ...)
    let good = a:0 ? a:1 : toupper(a:root)
  let good = substitute(good, '[\"|]', '\\&', "g")
  let good = substitute(good, '<', '\\<lt>', "g")

    let f = 'selective_expand'
    let root = a:root
    if root =~ '($' && (!a:0 || good !~ '($')
        let root = substitute(root, '($', '', '')
        let good = substitute(good, '($', '', '')
        let f = 'paren_expand'
    endif
  let root = substitute(root, '[\"|]', '\\&', "g")
  let root = substitute(root, '<', '\\<lt>', "g")

    let roots = [root]
    if root !~# '\u' && root =~# '^\l'
        call add(roots, substitute(root, '^\l', '\u&', ''))
    endif

    for r in roots
        execute "iabbr <buffer> " . r . " <c-r>=<SID>" . f . "(\"" . r . "\", \"" . good . "\")<cr>"
    endfor

endfunction
command! -nargs=* Sqlabbrev call <SID>sql_expand(<f-args>)

现在您可以在~/.vim/after/sql.vim文件中创建缩写,如下所示:

Sqlabbrev select
Sqlabbrev join INNER\ JOIN
Sqlabbrev exec(

Sqlabbrev使用与iabbrev类似的2个参数。但行为略有不同:

  • 缩写将始终是缓冲区的本地
  • 如果只有1个参数,那么扩展将与第一个参数相同但是大写
  • 使用<tab> / <c-]>将进行扩展而不留下任何空格
  • 使用缩写后跟空格将展开并添加空格
  • 如果缩写以(结尾,则以()的结尾展开,并将光标放在parens
  • 您必须通过\<space>转义空格。可以使用密钥代码
  • 如果在缩写中找不到大写字母,则会创建一些案例扩展。例如Sqlabbrev select将展开selectSelect
相关问题