tkancf.com

VimのCTRL-K <Space>を理解する

投稿日: 2023-12-02

はじめに

先日、Vim上で何かの拍子に CTRL-K <Space> <Space> と入力してしまいました。これにより、見た目上は半角スペースが入力されました。
その時はあまり気にしていなかったのですが、ここで入力された半角スペースはどうも本物の半角スペースとは別物であることに気づきました。半角スペースで検索をしてもその半角スペースのような何か(以降、「半角スペースもどき」と記載します)はハイライトされません。

半角スペースで検索をしてハイライトしている画像

上記画像の中の、 「Hello World!!」の「Hello」と「World!!」の間に半角スペースもどきがいます。見た目場は半角スペースですが、検索してもハイライトされていません。 なんじゃこれ??と疑問に思ったので、調べてみました。

<CTRL-K> の挙動

まずは、インサートモードにおける、<CTRL-K>がどのようなキーなのか調べます。 ヘルプを見てみると、 (:h i_CTRL-Kもしくは、insert - Vim日本語ドキュメント を参照) 以下のように記載されています。

i_CTRL-K
CTRL-K {char1} [char2]
ダイグラフ(digraphs参照)を入力する。{char1}が特別なキーだっ
た場合、そのキーのコードが<>の形で挿入される。例えば、
<C-K><S-Space>(キー2つ)と入力することで、文字列 "<S-Space>" が
入力される。マッピングも考慮されない。

これだけだとよくわかりませんが、ダイグラフを参照するように誘導されているのでそちらも確認してみます。 (:h digraphs もしくは、 digraph - Vim日本語ドキュメントを参照) こちらは長いので、参考になりそうな箇所を一部引用します。

ダイグラフは、通常のキーボードから普通に入力できないキャラクタを入力するために
使われる。これらは多くの場合、印字可能な非 ASCII キャラクタである。
ダイグラフの入力には2つの方法がある: i_digraph
CTRL-K {char1} {char2} または
{char1} <BS> {char2}
最初のものは常に使える; 2番目のものは 'digraph' オプションが設定されていると
きのみ使える。

CTRL-K {char1} {char2} と入力することで、非 ASCII キャラクタを入力する機能のようです。 digraph-tableに入力できる文字もまとまっているので、試しに入力してみます。
例えば、CTRL-K A Fと入力することで 「∀」が入力できます。いつでも 「∀ガンダム」が入力できて便利ですね!
また、CTRL-K d =と入力することで「д」が入力できます。これとCTRL-K D Gで顔文字の完成です。これも便利ですね(°д°)

CTRL-K <Space> の挙動

今回、私が入力した半角スペースもどき CTRL-K <Space> <Space>に話を戻します。
ダイグラフの中でも CTRL-K <Space>は特殊なようで、ヘルプには以下のように記載されています。

CTRL-Kについて、ひとつの汎用的なダイグラフがある: CTRL-K <Space> {char}で、
{char}の最高位のビットを立てて入力する。これはメタキャラクタの入力に使える。

「最高位のビットを立てて入力する」というのが、最初よく分からなかったのですがこれはASCIIコードにおける最上位ビットのことを言っているようです。

※2023/12/07 追記:
現在は、翻訳が修正されて、 「CTRL-K {char}で、{char}の最上位ビットを立てて入力する。」となっています。
追記おわり

例えば、スペースのASCIIコードは10進数で32です。これを2進数で表現すると以下ようになります。

00100000

この最高位のビットを立てるということは、以下のように変更されます。

10100000

ASCIIコード表を見てみると、たしかに 10100000(10進数なら160)は空白文字になっています。私が入力した半角スペースもどきは、この空白文字になっているようです。

一応、上記挙動の認識が合っているのかも確認してみます。 もう一度ASCIIコード表を見てみると、「w」の最高位のビットを立てると「÷」になるようです。

w = 2進数: 01110111

↓ 最高位のビットを立てる

÷ = 2進数: 11110111

つまり、 CTRL-K <Space> wと入力すると「÷」が入力されるはずです。やってみます。

「÷」が入力された画像 確かに「÷」が入力されました。認識はあってそうです。

おわりに

結構長いことVimを使ってるんですが、特に何も考えず i_CTRL-Kはリマップしていた事もあって全然知らない挙動だったので追ってみると面白かったです。
絵文字を入力する時に便利、、、かなぁ?数学の記号とか頻繁に入力する場合には良いのかもしれません。