我正在撰写SQL
数据库脚本,并使用iab
来处理大写特殊字词,例如DATABASE
或TABLE
。我有三个问题:
set
和Set
更正为SET
?iab
有效?例如,我希望exec
和exec(
分别更改为EXEC
和EXEC(
。我可以创建两个条目,但问题是我是否可以在一行中完成此任务。答案 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(分别更改为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
。