SciTEで括弧とかの入力補完をする云々の話
プログラム用のテキストエディタSciTEには、括弧の入力補完とか「"」の入力補完機能はついていない。つけたきゃ勝手にLuaでつけてね、ってスタンスなのか良くわからないけど、無いと無いでさびしい。でも、つい「""」って連続で打ってそれぞれに補完がされて「""""」みたいになると、こんな機能付いてない方がまだマシと思うぐらい苛立つものである。この対処は「"」が打たれた次の文字が「"」だったら入力補完しないで、いったん入力をキャンセルした上で、入力カーソルを次へ進める、ってのが一番簡単な方法かと。
で、問題はじゃあ「"'([{<」とかペアのあるすべての文字について同じような処理書くのか、面倒くせえってところで、いつも5分ぐらい考えた後、「よし、考えるほうが面倒だな」となって同じような処理をコピーして書いてたんです。まあ実際、後から直すような類の処理じゃあないですから、それでもいいんですけど。でも、まあ、何か気持ち悪い、ってので、一応重複したコード書かないですむ方法を見つけたので記録もかねて以下に記してみよう。
function OnChar(c) pairdef = {} pairdef[0] = {} pairdef[1] = {} pairdef[2] = {} pairdef[3] = {} pairdef[4] = {} pairdef[0][0] = "(" pairdef[0][1] = ")" pairdef[1][0] = "{" pairdef[1][1] = "}" pairdef[2][0] = "[" pairdef[2][1] = "]" pairdef[3][0] = "'" pairdef[3][1] = "'" pairdef[4][0] = '"' pairdef[4][1] = '"' for k, v in pairs(pairdef) do if c==v[1] then -- avoid duplicated completion if v[1]:byte(1)==editor.CharAt[editor.CurrentPos] then --cancel the input editor:Undo() editor:GotoPos(editor.CurrentPos+1) return true end end -- complete pairs if c==v[0] then editor:InsertText(editor.CurrentPos, v[1]) end end return false end
本当だと
v[1]:byte(1)
の箇所でbyte(1)とせず、文字列すべてのバイト列と後続の文字列とを比較するようにしたほうがいいんでしょうが、まあ、いいや、それは…。