我正在写一个SQL
数据库脚本,我使用iab
来大写特殊单词,如DATABASE
或TABLE
。我有三个问题:
set
和Set
到SET
?iab
在单词后面/前面有特殊或某些字符时工作?例如,我希望exec
和exec(
分别变成EXEC
和EXEC(
。我可以创建两个条目,但问题是我是否可以在一行中完成此操作。更好的方法:不,缺少一个插件我看不出还有什么比这个上下文中的缩写更有用。我注意到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的合理彻底检查。
特殊/特定角色:对不起,如果你需要用一个缩写完成,我觉得你再次失去了运气!
这么多的问题:
有更好的工具可供使用吗?我宁愿避免使用插件,因为它们通常带有困扰我的功能。
Tim Pope的Abolish.vim是最接近你的需求的插件。然而,随着更先进的扩展,我觉得它也将无法实现。我不确定你过去的插件体验,但Tim的插件通常表现良好而且重点狭窄。
有没有办法让
iab
不区分大小写?我的意思是它会纠正set和Set到SET?
不,我没有意识到的本土方式。如果你经常这样做并且扩展更简单,我会建议使用Abolish。或者一直使用片段插件。
有没有办法让
iab
在单词后面/前面有特殊或某些字符时工作?例如,我想要exec和exec(分别改为EXEC
和EXEC(
。我可以创建两个条目,但问题是我是否可以在一行中完成此操作。
这可以通过更高级的扩展来完成。事实上它与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个论点。但行为略有不同:
<tab>
/ <c-]>
将使扩展没有任何后续空格(
结尾,则扩展()
的结尾并将光标放在parens中\
或<space>
逃离空间。可以使用密钥代码Sqlabbrev select
将扩大select
和Select
。