VSCode で Emacs キーバインドを使う方法と設定

2020年11月23日

こんにちわ。

VSCode 人気ですね。
開発現場では Web 系エンジニアのほとんどが VSCode を使っている印象です。

令和元年の注目エディタは!?】決定版!2019 年の人気エディタランキング」を読むと、VSCode が Vim を抜いて1位に輝いています。

とにかく、カスタマイズしなくてもスタイリッシュで軽量に動作するし、拡張機能の開発も活発です。「細かくて伝わらない(広まらない)」便利な拡張機能もたくさん開発されています。例えば、「クリップボードのスクリーンショットを画像にして保存する Paste Image」という拡張機能があったりします。

私は長年 Emacs を使ってきましたが、拡張機能が豊富で導入しやすいという理由で VSCode に乗り換えました。

Emacs から VSCode に乗り換えて、一番最初に VSCode で実現したいのが、Emacs キーバインドです。C-nで「次の行へ移動」やC-hで前方削除、といった基本的なキーバインドのことです。

本記事では、いくつかある Emacs キーバインドの拡張機能の中で一番おすすめの拡張機能を紹介します。そして、設定や簡単な使い方も紹介していきます。

Emacs キーバインドの拡張機能

VSCode のマーケットプレースで「emacs」で検索するといくつかの拡張機能がヒットします。
その中で一番おすすめなのは「Awesome Emacs Keymap」です。

おすすめの理由は、今もメンテナンスが続いていること。他の拡張機能は2、3年前から更新がないものが多い中、Awesome Emacs Keymap は今もメンテナンスされています。

また、他の Emacs キーバインドの拡張機能を参考に開発されているので、いいとこ取りしています。

インストールはマーケットプレースから簡単にできるので解説しません。マーケットプレースからインストールしてください。

おすすめ設定

ここからは Awesome Emacs Keymap をインストール後にやっておきたいカスタマイズを紹介します。

Mac のC-SPCを潰す

Mac では C-SPC が 「入力ソースの切り替え」に割あたっており、Emacs のマークセットが使えません。

そこで、OS に登録されているショートカット C-SPC をオフにしましょう。
「システム環境設定」「キーボード」「ショートカット」「入力ソース」と進み、下の画像のように「前の入力ソースを選択」(C-SPC)をオフにします。

前の入力ソースを選択をオフ

OS ライクなコピー&ペーストを実現する

Emacs 以外のアプリのコピー&ペーストはC-c C-vなので、アプリ間でコピーするときに間違って、C-cC-vを使ってしまうこと多くないですか?

私はよく誤ってしまい困ってました。
特に多いのは、ブラウザでソースコードをC-cでコピーしてから、Emacs に戻ったあと、ペーストしようと間違ってC-vを押してしまい、次ページへ移動してしまってイラッとすることです。

私は Emacs のヘビーユーザではないので、Emacs 以外で作業することが多く、アプリ間の移動でキーバインドが混乱しちゃうことが多くて。

そこで、私は Emacs でもC-c C-vをコピー&ペーストに割り当ててました。
VSCode でも同じようにできる方法を調べたので紹介します。

実現するには、VSCode のショートカットを変更します。
M-xOpen Keyboad Shortcuts (JSON)を実行して、keybindings.jsonを開いて、以下の設定を追加します。

    // fit the GUI apps
    {
        "key": "ctrl+c",
        "command": "execCopy"
    },
    {
        "key": "ctrl+v",
        "command": "execPaste"
    },
    {
        "key": "ctrl+shift+n",
        "command": "emacs-mcx.scrollUpCommand",
        "when": "editorTextFocus && !suggestWidgetVisible"
    },
    {
        "key": "ctrl+shift+p",
        "command": "emacs-mcx.scrollDownCommand",
        "when": "editorTextFocus && !config.emacs-mcx.useMetaPrefixMacCmd && !suggestWidgetVisible"
    },

これで Awesome Emacs Keymap を適用した VSCode でもC-c C-vでコピー&ペーストできるようになります。

そして、もともとC-vに割り当てられていた「次のページへ移動」をC-Nにし、ついでに反対方向の「前のページへ移動」をC-Pに割り当てています。これは Vim キーバインドからヒントを得て、「大文字なら極端な動作」としています。C-nが下の行なのをC-Nなら次ページへ移動という具合です。

知っておきたいキーバインド

Awesome Emacs Keymap で使える Emacs キーバインドは、「tuttieee/vscode-emacs-mcx」で確認できます。

ここからは、その中でも私が「へぇー」と感心したキーバインドを紹介します。私は Emacs のライトユーザなので、 Awesome Emacs Keymap で初めて知った元祖 Emacs のキーバインドもあります。

キルリング関係

キルリングは、履歴を管理しています。C-kM-w でコピーしたときの履歴です。

ですが、私は Emacs 時代、履歴を1つしか使いこなせていませんでした。C-k または M-w でコピーして、C-y でペーストするだけです。

実は便利なキーバインドとして M-y がありました。例えば、

  1. 「りんご」を M-w でコピー
  2. 「ごりら」を M-w でコピー
  3. 「らっこ」を M-w でコピー

しておけば、

  1. C-y で「らっこ」がペーストされる
  2. 続けて、M-y で「ごりら」に切り替わる
  3. 続けて、M-y で「りんご」に切り替わる

と、過去コピーした履歴からペースト(Emacs ではヤンク)できます。

コピー&ペーストで使えるキーバインドを整理すると、以下のとおりです。

キーバインド 内容
C-k 行のカット(削除&コピー)
M-w コピー
C-y 一番新しい履歴をペースト
M-y 一つ前の履歴に変更

マークセットの履歴

キルリングと同じようにマークセットも履歴で管理されています。

C-SPC C-SPC でマークセットして、C-u C-SPC で履歴をたどれます。マークセットの C-SPC C-SPC の2つ目の C-SPC はマークセットの選択解除です。なので、C-SPC C-g でキャンセルするのと同じです。

マークセットを繰り返していけば、履歴として記録されていきます。

C-u C-SPC で履歴を新しい場所からたどっていけます。注意点は、C-u C-SPCで取り出すとマークセットの履歴から削除されることです。キルリングはペーストしても履歴に残りますが、マークセットは消えていきます。

このマークセットの履歴の機能を使えば、あとで戻ってきたい場所で C-SPC C-SPC でマークセットしておけば、C-u C-SPC で戻ってこれます。簡易なブックマークと考えることができます。

もう一つマークセットでおすすめなのは、C-x C-x で直前のマークセットから実行した場所までを選択状態にします。普通にC-SPCでマークセットして選択すればいいかと思うかもしれませんが、C-s や ace-mode などの移動系の機能と相性がいいです。

例えば、

  1. C-SPC C-SPC でマークセットして、
  2. ace-mode で目的の行へ移動して、
  3. C-x C-x で選択状態にして、
  4. M-w でコピー

といったことができるようになります。

マークセット関連のキーバインドを整理すると以下のとおりです。

キーバインド 内容
C-SPC C-SPC マークセット(+解除)
C-u C-SPC マークセットの履歴をたどる
C-x C-x 直前のマークセットから現在位置までを選択状態にする

他にも

Awesome Emacs Keymap で使える Emacs キーバインドがあるので、「tuttieee/vscode-emacs-mcx」で確認してみてください。

まとめ

本記事では、

VSCode でおすすめの Eamcs キーバインドの拡張機能 Awesome Emacs Keymap を紹介しました。
また、おすすめの設定とキーバインドも紹介しました。

もし、私のように Emacs のヘビーユーザーではなく、Emacs キーバインドに馴染んでしまって Emacs を手放せないなーという人は、本記事を参考に VSCode へ乗り換えてはいかがでしょうか。

VSCode

Posted by crz33