牢獄機械文書群 目次 » 計算機 » 現在地

字上符(ĉapelo)をカーソル下の文字に付ける/外す

2014-09-08

字上符 supersigno / ĉapelo とは、エスペラントの文字に付いている山形 ^ のことです。

カーソル下の文字を対象に、ユニコード(UTF-8)で出力できる ĉ, ĝ, ĥ, ĵ, ŝ, ŭ と、c, g, h, j, s, u とを、トグルで変換することが目的です(大文字含む)。

エンコードが UTF-8 のときにだけ使えます。

目的:カーソル下の文字の字上符(ĉapelo)を付ける/付いていたら外す。

動機:字上符ありとなしを間違えて文字を打ったあと、打ち直すのが面倒。

コードは下のものですが、文中コメントではなく、文章で簡潔に説明します。


1.) col(".") で現在のカーソルの column の位置を取得(戻り値から1を引く。文字列の参照は0から始まるため)。

2.) 現在行のテキストを、column 位置(から1を引いた数)で参照して、カーソル下の文字を抽出。

3-a-1.) それが対象の字上符なしアルファベットである場合、リストとindex 関数を使って、アルファベットと UTF-8 のエンコードを対照させる。

3-a-2.) normal コマンドを使って、カーソル下の文字を ^Vu +エンコードで置換する。字上符の付いたユニコード文字に置き換わる。(^V は "Ctrl-v v" で出力される文字を意味する。)

3-b-1.) 英語文字や数字(正規表現 \W)でない場合。マルチバイト文字であれば2文字分の場所を使うので、カーソルの次の1文字と合わせて、対象の字上符ありアルファベットになるか条件分岐。

3-b-2.) 対象のものなら、リストと index 関数を使ってアルファベットとユニコード文字を対照させる。

3-b-3.) normal コマンドで対象の字上符なしアルファベットに置換する。

function! Konverti()
let l:pos = col(".") - 1
let l:teksto = getline(".")
let l:signo = ""
let l:rezulto = ""

if l:teksto[l:pos] =~ '["c","g","h","j","s","u"]'
let l:signo = l:teksto[l:pos]
if l:signo =~ '\l'
let l:rezulto = ["0109","011d","0125","0135","015d","016d"][index(["c","g","h","j","s","u"], l:signo)]
else
let l:rezulto = ["0108","011c","0124","0134","015c","016c"][index(["C","G","H","J","S","U"], l:signo)]
endif
exec 'normal! r^Vu' .l:rezulto
return l:rezulto
elseif l:teksto[l:pos] =~ '\W'
if l:teksto[l:pos : l:pos + 1] !~ '["ĉ","ĝ","ĥ","ĵ","ŝ","ŭ"]'
return -1
endif
let l:signo = l:teksto[l:pos : l:pos + 1]
if match(["ĉ","ĝ","ĥ","ĵ","ŝ","ŭ"], '\C' .l:signo) != -1
let l:rezulto = ["c","g","h","j","s","u"][index(["ĉ","ĝ","ĥ","ĵ","ŝ","ŭ"], l:signo)]
else
let l:rezulto = ["C","G","H","J","S","U"][index(["Ĉ","Ĝ","Ĥ","Ĵ","Ŝ","Ŭ"], l:signo)]
endif
exec 'normal! r' .l:rezulto
return l:rezulto
endif

return 0
endfunction

この関数呼び出しをキーマッピングします。下記の例は , (コンマ)にマッピングしたもの。カーソルの下の文字の字上符あるなしがトグルします。

nnoremap <silent> , :call Konverti()<CR>
← もどる
inserted by FC2 system