【VSCode】Markdown用のCSSファイルをWindowsとLinuxで共有する

以前に[Gitを使ってVSCodeの設定を複数の環境で使いまわす(Win/Linux)](https://qiita.com/WGG_SH/items/366552ede044618f4063)という記事を書きました.

しばらくVSCodeを使い続けていた所,Markdown周りの機能が便利に感じたのですが,cssを設定しようとすると前回のやり方では問題が生じました.
例によってWindowsとLinuxしか試していません.Macでの方法について調べてくださる方がいますと助かります.

# 使用した拡張機能
* [Markdown PDF (yzane.markdown-pdf)](https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf)
  * Markdownファイルをpdf,html,pngなどに変換できる拡張機能です
* [Markdown Preview Enhanced (shd101wyy.markdown-preview-enhanced)](https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced)
  * Markdownのプレビュー機能を拡張します,[こちらの記事](https://qiita.com/kitfactory/items/2fde799fa092f0d8f0f1)が詳しいです

# 発生した問題点
* ```markdown.styles```,```markdown-pdf.styles```,及び```Markdown Preview Enhanced```のCSSへのパスがWindowsとLinuxで共通化しづらい  
```markdown-pdf```の[リファレンス](https://github.com/yzane/vscode-markdown-pdf/blob/master/README.ja.md#styles-options)やVSCodeのFAQを確認した所,VSCodeにおける外部ファイルへのパスは

1. 開いているファイルからの相対パス
1. フォルダを開いていれば,ルートフォルダからの相対パス
1. ワークスペースを開いていれば,各ルートフォルダからの相対パス

となっているそうです.その為,以下のように記述した場合は,

```json:settings.json
{
  "markdown.styles": [
    "styles.css",
  ],
}
```

開いているファイルやフォルダと同ディレクトリ内にcssファイルが存在しなければ適用することが出来ません.
また,次のような環境変数を用いたパス指定も使用できませんでした

```json:settings.json(Windows)
{
  "markdown.styles": [
    "C:\\Users\\%USERNAME%\\styles.css",
  ],
}
```

```json:settings.json(Linux)
{
  "markdown.styles": [
    "${HOME}/styles.css",
  ],
}
```

また,オンライン上のファイルを指定する場合,```markdown-pdf.styles```ではpdf変換時に正しく反映されないようです

```json:settings.json(Windows/Linux)
"markdown-pdf.styles": [
  "https://xxx/markdown-pdf.css", // 一部しか適用されなかった
],
```

ユーザー名を含んだ絶対パスを直接記述することも可能ですが,前回の記事よりGitHubで管理するのであればなるべくそういった情報は含めないようにしたいです.
クローン後にシェルスクリプトでこの部分を追記する手法も考えたのですがGitHubにあげている```settings.json```が不完全になっている事が気に入らなかったので却下しました.

# 解決案
## 1. ```markdown.styles```,```markdown-pdf.styles```
```~/``` を用いた場合,ホームディレクトリからの相対パスを指定することが出来ました.

```json:settings.json(Windows/Linux)
{
  "markdown.styles": [
    "~/styles.css",
    // "C:\\User\\%USERNAME%\\styles.css", Windowsでの解釈
    // "/home/${USERNAME}/styles.css", Linuxでの解釈
  ],
}
```

そして,ホームディレクトリからの相対パスが同じになるようにWindows/Linuxそれぞれでシェルスクリプトを作成します.
[前回の記事](https://qiita.com/WGG_SH/items/366552ede044618f4063)で作成したwindows.bat/linux.shに追記していきます

```bat:windows.bat
rem CSSファイルのリンクを生成
mklink /H  C:\Users\%USERNAME%\styles.css %CD%\styles.css
```

```sh:linux.sh
# cssファイルのリンクを作成
ln -s "`pwd`/markdown_pdf.css" ${HOME}/markdown_pdf.css
```

Windowsでは,シンボリックリンクでは動作せず,ハードリンクにする必要があったので```/H```オプションを使用しています.

## 2. ```Markdown Preview Enhanced```のプレビュー機能
.mdファイルを開いている時に```Ctrl+K```→```V```で開くことができるリアルタイムプレビュー機能ですが```Markdown Preview Enhanced```を導入していると,そのcssは```~/.mume/style.less```内で指定することが出来ます.
.lessの仕様に詳しく無いので合っているかわかりませんが,こちらは```~/```を用いたホームディレクトリからの相対パスが使用できなかったので,Gitでの追跡をせず,このファイルに直接シェルスクリプトで追記させるようにしました.この手法はあまり良くないと思うので他にいい方法が無いかまた調べてみます.

```bat:windows.bat
rem Markdown Preview Enhancedのcssファイルへのリンクを追記
echo @import url("C:/Users/%USERNAME%/styles.css");>>"C:\Users\%USERNAME%\.mume\style.less"
```

```sh:linux.sh
# Markdown Preview Enhancedのcssファイルへのリンクを追記
echo "@import url(\"${HOME}/markdown_pdf.css\");" >> ~/.mume/style.less
```

# まとめ
とりあえずはこれでWindowsでもLinuxでも,前回通りに`git clone`から一度シェルスクリプトを実行することでMarkdown関連(正確にはローカルファイルを指定するオプション周り)の設定を実現することができました.
現在自分のVSCodeの設定間利用リポジトリは[このように](https://github.com/WGGSH/vscode-setting)なっています.便利な機能や拡張機能がありましたら,教えてくださると助かります.