【2017年末】「マウスに触らない」Visual Studio Codeを目指して

こんにちは。インフルエンザはほぼ治りました shundroid です。
もう 2017 年も終わりですね。

そこで今回は今年が終わる時点での、
ぼくの Visual Studio Code の開発環境を紹介していこうと思います。
多分これから変わることはないと思いますので・・。

コンセプト

マウスを触らない

もともとぼくは Vim というエディタで開発をしてきましたが、
auto-complete とかを入れまくったら、重くなってしまい、
ほかのエディタで Vim っぽくできないかと、Spacemacs や、Atom など試してきて、
そこで一番高速で高機能な Visual Studio Code に落ち着いた次第なのです。

マウスを触らない―それは究極の効率でコードを書くための手段。
キーボードから手を離すことによるタイムロスを防ぐことができます。

そのために工夫しているキーバインドやプラグインを紹介していきたいと思います。

プラグイン

Vim

必須プラグインです。VSCode で Vim ライクなキー入力に対応します。
またこのプラグインにより後ほどキーバインドを設定していきます。

検索や保存も完ぺきにできます。
しかしちょっと C-e C-y によるスクロールのレスポンスが遅い気がします。
それはしゃーなし。

Trailing Spaces

行末のスペースを表示してくれます。
便利ですね。

vscode-icons

vscode-icons

VSCode をカラフルに彩ってくれます。きれいですね。

Settings Sync

来ました神プラグイン。
User Settings や Keybindings ファイルを複数の端末で同期してくれます!
同期には Gists を使います。ロマンあふれますね。

複数のパソコンで開発する人には必須ですね。
あれ、設定したはずのキーバインドが使えねえ・・あ、こっちで設定してなかっためんどっ
っていうのがなくなります。

ぼくも壊れかけのノートパソコンでもたまに開発するので、Sync するようにしています。

Gif では手動アップロードの方法を紹介しましたが、
なんと自動同期もしてくれるんです。なんてすばらしい・・・!

この記事が詳しいので、続きはこちらをご覧ください。ありがとうございます。

Visual Studio Code 入門~導入から Gist による設定管理まで~ - 雀巽の日記帳
Windows 環境のエディタが Notepad のみという尖りきった環境だったので、Visual Studio Code を入れてみることにしました。 インストール Setting up Visual Studio Co...

その他

Vue ファイルに対応する Vetur、stylus に対応する language-stylus
C/C++、Git Log が見れる Git History(ほぼ使用しない)を入れています。

キーバインド

Vim(vscode-vim)で、 <leader> キーを使用したキーバインドができるので、
Space キーをリーダーキーにして、
マウスを触らず、手が疲れないキーバインドを実現!!

<leader> キーを使ったキーバインドの方法

ふつう、キーバインドだと、Ctrl や Alt などを使うことが多いのですが、
キーを使うことによって、Space キーなどでキーバインドを組むことができるようになります。

右側の USER SETTINGS に、

{
    "vim.leader": "<space>"
}

この行を追加します。(波かっこは不要です)
これで Space キーをリーダーキーにできました!

NORMAL MODE のキーバインドを設定する

設定とかを開きたいときって、Normal Mode のときですよね。
ステータスバーに -- NORMAL MODE -- と表示されているときです。

vscode-vim だとその時のキーバインドでは、Other Modes という類に追加するそうなので、
ためしに、otherModes のキーバインドに、 <leader> + p でファイルを開けるようにしてみましょー。

{
    "vim.otherModesKeyBindings": [
        {
            "before": ["<leader>", "p"],
            "after": [],
            "commands": [
                { "command": "workbench.action.quickOpen" }
            ]
        }
    ]
}

これを設定して、保存( :w でできます)して、
Normal Mode でないときは ESC を押してから、
Spaceキー + P で、ファイルを開くあれが出てくると思います。

その他のキーバインド

ほかに、ぼくは上の要領で、次のキーバインドを追加しています。

キー 動作 コマンド
<leader> + w + l 右のパネルへ after を ["<C-w>", "l"] とする
<leader> + w + h 左のパネルへ after を ["<C-w>", "h"] とする
<leader> + o Open Recent workbench.action.openRecent
<leader> + s Show Commands workbench.action.showCommands
<leader> + f プロジェクト内検索 workbench.action.findInFiles
<leader> + d フォルダーを開く workbench.action.files.openFolder
<leader> + b サイドバーの表示・非表示 workbench.action.toggleSidebarVisibility
<leader> + @ ターミナルの表示・非表示 workbench.action.terminal.toggleTerminal

command の部分を書き換えることで、様々な動作に対応できます。
また、上2つは after を使っていますが、
after を使うと、キーの動きをさらにキーの動きにして返すことができます。

例えば1番上のだと、

{
    "vim.otherModesKeyBindings": [
        {
            "before": ["<leader>", "w", "l"],
            "after": ["<C-w", "l"]
        }
    ]
}

こうなるので、 <leader> + w + l で、Ctrl + w + l をシミュレートできるのです。

コマンドの種類は、keybindings.json に一覧が乗っているので、そちらを参照してください。

ドヤる

キーボードだけで操作しています。

実は左側のファイル一覧の画面も、Vim ライクな操作ができるんです。

あと、ステータスバーの色が insert 時変わっていますが、
それは次の設定を USER SETTINGS にすることにより変えられます。

{
    "vim.statusBarColorControl": true,
    "vim.statusBarColors" : {
        "normal": "#005f5f",
        "insert": "#5f0000",
        "visual": "#5f00af",
        "visualline": "#005f87",
        "visualblock": "#86592d",
        "replace": "#000000"
    }
}

他にも、選択時・行・ブロック選択時・置き換え時も色を変えられます。

しかしまだ課題もあります。
いったん左側のサイドメニューやターミナルにフォーカスが当たると、
そこから自分で設定したキーバインドが使えなくなってしまいます。

それが直ればもうマウスとはおさらばですね!
実機テストのときはどっちみち使いますが・・・w

VSCode のExtensionを開発してみる

こんにちは。
Visual Studio Code、使っていますか?
ぼくはこのエディタが大好きです。

今回は、このエディタの Extension(=プラグイン)の開発をしていきたいと思います。

※ node.js が必要です!

開発方法

  • TypeScript + Node.js でいけます。
  • ジェネレータは Yeoman でできています。

手順1: Yeomanを入れる。

npm install -g yo

また、VSCode Extension generatorも入れます。

npm install -g generator-code

手順2: ジェネレータを実行

> yo code
? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== Yes

     _-----_
    |       |    .--------------------------.
    |--(o)--|    |   Welcome to the Visual  |
   `---------´   |   Studio Code Extension  |
    ( _´U`_ )    |        generator!        |
    /___A___\    '--------------------------'
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of extension do you want to create? New Extension (TypeScript)
? What's the name of your extension? first-ext
? What's the identifier of your extension? first-ext
? What's the description of your extension? first-ext
? What's your publisher name? xxx
? Initialize a git repository? No
   create first-ext\.vscode\launch.json
   create first-ext\.vscode\settings.json
   create first-ext\.vscode\tasks.json
   create first-ext\typings\node.d.ts
   create first-ext\typings\vscode-typings.d.ts
   create first-ext\test\extension.test.ts
   create first-ext\test\index.ts
   create first-ext\.vscodeignore
   create first-ext\.gitignore
   create first-ext\README.md
   create first-ext\vsc-extension-quickstart.md
   create first-ext\tsconfig.json
   create first-ext\src\extension.ts
   create first-ext\package.json


I'm all done. Running npm install for you to install the required dependencies. If this fails, try running the command yourself.

Extension の形式は、TypeScript がおすすめです。
開発するとき、インテリセンス君が強力に働いてくれて便利だからです。

その後、名前、識別子、説明、開発者名、Git と聞かれます。
今回は、Git の設定は n にして置きました。

ずらーとモジュールがインストールされます。

手順3: Extension を実行

> cd first-ext
> code .

code . がうまくいかない時は、
first-ext フォルダを VSCode で開いてください。

ジェネレータを実行した状態で、
Hello world が試せるようになっているので、
作った Extension を実行してみましょう。

左側のデバッグボタン(虫)をクリック、緑色の再生ボタンをクリックします。
(ちなみに F5 キーでもいけますー
すると、デバッグ用の VSCode がもう一つ起動します。

vscode-ext-debug

この状態で、Extension をテスト(=実行)できるわけです。

デバッグ用に開いた VSCode で、Ctrl + Shift + P をしてコマンドパレットを開きます。
Hello world と入力しEnter キーを押してみましょう。

vscode-ext-command

Hello world というメッセージが表示されます。

vscode-ext-info-message

この動きは、すべて今作った Extension で動いています。

では、どういう仕組みで動いているのか見てみましょう。

手順4: 動く仕組みは・・?

vscode-ext-nagare
↑ ざっくりとした流れの画像

いまデバッグしていたウインドウは閉じて、
先ほどのプラグインを開いたウインドウに切り替えましょう。

まず、コマンドパレットで「Hello World」と入力しましたね。
これはpackage.json の、contributes.commands から取得されています。

vscode-ext-package.json

ここでは、コマンドパレットでHello Worldが実行されたら、
extension.sayHelloを実行すると書いてあります。

では、この extension.sayHello はどこにあるのでしょう。
src/extension.ts を開いてみましょう。

vscode-ext-extension.ts

activate 関数の中に、
vscode.commands.registerCommand(...)を呼び出している行があります。(17行目)
ここでは、extension.sayHello コマンドが呼び出されたら、
第二引数のコールバック関数を実行する、となっています。

コールバック関数には、
vscode.window.showInformationMessage('Hello World!')
と書かれています。
これは、指定された文字列を先ほどのようなメッセージで表示する関数です。

手順5: 少し変えてみる

extension.ts を、少し変更してみましょう。

let disposable = vscode.commands.registerCommand('extension.sayHello', () => {
  // The code you place here will be executed every time your command is executed

  // Display a message box to the user
  vscode.window.showErrorMessage('Hello Error Message!');
});

似た関数で、showErrorMessage という物があります。
これは、エラーを表示する関数です。

実行してみましょう。手順は先程と同じです。
(F5キーでもいけるよ)

同じように、Ctrl+Shift+P から Hello World を選ぶと、

vscode-ext-show-err-msg

エラーメッセージ出現!

まとめ

このように、Extension は、
TypeScript + Node.js で開発できます。

また、公式サイトにも英語ですが、
Extension の作成方法が載っているので、
見てみてください。