アプリ版:「スタンプのみでお礼する」機能のリリースについて

付録にあるような Vim script を Windows で使っています。Vim7.3 Kaoriya です。IME
を介すことなくギリシャ文字の漢字コードを書くためのスクリプトです。数式を手早く
記述するために使っています。Vim input mode で、ギリシャ文字に対応するアルファ
ベットの直後にカーソルを置いておき ctrl-a ctrl-g 操作をすることで、その英語アル
ファベットをギリシャ文字に変更します。

数式記述のため ∇□∂△ の記号も入力できるようにしています。n`,d`,r`,l` の文字
の直後にカーソルを置いておき、 ctrl-a ctrl-g 操作をすることで、その対応する漢字
記号に変更します。

WindowsXP, Windows7 で、この Vim script を動かしています。

この Vim script を VMware Player(versio 5.01) 上の Ubuntu で動かそうとしていま
す。Ubuntu の Vim もバージョンは 7.3 です。apt-get で取り込みました。

しかし Ubuntu 側で問題が出ました。 ∇□∂△ の記号を入力しようとして
n`,d`,r`,l` の直後で ctrl-a ctrl-g 操作をすると、漢字記号ではなく
n<88>,d<e2>,r<a1>,l<88> になってしまいます。この誤動作の原因が分からなくて困っ
ています。

正しく動いたこともあるので、Vim script の誤りというより OS 側も含めた設定による
ものだと推測しています。.givmrc の漢字フォントとが原因かもと思い、set
guifont=VL\ ゴシック\ 11 を set guifont=Takaoゴシック\ 11 に変更してみましたが
同じ現象でした。

VMware, Linux を使い始めたのは今年の初めからであり、設定でミスをやらかしている
可能性は高いと思います。

このような状況ですが、原因らしいものを指摘願えますでしょうか。よろしくお願いし
ます。

------------ code begin ------------
let s:strAlphLowerStt = "abgdezhqiklmnxoprstufcyw"
let s:strGreekLowerStt = "αβγδεζηθικλμνξοπρστυφχψω"
let s:strAlphUpperStt = "ABGDEZHQIKLMNXOPRSTUFCYW"
let s:strGreekUpperStt = "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"

let s:strSpecialSymbolStt = "ndrl"
let s:strSpecialKanjiStt = "∇□∂△"

function! s:ConvertAlpbt2Greek()
  let l:strAt = getline(".")
  let l:inPosAt = col(".")
  if l:inPosAt > len(l:strAt)
    let l:inPosAt = len(l:strAt)
    let l:chAt = l:strAt[l:inPosAt-1]
  else
    let l:chAt = l:strAt[l:inPosAt-2]
  endif
  
  if l:chAt == "`"
    if inPosAt >= 2
      let l:chAt = l:strAt[l:inPosAt-2]
      "debug
      "echo l:chAt
      if l:chAt == "`"
        let l:chAt = l:strAt[l:inPosAt-3]
      endif
      
      let l:inPosAt = match(s:strSpecialSymbolStt, l:chAt)
      "debug
      "echo l:inPosAt
      if l:inPosAt >= 0
        if l:chAt == s:strSpecialSymbolStt[l:inPosAt]
          let @" = s:strSpecialKanjiStt[(2*l:inPosAt) : (2*l:inPosAt+1)]
          let @* = @"
          return "\<ESC>phhxx`]a"
        endif
      endif
    endif
    return ""
  endif
  
  let l:inPosAt = match(s:strAlphLowerStt, l:chAt)
  " AND (char2nr(l:chAt) >= 97) is a countermeasure
  " for match("abgdezhqiklmnxoprstufcyw", "G") == 2
  if (l:inPosAt >= 0) && (char2nr(l:chAt) >= 97)
    let @" = s:strGreekLowerStt[(2*l:inPosAt) : (2*l:inPosAt+1)]
    let @* = @"
    return "\<ESC>phx`]a"
  endif
  
  let l:inPosAt = match(s:strAlphUpperStt, l:chAt)
  if (l:inPosAt >= 0) && (char2nr(l:chAt) <= 90)
  if l:inPosAt >= 0
    let @" = s:strGreekUpperStt[(2*l:inPosAt) : (2*l:inPosAt+1)]
    let @* = @"
    return "\<ESC>phx`]a"
  endif
endfunction

inoremap <expr> <C-a><C-g> <SID>ConvertAlpbt2Greek()
------------ code end ------------

A 回答 (1件)

> n<88>,d<e2>,r<a1>,l<88> になってしまいます。



これ見てピンときたので
>          let @" = s:strSpecialKanjiStt[(2*l:inPosAt) : (2*l:inPosAt+1)]
>           let @* = @"
を *3 に直せばとりあえずは動いたけど。キーワードは utf8

let @" = s:strSpecialKanjiStt[(3*l:inPosAt) : (3*l:inPosAt+2)]
if has("clipboard")
let @* = @"
endif

この回答への補足

返答が遅れて失礼しました。回答が得られないと思い込んでいました。

御指摘どおりにすることで Ubuntu でも vim script を意図どおりに動作させられるよ
うになりました。

今回のことから Vim は漢字を扱うとき uft-8 や cp932 のバイト列として扱っているの
だと分かりました。 unicode で統一的に扱っているのではないと分かりました。意外で
した。

この問題では 10 日以上、色々と調べ試していたのですが、ご指摘の点には気付けませ
んでした。本当にありがとうございました。

補足日時:2013/02/24 18:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!