[WSL]macOSのopenのようなものとエクスプローラのディレクトリにcdするコマンド

**2019/11/03 実装を大きく変更したので記事の内容を大幅に変更しました。**
**2019/11/10 さらに[機能強化](https://qiita.com/ko1nksm/items/e6f6d8c7e69d8a013873)しました。**
**2020/01/13 [検索機能](https://qiita.com/ko1nksm/items/1591b612b9653c8f43cd)に対応しました。**

こちらのネタの Windows 版です。

* [fcd - Script factory](http://www.script-factory.net/software/terminal/fcd/index.html)
* [[MacOS] TerminalでFinderのカレントディレクトリにcdするワンライナー](https://qiita.com/Yuhsak/items/a1f154f14e5ff871b6d2)

たまたま見つけまして、これ WSL でも使えたら便利じゃね？ってことで作ってみました。 → [eopen-ecd](https://github.com/ko1nksm/eopen-ecd)
WSL ターミナルがメインですが PowerShell と コマンドプロンプトでも使用できます。

`fcd` のクローンから初めたプロジェクトだったのですが、macOSの `open` コマンド相当の機能をオマケで追加したら、そちらのほうが機能が大きくなったのでメインの機能を `eopen` として `ecd` も付属するという形に~~なっています。~~しましたが、`ecd`も機能強化したので合わせて一つのプロジェクトです。

## 使用例

### `eopen`

macOS の `open` コマンド相当のもので、ターミナルからエクスプローラを起動します。ファイルや URI 指定した場合は関連付けされたアプリが起動します。（PowerShell 版とコマンドプロンプト版は未実装のため、`explorer.exe` を代わりに使用してください。大体の機能は一緒なので別にそれほど困らないはず・・・。）

```
# Open directory with (latest used) Explorer
eopen ~/.config/

# Open directory with new instance of Explorer
eopen -n ~/.config/

# Opens with Windows default application
eopen image.png

# Opens with Windows text editor
eopen -e ~/.bashrc

# Use sudo to edit the unowned file
eopen -e --sudo /etc/hosts

# Opens with Windows default browser
eopen http://google.com

# Open files and directories under Windows
eopen C:/Windows

# Open files and directories under Network shared folder
eopen //server/shared

# Others
eopen mailto:user@example.com   # Mail protocol
eopen calculator:               # Application
eopen shell:Personal            # Shell commands
eopen :MyComputerFolder         # Shorthand for shell:
eopen shell:::{2559a1f8-21d7-11d4-bdaf-00c04f60b9f0} # CLSID
eopen :                         # Current Explorer location
eopen :/workspace               # Relative path from current Explorer location
```

### `eclose`

（最後に操作した）エクスプローラをターミナルから終了します。


### `ewd`

（最後に操作した）エクスプローラの現在のディレクトリをターミナルに出力します。

### `ecd`

~~エクスプローラの現在のディレクトリにターミナルのカレントディレクトリを変更します。`fcd` のクローンです。~~
ターミナルのディレクトリ変更と同時にエクスプローラのディレクトリも変更します。書式は変わりましたが、`ecd :` で以前と同じくエクスプローラの現在のディレクトリに移動することもできます。

```
# Change the directory to the '/etc'. (Both Terminal and Explorer)
ecd /etc

# Change the directory to the 'C:\Windows'. (Both Terminal and Explorer)
ecd c:/windows

# Change the directory to the current Explorer location.
ecd :

# Change the directory to the 'workspace' from current Explorer location.
ecd :/workspace

# Change the directory to the home directory.
ecd

# Change the directory to the Windows home (%USERPROFILE%) directory. (WSL only)
ecd ~~

# Change the directory to the ~~ directory instead Windows home directory.
ecd ./~~
```

### `epushd` / `epopd`

`cd` の代わりに `pushd` を使用して移動します。 `epopd` で戻ることができます。

## 導入方法

[リリースページ](https://github.com/ko1nksm/eopen-ecd/releases) から適切な zip ファイルを適当なディレクトリに展開し、シェルのプロファイルに設定すれば使えます。例えば `bash` の場合は以下の一行を `.bashrc` に追加します。（パスは展開したディレクトリに変更してください。）

```sh
eval "$(sh "/path/to/eopen-ecd/init.sh")"
```

`bash` 以外にも `zsh`, `ksh`, `mksh`, `yash`, `tcsh`, `fish` に対応しています。さらに PowerShell と コマンドプロンプトにも対応しています。それぞれの導入方法はプロジェクトページを参照してください。

## さいごに

初期バージョンはカジュアルな感じでメイン機能を PowerShell スクリプトで実装していたのですが、コマンド実行に時間がかかり反応速度が悪いので VC++ でガッツリと再実装してしまいました。これにより 400ms 以上かかっていたのが 100ms 程度と高速化しコマンド打ってから反応が返ってくるまでワンテンポあったのが即座に実行してるように感じられるようになりました。

`eopen` の類似のツールとしては [wsl-open](https://github.com/4U6U57/wsl-open) 等が有名だと思うのですが、`eopen` はWindows 10 1903 以降の `//wsl$/` で始まるパスでも問題なく動作するので Linux 内のファイルも表示したり権限があれば編集できます。`sudo` 権限が必要なファイルの編集にも対応しており、`/etc` 以下のファイルを Windows のテキストエディタで修正することもできます。（一時的に `/tmp` 以下にユーザー権限でコピーして `sudo` を使って書き戻しています。）


**類似の記事**

* [WSLでmacのopenコマンドみたいなこと](https://qiita.com/chez_sugi/items/603a0ba8016aaae9ef98)
* [WSL 上でMacのopenコマンド (/mnt/c以下のファイルも開きたい)](https://qiita.com/szkny/items/9bdfe67d1c7d23856261)
* [windowsのwsl上でopenコマンド](https://qiita.com/sh0510/items/4dc645c3a47c07e49c0f)
* [WSL から open](https://qiita.com/aohmusi/items/a46e3267ab506cedd1ad)