いま熱い最新スクリーンエディタmicro ことはじめ

## microとは何か

最近注目を集めてるような気がするスクリーンエディタ、つまり文字ベースのターミナル([端末エミュレータ](https://ja.wikipedia.org/wiki/%E7%AB%AF%E6%9C%AB%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF))で動作するテキストエディタです。そのようなエディタとしてはviやEmacs、近年では[nano](https://ja.wikipedia.org/wiki/Nano_(%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF))が知られてます。

<dfn>[**micro**](https://github.com/zyedidia/micro)</dfn>はそのようなテキストエディタの中でも最後発で、目下のところ活溌に開発されてるところです。この記事では[README.md](https://github.com/zyedidia/micro/blob/master/README.md)からいい感じに抜萃しつつ紹介します。

microはviやEmacsのような独特な操作体系ではなく、GUIのテキストエディタに近い操作性(キーバインド)を持ちます。SSHなど端末経由でのテキスト編集の必要に迫られたときに、新たな操作体系を覚え直す手間を最小限にしながら作業に取り掛かることができます。

![micro logo](https://qiita-image-store.s3.amazonaws.com/0/4121/8aeba380-eef3-13ef-e9f6-2b0cfa539da2.png)

> ## 2016年10月20日 追記
>
> [#端末(ターミナル)の設定](#端末ターミナルの設定)を追加しました。特に、<kbd>Shift+[←↓↑→]</kbd>での範囲選択が機能しない場合に参考にしてください。

## 特徴

* かんたんインストール
* 実行ファイルをダウンロードするだけで動く
* マルチカーソル
* Windowsみたいなキーバインド
    * <kbd>Ctrl+s</kbd>で保存、<kbd>Ctrl+c</kbd>でコピー、<kbd>Ctrl+v</kbd>で貼り付け…
* いい感じのデフォルト設定
* 画面分割とタブ
* マウスをちゃんとサポートしてるよ
    * ドラッグで選択もできるし、ダブルクリックで単語選択、トリプルクリックで行選択
* クロスプラットフォーム
    * GoがサポートしてるOSなら、WindowsでもLinuxでもBSDでもmacOSでも動くよ
* Luaで拡張できるプラグインシステム
* 永続的にアンドゥできるよ
* 自動でlint(文法チェックとか)エラー確認できるよ
* 文法の強調表示 ([100言語以上サポート](https://github.com/zyedidia/micro/tree/master/runtime/syntax))
* カラースキームサポート
* 端末の[True color](https://ja.wikipedia.org/wiki/%E8%89%B2%E6%B7%B1%E5%BA%A6#.E3.83.88.E3.82.A5.E3.83.AB.E3.83.BC.E3.82.AB.E3.83.A9.E3.83.BC.EF.BC.8824.E3.83.93.E3.83.83.E3.83.88.EF.BC.89)表示をサポート
* スニペット機能
    * `> plugin install snippets`でインストールできるよ
* システムのクリップボードにコピペできるよ
* ちっこくてシンプルだよ
* かんたんに設定できるよ
* キーボード操作を保存するマクロがあるよ
* アンドゥリドゥとか行番号表示とか、Unicodeサポート、自動折り返し表示とか…

## インストール

### macOS(Homebrew)

```
brew install micro
```

### コマンドラインからのダウンロード

端末で以下のコマンドを実行すると、環境からOSを自動判定してダウンロードすることができます。この自動インストーラーのドメインは`Get micro`の意味ですヾ(〃＞＜)ﾉﾞ

```
curl https://getmic.ro | bash
```

このスクリプトを実行すると現在のシェルのカレントディレクトリに実行ファイル`micro`がダウンロードされるので、これを`PATH`の通ったディレクトリに移動します。

ローカルディレクトリにPATHを通せば管理者権限がなくても、実行コマンドとしてインストールができます。

私の場合は以下のように設定します。

`~/.bash_profile`または`~/.zprofile`(もしくは両方)に以下のような行を追加。

```sh:~/.bash_profile
PATH=$HOME/local/bin:$PATH
```

まとめると、次のように操作すれば大丈夫です。

```sh
$ curl https://getmic.ro | bash
$ mkdir -p ~/local/bin
$ mv micro ~/local/bin
$ hash -r
$ micro --version
# ダウンロードしたバージョンが表示されたら成功
```

### `git commit`にmicroを利用する

`EDITOR`環境変数にセットしておくと、`git`に限らずエディタでファイルを開くようなコマンドで使ってくれるようになります。

```.zshrc
export EDITOR=micro
```

## 覚えておくと良いショートカットキー

ここに記載するキーボード表記はmicroの設定ファイルとは異なります。(<kbd>Ctrl+q</kbd>→`CtrlQ`)

### これだけ覚えておけばどうにかなる

| キー              | アクション      | 説明                 |
|-------------------|---------------|----------------------|
| <kbd>Ctrl+q</kbd> | `Quit`        | ファイルを閉じる     |
| <kbd>Ctrl+s</kbd> | `Save`        | ファイルを保存       |
| <kbd>Ctrl+o</kbd> | `OpenFile`    | ファイルを開く       |
| <kbd>Ctrl+a</kbd> | `SelectAll`   | 全選択               |
| <kbd>Ctrl+x</kbd> | `Cut`         | 選択範囲切り取り     |
| <kbd>Ctrl+c</kbd> | `Copy`        | 選択範囲コピー       |
| <kbd>Ctrl+v</kbd> | `Paste`       | 貼り付け             |
| <kbd>Ctrl+z</kbd> | `Undo`        | 元に戻す             |
| <kbd>Ctrl+y</kbd> | `Redo`        | やり直し             |
| <kbd>Ctrl+e</kbd> | `CommandMode` | エディタコマンド実行 |

一般的のテキストエディタと同じなので、<kbd>Ctrl+q</kbd>で「**quit** (ファイルを閉じる/エディタ終了)」だけ覚えておけばどうにかなります。

範囲選択は<kbd>Shift</kbd>を押しながらカーソルキー(<kbd>←↓↑→</kbd>)を押すだけなので悩むことはありません。

<img width="602" alt="スクリーンショット 2018-03-11 午後11.04.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/4121/3a5cdecf-bb50-788a-c39a-027bf5373824.png">

基本的なコマンドは<kbd>Alt+g</kbd>を押すと、(nanoと同じようなスタイルで)画面下部にキーボードショートカット一覧を表示できます。`^S`は<kbd>Ctrl+s</kbd>の省略表示です。この表示はもう一度<kbd>Alt+g</kbd>を押すと消えます。

### マウス

microは端末アプリケーションですがマウス操作をサポートします。一般的なエディタのように、カーソル位置移動、分割ウィンドウの切替、テキストの選択などができます。

### 発展的な操作

| キー              | アクション        | 説明                   |
|-------------------|-----------------|------------------------|
| <kbd>Ctrl+f</kbd> | `Find`          | 検索                   |
| <kbd>Ctrl+b</kbd> | `FindNext`      | 次の検索結果           |
| <kbd>Ctrl+p</kbd> | `FindPrevious`  | 前の検索結果           |
| <kbd>Ctrl+r</kbd> | `ToggleRuler`   | 行番号表示             |
| <kbd>Ctrl+d</kbd> | `DuplicateLine` | 行を複製               |
| <kbd>Ctrl+k</kbd> | `CutLine`       | 行を切り取り           |
| <kbd>Ctrl+l</kbd> | `JumpLine`      | 行移動                 |
| <kbd>Ctrl+t</kbd> | `AddTab`        | タブを追加             |
| <kbd>Ctrl+\\</kbd> | `NextTab`       | 次のタブ               |
| <kbd>Ctrl+]</kbd> | `PreviousTab`   | 前のタブ               |
| <kbd>Ctrl+w</kbd> | `NextSplit`     | 分割したほかのウィンドウに移動 |
| <kbd>Ctrl+g</kbd> | `ToggleHelp`    | ヘルプ表示／非表示     |
| <kbd>Ctrl+b</kbd> | `ShellMode`     | シェルコマンド実行     |
| <kbd>Ctrl+u</kbd> | `ToggleMacro`   | キーマクロ記録／終了   |
| <kbd>Ctrl+j</kbd> | `PlayMacro`     | キーマクロ再生         |

 * <kbd>Ctrl+k</kbd>を連打すると、<kbd>Ctrl+v</kbd>で一気に貼り付けることができます。
 * <kbd>Ctrl+\\</kbd>と<kbd>Ctrl+]</kbd>は不均等に見えるかもしれません
    * <kbd>Ctrl+Shift+]</kbd>は<kbd>Ctrl+\\</kbd>と同じなので実質<kbd>Shift</kbd>の有無でNextとPreviusが反転します

### キーマクロ

**<dfn>キーマクロ</dfn>**(microのドキュメントでは単に<q>macro</q>と呼ばれる)は、キーボード操作を記録して、再生することができる機能です。

```
おかか
しゃけ
うめ
こんぶ
```

これのテキストを以下のようなHTMLにしたいとします。

```html
    <li>おかか</li>
    <li>しゃけ</li>
    <li>うめ</li>
    <li>こんぶ</li>
```

 1. 先頭(<q>おかか</q>のある行)にカーソルを移動する
 2. <kbd>Ctrl-u</kbd>で記録を開始
 3. <kbd>Ctrl-←</kbd>で行頭に移動、` `(インデント)と`<li>`を入力
 4. <kbd>Ctrl-→</kbd>で行末に移動、`</li>`を入力
 5. <kbd>↓</kbd>で次の行に移動
 6. <kbd>Ctrl-u</kbd>で記録を終了
 7. <kbd>Ctrl-j</kbd>(キーマクロ再生)を3回押す

再生できるのは最後に記録したものだけで保存することもできない単純な機能ではありますが、うまく利用することで単純作業の反復を省力化できます。

### キーバインディング設定

以上で紹介したショートカットキーは標準設定ですが、設定ファイル(`~/.config/micro/bindings.json`)でカスタマイズできます。たとへば<kbd>Esc</kbd>キーはデフォルトでは`quit`(ファイルを閉じる／エディタ終了)の操作ですが、これを変更する設定は以下のように記述します。

```~/.config/micro/bindings.json
{
    "Escape": "CommandMode"
}
```

詳細は<kbd>Ctrl-e</kbd>で`help keybindings`コマンドを実行すると表示されるコマンドで確認できます。

キーとして指定できるのは`PageUp`, `PageDown`, `Home`, `End`, `Insert`, `Delete`, `Help`, `Exit`, `Clear`, `Cancel`, `Print`, `Pause`, `Backtab`, `F1`〜`F64`などです。

端末で発行できるショートカットキーのうち、<kbd>Ctrl</kbd>キーと文字の組合せは[ASCII制御文字](https://ja.wikipedia.org/wiki/ASCII#ASCII.E5.88.B6.E5.BE.A1.E6.96.87.E5.AD.97)の範囲に限られます。 *(これはVimにもEmacsにも共通して存在する制限です)*

| キー | 表記 |
|-----|------|
| <kbd>Ctrl+\\</kbd> | `CtrlBackslash` |
| <kbd>Ctrl+]</kbd>  | `CtrlRightSq` |
| <kbd>Ctrl+^</kbd>  | `CtrlCarat` |
| <kbd>Ctrl+_</kbd>  | `CtrlUnderscore` |

*(ドキュメントには`CtrlLeftSq`が記載されてるけど、`Escape`と区別ってできるのかな…?)*

## コマンド

<kbd>Ctrl+e</kbd>を押すとコマンドモードになります。コマンド一覧は<kbd>Ctrl+e</kbd> `help commands`で確認できます。これ以降、コマンド実行を`> help commands`のように表記します。

| コマンド                       | 説明                       |
|-----------------------------|----------------------------|
| `> save`                       | 保存                       |
| `> save filename`              | 別のファイルに保存         |
| `> tab filename`               | タブでファイルを開く       |
| `> tabswitch`                  | 画面をほかのタブに移動 |
| `> hsplit filename`            | 画面を水平分割             |
| `> vsplit filename`            | 画面を垂直分割             |
| `> quit`                       | ファイルを閉じる           |
| `> replace "search" "value"`   | 確認しながら置換           |
| `> replaceall "search" "value"` | 確認なしで置換                |
| `> help`                       | ヘルプページを表示         |
| `> log`                        | エディタの操作ログ         |
| `> lint`                       | 文法チェック(対応言語のみ) |
| `> pwd`                        | カレントディレクトリ表示 |
| `> cd path`                    | カレントディレクトリ移動 |
| `> term`                       | 端末エミュレータを起動 |

コマンド入力では毎回すべて入力する必要はなく、<kbd>TAB</kbd>キーで補完できます。例として、`hsplit`コマンドを実行するには`h`を入力してから<kbd>TAB</kbd>を押すだけでコマンドを実行できます。

### プラグイン

microは[Lua](https://ja.wikipedia.org/wiki/Lua)言語で拡張コマンドを定義することができ、これを「プラグイン」と呼びます。(実は上記コマンドのうち`> lint`は標準プラグインです)

プラグインの一覧は[Official plugin channel for micro](https://github.com/micro-editor/plugin-channel)にあります。あまり多くのプラグインが存在するわけではなく、2018年3月現在で18個です。

プラグインは<kbd>Ctrl+e</kbd>のコマンドからインストールすることができます。

| コマンド                       | 説明                       |
|------------------------------|----------------------------|
| `> plugin available`         | インストール可能な全プラグインを一覧表示 |
| `> plugin search`            | プラグイン検索                |
| `> plugin install`           | プラグインをインストール         |
| `> plugin list`              | インストールされたプラグインを一覧表示 |
| `> plugin update`            | インストールされたプラグインを更新 |
| `> plugin remove`            | インストールされたプラグインを削除 |

プラグインによっては実行コマンドのインストールが別途必要なものがあるので、詳細はプラグインごとのREADMEをよく読んでください。

例としては、[editorconfig](https://github.com/10sr/editorconfig-micro)プラグインの動作には[`editorconfig`コマンドのインストール](https://github.com/editorconfig/editorconfig-core-c/blob/master/INSTALL.md)が必要です。

プラグインの追加に興味があれば、実装方法などの詳細は(例によって)`> help plugins`で読むことができます。

### 端末(ターミナル)の設定

一部の環境では<kbd>Shift+[←↓↑→]</kbd>での選択が機能しないことがあります。詳しくは[PuTTY+tmux 環境で Ctrl+矢印 が効かなかった原因が解ったかも | yuuAn's Note](http://www.yuuan.net/item/1081)が参考になります。

### [tmux](https://tmux.github.io/)

`$HOME/.tmux.conf`に設定を記述します。

```txt:~/.tmux.conf
set-window-option -g xterm-keys on
```

### [RLogin](http://nanno.dip.jp/softlib/man/rlogin/) (Windows)

[3.15 キーコードのオプション設定](http://nanno.dip.jp/softlib/man/rlogin/#MODKEY)を参考に`modifyCursorKeys`を**`2`(パラメータ無しの場合に１を追加)**に設定します。 (thanks @cranpun!)

<blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/tadsan">@tadsan</a> 何度も申し訳ありません。お使いにならないアプリの件で大変恐縮ですが…解決しましたのでご報告です。以下のオプションの設定を変えることで意図通り動作させられました。<a href="https://t.co/Kcy7Veto0B">https://t.co/Kcy7Veto0B</a><br><br>ご教示ありがとうございました。</p>&mdash; cranpun (@cranpun) <a href="https://twitter.com/cranpun/status/788597740599177216">October 19, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

### [PuTTY](https://ja.wikipedia.org/wiki/PuTTY) (および派生版)

[PuTTY+tmux 環境で Ctrl+矢印 が効かなかった原因が解ったかも | yuuAn's Note](http://www.yuuan.net/item/1081)のように`putty.ini`またはレジストリに設定。

## あとがき

この記事では、新進気鋭のテキストエディタ「micro」を紹介しました。microはメインエディタとして利用するには非力ですが、実用的なテキスト編集のための最低限の機能とUnicodeサポートを持ってゐます。普段はAtomやSublime Textなどで高度な編集をこなしつつサーバーで簡易的な編集をしたい、などの用途にmicroはうってつけです。

逆に、これから端末でSSHログインした環境をメイン環境とするならば、学習コストを払ってでもVimやEmacsを覚えた方が作業効率に寄与するのが現状ではあります。自分のやりたいことを見極めた上で、その目的を達するためのツール選びのひとつとしてmicroが候補になれば幸ひです。