Visual Studio Code と memo で Memo Life For You


> 2017-08-06: memo new hoge で新しいファイルが作成されない場合は、memo の更新が必要
> [Set file name with arguments in cmdNew by yosugi · Pull Request #19 · mattn/memo](https://github.com/mattn/memo/pull/19)

> VS Code 1.13 から、ファイルを新しいウィンドウで開くかどうかを制御する `"window.openFilesInNewWindow"` 設定のデフォルト設定が `off` に変更になったのはいいのだが、macOS では、この設定でも新しいインスタンスで開いてしまう。そのため、macOS 専用の `default` を設定することで同一インスタンスに開いてくれるようになる

Go 言語で作成されたメモ専用コマンドが便利そうだったので VS Code との連携を考えて見た。

きっかけはこの tweet。

<html>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">書いた。 / “Big Sky :: golang でメモ専用コマンド「memo」作った。” <a href="https://t.co/qpHOgECZjZ">https://t.co/qpHOgECZjZ</a></p>&mdash; Vim芸人 (@mattn_jp) <a href="https://twitter.com/mattn_jp/status/829184580590632964">2017年2月8日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
</html>

VS Code にもメモを取れる [vscode-journal](https://marketplace.visualstudio.com/items?itemName=pajoma.vscode-journal) という拡張機能があるけど、これをもう少し便利に使いたくって、ディレクトリツリーのビューアーなんて作ってみようかなとか思っていた。けど、memo を触って、それが吹っ飛んでしまった。

blog 記事にも、

>とても単純なコマンドなのです。やりたい事は単純です。
>
>* 即座にメモ取りを開始したい
>* Markdown で書きたい
>* 簡単に grep したい
>* シェルと融合したい
>* できれば jekyll っぽく markdown をサーブしたい

とても単純でした。

エディタ機能などは持たず、好きなエディタやセレクタを呼び出して使えるとのことで、エディタには VS Code (`editor = "code" または "code-insiders"`)を、コマンドラインセレクタには peco (`selectcmd = "peco"`) を用意した。

なにより素晴らしいのは、

- VS Code の terminal から `memo new` or `edit` 実行
- `memo` コマンドを実行した、同一 VS Code インスタンス上のタブにファイルが開かれる(エディタが開く)  
- しかも、入力した Title に .md をつけてくれる。そう、VS Code では自動的に Markdown mode で開く
- ついでにフォーカスも移動するので、作者の思いにある "すぐに書き始めることができる" ができる
- 人に見せたければ、VS Code の Markdown Preview でもいいし、`memo serve` を実行して Web ブラウザで見せればいい
- メモ取りからビューアーまで vscode の画面を何かに切り替えることなくできる

![memo.gif](https://qiita-image-store.s3.amazonaws.com/0/65800/231a3472-e39f-b800-1673-6688af306bfe.gif "memo.gif")


また、

- memo grep したら peco に食わせて、cut でファイル名と行番号をだけ抜き出して、code -g に渡すようにしておくと良い。選択したファイルの行番号指定でファイルが開かれるため、開けば目の前にそれがある的な感じになる

```
$ memo grep list | peco | cut -d : -f 1,2 | xargs code -g
```

感動した。

- あと、`memodir` を VS Code で開いて、[Project Manager](https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager) のような拡張機能に登録してフォルダを開けるようにしておけばいい
- `editor = "code -n"` とかにして、新規インスタンスで開ける(少し遅い)
- `editor = "code -w"` とかにして、新規インスタンスで開いて、エディタを閉じるまでプロンプトを返さないというのもありなのかな(こちらも新しインスタンスをあげるので少し遅い)


>**update したら、修正されてた。やったね:** <S>memo edit して一覧を表示させたあと、ファイルを選択せずに `esc` key などでキャンセルすると、memodir に設定されたディレクトリが VS Code で開かれてしまう。まぁいっか。(同一フォルダを複数インスタンスで開くことはできない仕様なので、2 つめは上がってこない)</S>

## tips

ターミナルは、パネルビューへの配置になるので、キーバインドに下記の `workbench.action.toggleMaximizedPanel` を仕込んでおけば好きなときに拡大/縮小を切り替えらます。

```json
    {
    "key": "ctrl+shift+f", 
    "command": "workbench.action.toggleMaximizedPanel",
    }
```

エディタとターミナルのフォーカス移動は、下記のようなキーバインドを仕込めば擬似的な toggle 操作感を得ることができます。 

```json    
    ,{
    "key": "ctrl+shift+n",
    "command": "workbench.action.terminal.focus",
    "when": "editorFocus"
    }
    ,{
    "key": "ctrl+shift+n",
    "command": "workbench.action.focusActiveEditorGroup",
    "when": "terminalFocus"
    }
```

### 参考

* [“Big Sky :: golang でメモ専用コマンド「memo」作った。](http://mattn.kaoriya.net/software/memo.htm)

### Solaris だと。。。

Solaris 11.3 上の go 1.5 だと、これを乗り越える必要ありなので、適当な時にチャレンジしてみる。

```
# github.com/mattn/go-tty
src/github.com/mattn/go-tty/tty_unix.go:33: undefined: syscall.SYS_IOCTL
src/github.com/mattn/go-tty/tty_unix.go:33: undefined: ioctlReadTermios
src/github.com/mattn/go-tty/tty_unix.go:39: undefined: syscall.SYS_IOCTL
src/github.com/mattn/go-tty/tty_unix.go:39: undefined: ioctlWriteTermios
src/github.com/mattn/go-tty/tty_unix.go:52: undefined: syscall.SYS_IOCTL
src/github.com/mattn/go-tty/tty_unix.go:52: undefined: ioctlWriteTermios
src/github.com/mattn/go-tty/tty_unix.go:58: undefined: syscall.SYS_IOCTL

# github.com/shurcooL/github_flavored_markdown/gfmstyle
src/github.com/shurcooL/github_flavored_markdown/gfmstyle/assets_vfsdata.go:136: undefined: io.SeekStart
src/github.com/shurcooL/github_flavored_markdown/gfmstyle/assets_vfsdata.go:138: undefined: io.SeekCurrent
src/github.com/shurcooL/github_flavored_markdown/gfmstyle/assets_vfsdata.go:140: undefined: io.SeekEnd
src/github.com/shurcooL/github_flavored_markdown/gfmstyle/assets_vfsdata.go:181: undefined: io.SeekStart
```

(動く peco バイナリはあるが、どうやって作ったか思い出せない・・・