eskk.vimで句読点をピリオドとコンマ(カンマ)にする．ついでにsticky shiftで楽に入力

eskk.vimで句読点をピリオドとコンマ(カンマ)にする．ついでにsticky shiftで楽に入力
=================================

久しぶりの記事．
ニッチな分野の記事を書くことが多いが，中々ネタもないし．

eskk.vimというのはskkという入力方式をvimで使うためのプラグインだ．
skkに一度慣れると中々元には戻れない．

```vim
Plug 'tyru/eskk.vim'
```

skkで小指が疲れると思っている人．
是非ともsticky shiftで検索して，shiftキーを別のキーに移すと幸せになれるだろう．(vimに限らずCorvusSKKでも設定できます)
私の場合は;にshiftを割り当てている．(eskkに限らず全てのSKKで)
今回はこの設定についても説明しておこう．

ところで，論文を書いていると、句読点は全角の、。ではなく，．を使うことであろう．
この時，通常のeskkだとそのまま、。と入力されてしまう．

そこで句読点をコンマとピリオドに自動で変えたいのだが中々嵌り所が多かった．
なので，自分自身の確認用をかねてここに残しておく．

(設定方法自体は`:help`を使ってドキュメントを見れば分かるのだが...)


句読点をコンマとピリオドにする方法
==============================

私の場合は半角+スペースが気に食わないので，全角カンマ・ピリオドを使っている

### 結論

```
autocmd User eskk-initialize-pre call s:eskk_initial_pre()
function! s:eskk_initial_pre()
let t = eskk#table#new('rom_to_hira*', 'rom_to_hira')
call t.add_map(',', '，')
call t.add_map('.', '．')
call eskk#register_mode_table('hira', t)
let t = eskk#table#new('rom_to_kata*', 'rom_to_kata')
call t.add_map(',', '，')
call t.add_map('.', '．')
call eskk#register_mode_table('kata', t)
endfunction
```

### 嵌った理由(言い分け)

基本は以下のサイトを参考にすればよいが，これだけだと設定できない．
そう，一行目の`autocmd ...`が抜けているのだ．
vim scriptを読める人であれば分かるであろうが私は分からずはまった．

[Vimで文章を書くときに便利なプラグイン](http://hinagishi.hateblo.jp/entry/2011/12/24/194319)

そこで`:help eskk-initialize-pre`でヘルプを見るとちゃんと書いてあった．
以下にhelpの記載を抜粋する．

```
eskk-initialize-pre				*eskk-initialize-pre*
-------------------

このフックは最初にeskkが有効化される前に一度だけ実行される。
毎回有効化された時点で行いたい場合は|eskk-enable-pre|フックを参照。

アルファベットテーブルの登録			*eskk-alphabet-table*
----------------------------

|eskk-initialize-pre|フックを利用して次のようにアルファベット変換テーブルを
定義することができる。
>
    autocmd User eskk-initialize-pre call s:eskk_initial_pre()
    function! s:eskk_initial_pre()
      " ユーザはここで何か重たい初期化処理を実行することができる。
      let t = eskk#table#new('rom_to_hira*', 'rom_to_hira')
      call t.add_map('~', '～')
      call t.add_map('zc', '©')
      call t.add_map('zr', '®')
      call t.add_map('tm', '™')
      call t.add_map('z ', '　')
      " "1." のように数字の後のドットはそのまま入力
      for n in range(10)
        call t.add_map(n . '.', n . '.')
      endfor
      call eskk#register_mode_table('hira', t)
    endfunction

    " http://subtech.g.hatena.ne.jp/motemen/20110527/1306485690
    " のeskkでの設定例。
    " この方法は g:eskk#rom_input_style が"skk"でないと
    " 最後のzが残ってしまうことに注意。
    autocmd User eskk-initialize-pre call s:eskk_initial_pre()
    function! s:eskk_initial_pre()
      for [orgtable, mode] in [['rom_to_hira', 'hira'], ['rom_to_kata', 'kata']]
        let t = eskk#table#new(orgtable.'*', orgtable)
        call t.add_map('zw', 'w', 'z')
        call eskk#register_mode_table(mode, t)
      endfor
    endfunction
```

細かな話
------------

上のコードが何をしているのかについて説明する．
eskkでは日本語を入力するためにそのままのキーボードの入力から，
日本語(ひらがな)に対応するキーマップを持っている．
それが，`eskk#table#new('rom_to_hira*', 'rom_to_hira')`だ．

この`#`は実際にはパスの区切りになっている．
だから，eskk.vimをインストールした場所を見てみると，これがある．
私の場合はvim-plugを使っているので，こんな感じだった．

`~/.vim/plugged/eskk.vim/autoload/eskk/table/rom_to_hira.vim`

この中身は長いので全ては載せないが，抜粋すると，

```
function! eskk#table#rom_to_hira#load() abort
  return {
        \   'a': ['あ', ''],
		...
			中略
		...
        \   '[': ['「', ''],
        \   ']': ['」', ''],
        \   '.': ['。', ''],
        \   ',': ['、', ''],
        \}
endfunction
```

まさにこの一番最後の二行が問題だ．
つまり，上のコードはこのテーブルを上書きしているのだ．

まあ，分かってしまえば何ということはない．
が，実装方法を知らないと`eskk_initial_pre`で設定できる，
それは`eskk_initialize_pre`で自動で呼び出されるようになっているなどなど，
内部の実装を知らないと気付かないよ-．というお話でした．

sticky shiftについて
==================


### このsticky shiftという名前について

本来sticky shiftという名前を聞くと，shiftキーを押すと，次のキー入力が大文字に変換される．
つまり，shiftキーを押したまま大文字にしたいキーを押さなくてもよくする機能だ．
`shift + a`ではなく`shift -> a`でaを大文字入力できる機能だ．

でも通常sticky shiftという言葉が使われる場合には，この機能だけでなく，
shiftキー自体も別のキーに割り当てることを意味しているようだ．



### vimでの実現方法

eskkを入れるだけで確かに;がsticky shiftとして使わるため，設定する必要はない

例えば

```
;hana
```

という風に入力すると

```
▽はな
```

と表示され，Spaceを押すことで変換できる．

ただし，日本語入力モードの場合だけ有効だ．

なので，英文でもsticky-shiftを使いたい場合は以下のプラグインを入れるといいだろう．

```
Plug 'lambdalisue/pinkyless.vim'`
```

[小指奮闘記 (Vimmer の Vimmer による Vimmer のためのキーマッピング](https://lambdalisue.hatenablog.com/entry/2016/12/24/234657)

このプラグインも同様に;をsticky-shiftにする．
C言語使いやbash使いは;が入力し辛くなるので嫌かもしれない．

日本語でしかsticky-shiftを使っていないのに，なぜpinkyless.vimを入れていたのであろうか?
謎は深まるばかりであった．


### 振り返って

教訓はただひとつ***公式ドキュメントをよく読もう．***

(我ながらいつもこの結論になっている気がするが，いつになったら体得できるのだろうか...
 普段の知らない知識を求める感覚でGoogleに頼るクセを何とかせねば．)