[[Neovim]]にて、`Shift+Space`で[[Hippie completion]]みたいなことをできるようにしたい。
## 使う機能
`<C-x><C-p>`による補完でやりたいことはできる。
## キーマップ
`Shift+Space`へのキーマップ割り当てがうまくいかない。
```lua
key('i', '<S-Space>', '<C-x><C-p>')
```
は無理だった。軽く調べてみると厳しそう。
仕方ないので[[AutoHotkey]]で`Shift+Space`を別のキーにマッピングして、それを[[Neovim]]で設定する。はじめは`F13`とかにしようとしてみた。
```autohotkey
$+Space::
if (isTerminal()) {
send {F13}
} else {
send +{Space}
}
return
```
しかし、これだと[[Ubuntu]]環境の[[Neovim]]では反応しなかった。[[Ubuntu]]環境で`F13`が認識されてなさそう。
仕方ないので`Shift+F6`に割り当てることにした。もともと`Shift`の修飾子を含むキーなので、[[AutoHotkeyの押しっぱなし問題]]も起こりにくいはず。
```autohotkey
$+Space::
if (isTerminal()) {
send +{F6}
} else {
send +{Space}
}
return
```
今度は[[Windows]]と[[Ubuntu]]で`Shift+F6`の解釈が変わるという問題が発生した。
> [[📝NeovimでShift+Functionキーを入力するとWindowsとUbuntuでキー入力が異なる]]
解決策は結局分からずだったので、これは[[OS]]の違いと割り切って[[Neovim]]の[[init.lua]]で吸収するようにした。
```lua
-- Hippie completion
if is_windows then
key('i', '<S-F6>', '<C-x><C-p>')
else
key('i', '<F18>', '<C-x><C-p>') -- Ubuntu(WSL)ではS-F6がF18となるため
end
```
あまりスマートではないがこれで一応動いた。
## まとめ
[[AutoHotkey]]の設定。
```autohotkey
$+Space::
if (isTerminal()) {
; WSLだとF18になる
send +{F6}
} else {
send +{Space}
}
return
```
[[Neovim]]の設定。
```lua
-- Hippie completion
if is_windows then
key('i', '<S-F6>', '<C-x><C-p>')
else
key('i', '<F18>', '<C-x><C-p>') -- Ubuntu(WSL)ではS-F6がF18となるため
end
```