豆知識。どうも Linux console 版 vim で <C-Space> に何か map するには <Nul> か <C-@> を使うようで ( http://vim.wikia.com/wiki/VimTip285 ) 。ここには insert mode で <C-k> のあとに何か key stroke をうつと vim がそれを内部でどう認識しているかがわかるよ、とも書いてあるんだけど Linux console 版vim<C-k><C-Space> を試してみると確かに <Nul> が出てくる。で、 :help <Nul> してみると <C-@> が等価だともわかる。んだけどなんでなんだろう。 Windows だと <C-k><C-Space> の結果は <C-Space> なので OS の時点でそういう認識をしているんだろうか。

http://vim.g.hatena.ne.jp/ka-nacht/20090311/1236698460 によると GUI 版かどうかで挙動が変わるらしい。んーと思いながら help をあさると :help gui-extras にそれっぽいことが書いてあるです ? あと console 版だと terminal emulator まわりで変わるってことは terminfo かなんかで定義されてるんだろうかと思って infocmp してみてみたけどさっぱりわからんね。 ANSI escape sequence とか読み方すらわからんよ。

とりあえず vimrc で platform ごとに分ける書き方のひな形は以下のようになると思うんだけど Linux だと <C-S-Space> も <Nul> として認識されてしまうのが困りどころ。

ka-nacht さんは上記の entry で map <C-Space> <C-@> とすると場合分けしなくてもよくなるよと言ってるんだけどなぜかうちの環境じゃうごかなかったので ( Linux / Windows の console / gui で試してみたけど全部ダメだった ) :help gui-extras に従って以下のように場合分けしましたよー。

if has('gui_running')
    nnoremap <C-Space> :echo '<lt>C-Space>'<CR>
else
    nnoremap <C-@> :echo '<lt>C-Space>'<CR>
endif

ka-nacht さんありがとう。疑問がとけた上に code が良くなりました。