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

问题描述 投票:1回答:2

我正在写一个SQL数据库脚本,我使用iab来大写特殊单词,如DATABASETABLE。我有三个问题:

  1. 有更好的工具可供使用吗?我宁愿避免使用插件,因为它们通常带有困扰我的功能。
  2. 有没有办法让iab不区分大小写?我的意思是它会纠正setSetSET
  3. 有没有办法让iab在单词后面/前面有特殊或某些字符时工作?例如,我希望execexec(分别变成EXECEXEC(。我可以创建两个条目,但问题是我是否可以在一行中完成此操作。
vim vi abbreviation
2个回答
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的合理彻底检查。

特殊/特定角色:对不起,如果你需要用一个缩写完成,我觉得你再次失去了运气!


0
投票

这么多的问题:

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

Tim Pope的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
© www.soinside.com 2019 - 2024. All rights reserved.