2017-12-16 3 views
1

私はSQLデータベーススクリプトを作成しており、やTABLEなどの大文字の特殊語にはiabを使用しています。私には3つの質問があります:vimで特殊文字を無視する省略形を使用する方法はありますか?

  1. 良いツールがありますか?私はプラグインを使用しないことを好みます。通常、プラグインは機能するので、気になるものです。
  2. iabに大文字小文字を区別させる方法はありますか?つまり、setSetの両方をSETに修正するということですか?
  3. iabは、その前後に特殊文字または特定の文字がある場合に機能する方法はありますか?たとえば、execexec(をそれぞれEXECEXEC(に変更したいとします。私は2つのエントリを作成することができますが、私はこれを1行で行うことができるかどうかです。
+1

これは役立つかもしれません:https://vi.stackexchange.com/questions/12244/case-insensitive-abbreviations – Sundeep

答えて

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

だから、多くの質問:!

使用するより良いツールがあり、私は通常、彼らのようにプラグインの使用を避けることを好みます?私を悩ます機能が付いてくる。

Tim PopeのAbolish.vimは、あなたのニーズに最も近いプラグインです。しかし、より高度な展開で私はあまりにも不足するように感じる。私はあなたの過去のプラグインの経験についてはわかっていませんが、Timのプラグインは通常、うまく動作し、狭く集中しています。

iabに大文字小文字を区別させる方法はありますか?私はセットとセットにSETの両方を修正するという意味ですか?

いいえ、私が認識しているネイティブな方法はありません。これを定期的に行い、より簡単な拡張ができれば、Abolishの使用をお勧めします。またはすべての方法を行って、スニペットプラグインを使用します。

iabは、その前後に特殊文字または特定の文字がある場合に機能しますか?たとえば、私は2つのエントリを作成することができます。(幹部やexecがEXECそれぞれEXEC(に変更したいが、私は1行でこれを行うことができるかどうかの質問です。

この

はで行うことができます手の込んだ拡張これは、実際には略語だと 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>) 

今、あなたはあなたのに略語を作成することができますそのようなファイル:

Sqlabbrev select 
Sqlabbrev join INNER\ JOIN 
Sqlabbrev exec(

Sqlabbreviabbrevに似た2つの引数を取ります。しかし、わずかに異なる動作をします:

  • 略語は常にバッファにローカルになります
  • のみ1引数が、その後の拡張は、最初の引数と同じになりますが<tab>/<c-]>を行います使用して、大文字
  • 行われます続くスペースなしの拡張
  • スペースの後ろのスペースを使用してスペースを拡張してスペースを追加します。
  • 末尾が(の場合は、末尾がカーソルを括弧の中に置く
  • スペースをエスケープするには、\または<space>を使用する必要があります。
  • 大文字が省略されていない場合、大文字の拡張が作成されます。例えばSqlabbrev selectは、selectSelectを展開します。
関連する問題