motemen さんの ターミナルの作業中ディレクトリにOSの「ファイルを開く」からもアクセスしたい を見ていいなと思ったので自分もやってみた。ただ、WSL 内で動く tmux の作業ディレクトリを Windows 側に同期したいので、若干ややこしいことをすることになる。
以下のように wsl-update-cwds をつくる。
is_wsl = ENV.has_key?('WSLENV')
if !is_wsl
exit 0
end
PWSH = '/mnt/c/Program Files/PowerShell/7/pwsh.exe'
dirs = `tmux list-windows -F '\#{pane_current_path}'`.split("\n").uniq
command = <<~CMD
$WshShell = New-Object -COMObject WScript.Shell
function Create-Shortcut($targetPath, $shortcutPath) {
$Shortcut = $WshShell.CreateShortcut($shortcutPath)
$Shortcut.TargetPath = $targetPath
$Shortcut.Save()
}
Remove-Item -Path $env:USERPROFILE/cwds/*.lnk
CMD
dirs.each do |dir|
basename = File.basename(dir)
win_path = `wslpath -aw '#{dir}'`.chomp
command << "Create-Shortcut '#{win_path}' $env:USERPROFILE/cwds/#{basename}.lnk\n"
end
pid = spawn(PWSH, '-NoProfile', '-NoLogo', '-Command', command)
- tmux から作業ディレクトリをひっぱってくる
- wslpath コマンドで Windows 側のパスに変換する
- ↑の情報から PowerShell のコードを生成し、pwsh でショートカットとして生成する
なんでショートカットなのか? というと Junction だと UNC パスにリンクを貼れず、Symlink だと管理者権限が必要になって嫌なので、ほかに方法がない。
あとは zsh の chpwd フックで実行させる。WSLENV 環境変数を見て、存在しないなら実行しないように
chpwd () {
if [[ -n "${WSLENV+x}" ]]; then
$HOME/dotfiles/bin/wsl-update-cwds
fi
}
- トップ
-
tech
-
(zsh/tmux/WSL) ターミナルの作業中ディレクトリにOSの「ファイルを開く」からもアクセスしたい