字上符 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 コマンドで対象の字上符なしアルファベットに置換する。
この関数呼び出しをキーマッピングします。下記の例は , (コンマ)にマッピングしたもの。カーソルの下の文字の字上符あるなしがトグルします。
nnoremap <silent> , :call Konverti()<CR>