動機
Project Managerでプロジェクトの管理をしているが、Visual Studio Code自体を起動する時、ついでにプロジェクトを開くことができない。
起動してからプロジェクトを開くのがめんどいので、直接開いて欲しい。
プロジェクトデータの実態
C:\Users\<ユーザー名>\AppData\Roaming\Code\User\projects.json
に格納されている。
実装例
アクセス方法
fenrirで検索できるよう、各プロジェクトをひとつのフォルダにまとめる。
Windowsショートカットとかシンボリックリンクでもいいのだが、今回はEnterだけでVisual Studio Codeを起動できるよう、「Visual Studio Codeで指定フォルダを開く」ショートカットとする。
jq
jsonファイルの処理にはjqを使う。
コマンドプロンプトでプロジェクトパスの一覧を作成
マルチルートプロジェクトが混じってると面倒だが、とりあえずそれは考えないで、1プロジェクト1ルートだとしてパスの一覧を作成する。
jqはutf-8で書かれているので、chcp
でコードページをutf-8に変更しないと動作しない……とのこと。
cd %USERPROFILE%/AppData/Roaming/Code/User
chcp 65001
cat projects.json | jq -r ".[].rootPath" > projects.txt
これで、各プロジェクトのルートパスが記述されたテキストファイルができる。
AutoHotKeyでショートカットを作成
一覧作成も併せて行う。
; コマンドプロンプトを、カレントディレクトリが%USERPROFILE%/AppData/Roaming/Code/User、非表示で実行
Run, cmd /c chcp 65001 && cat projects.json | jq -r ".[].rootPath" > projects.txt, %USERPROFILE%/AppData/Roaming/Code/User, Hide
DestDir = %USERPROFILE%\Projects ; ショートカットを置くディレクトリを指定
editor = C:\Program Files\Microsoft VS Code\Code.exe
If not FileExist(DestDir) ; ディレクトリが存在しなければ作成する
FileCreateDir, %DestDir%
Loop, Read, projects.txt ; プロジェクト一覧からショートカットを作成する
{
SplitPath, A_LoopReadLine, OutFileName, OutDir
FileCreateShortcut, %editor%, %DestDir%\%OutFileName%.lnk, %OutDir%, %A_LoopReadLine%, , ,
; [note]
; すでに存在する場合は上書きされる
}
AutoHotKeyで自動実行
上記を自動的に実行するようにする。
SetTimer, OnTimer, 300000 ; ミリ秒/5分ごとにタイマーサブルーチンを実行
Return
OnTimer:
; 20分 以上操作を行っていなければ
If ( A_TimeIdlePhysical > 1200000 )
{
Run, ProjectManager.ahk ; この場合A_WorkingDirからの相対パス
}
Return
これでプロジェクトごとのショートカットが作成される。
問題
ところが、なぜかショートカット作成時にVisual Studio CodeのパスがC:\Program Files\Microsoft VS Code\Code.exe
ではなくC:\Program Files (x86)\Microsoft VS Code\Code.exe
と誤って登録されてしまう。
試しに、単純にRun
してみても起動しない。どうもAutoHotKeyの一部コマンドでC:\Program Files
を含むパスが勝手にC:\Program Files (x86)
に変換されているような感じ。
色々試したが解決しなかったので、暫定的にC:\Program Files\Microsoft VS Code
からC:\Program Files (x86)\Microsoft VS Code
へシンボリックリンクしておくことにした。
mklink /d "C:\Program Files (x86)\Microsoft VS Code" "C:\Program Files\Microsoft VS Code"
気味は悪いが、いちおう動作するようになった。