Windowsでdotfilesの世界をパクリんぐする

アドベントカレンダーに参加しています。 dotfiles Advent Calendar 2019 Windowsでdotfilesの世界をパクリんぐする話をします。 Windowsにおける設定情報 Windowsにおいては昨今、設定情報はかなり混沌と設定している、今となってはレガシー化しつつある、レジストリ情報に加えて、*NIX風のdotfilesをUser Profileの直下に置くパターンなどいくつものパターンがある。一旦、整理してから話を進めたい。 レジストリ情報 dotfilesの方向性としては異なるが整理のため、触れることにする。レジストリ情報はHKEY_LOCAL_MACHINEなど各種の階層で格納されているが一般にユーザごとの情報はHKEY_USERSの下にあり、実際にはそれがHKEY_CURRENT_USERにリンクされているものと考えられる。ただ、これは知っての通りバイナリデータとしてユーザにはコントロールしにくい形で存在していること、また、dotfilesの形とは言い難いため議論はここまでとする。 User Profilesの下に置かれるdotfiles User ProfileはデフォルトのインストールではUsers\<ユーザ名>に置かれるファイル群である。この中にはHKEY_USERSに置かれているレジストリも含まれている。昨今では特に*NIXからポーティングされたツールを中心にここに.で始まるファイルや_などで始まるファイル群を展開するものが散見される。例えば、scoopでvimをインストールした場合、_vimrcはUser Profileの直下に格納される。 User ProfileのAppData以下 User Profileには一般にAppDataとDocumentsが格納されている。標準的なデザインとしてはユーザにその存在を認識させるファイルはDocumentsにその存在を認識させなくてもいいファイルをAppDataに格納し、さらにAppDataの中で移動プロファイルでローミングするファイルはRoamingにマシン固有のファイルはLocalに置かれることになっている。例えば、ConsoleZの設定情報はAppData内のRoamingにConsole\console.xmlという形で格納されている。また、Visual Studio Codeの設定情報はRoamingのcode以下に格納されている。 UWPのLocalState 狭義のUWP (U先のniversal Windows Platform)アプリケーションにおいては、先のAppDataのLocalの下にあるPackagesディレクトリの下にアプリケーションごとにディレクトリを作成しその中にある、LocalStateディレクトリ内に格納されることが多い。たとえば、WindowsTerminalにおいては、少なくとも現時点においてはPackages内のMicrosoft.WindowsTerminal_8wekyb3d8bbweディレクトリにLocalStateが存在している。 WSL WSL1の場合は、ファイル群はdevfsとdrvfsと考えられるが、一般にdevfsの構造はWindowsから見ると深いディレクトリに置かれていること、また、Windows側からdevfsのファイルを操作すると、metadataを損壊することになるため、注意を要する。従って、WSLの設定情報については現状、Windowsのdrvfsにレポジトリをおいて、適時シンボリックリンクを張っているが、後述する、Windows上でのgitの特性から、WSL上で独自にdotfilesをコントロールしたほうがいいかもしれない。 dotfilesによる設定情報のコントロール dotfilesでコントロールしやすいもの 先までに上げたものの中で、dotfilesによるコントロールに適するのは基本的にはレジストリを除いたものであると考えられる。レジストリはバイナリデータとして格納されているため、*NIX的な管理はし辛い。 dotfilesによるコントロールのサンプル dotfiles風にコントロールの容易なものとして、以下に例をあげる。 vimrc Windows Terminal git nyagos ConsoleZ WSLのdotfiles これらを分類すると以下のようになる。 名前 種類 vimrc User Profile Windows Terminal UWP LocalState git User Profile nyagos User Profile ConsoleZ AppData WSL dotfiles WSL シンボリックリンクの活用 レポジトリから各ファイルへはシンボリックリンクを用いる。シンボリックリンクは開発者モードでは一般ユーザでも作成できる。ただし、開発者モード以外ではシンボリックリンクの作成には管理者特権が必要であるため、シンボリックリンクの構築スクリプトをPowerShellで作る場合、以下のような構造になるであろう。 $userProfile = $env:USERPROFILE if($PSVersionTable.PSVersion.Major -gt 4) { if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(` [Security.Principal.WindowsBuiltInRole] "Administrator")) { } else { Write-Warning "管理者権限が付与されていません" exit 1 } } else { Write-Warning "PowerShellのバージョンが条件を満たしていません" } PowerShellのバージョンを確認するのはPowerShellでシンボリックリンクが作成できるようになったのは、Windows PowerShell 5.xからであり、それ以下の場合には構築できないだけでなく、削除をした場合にリンクが削除されるだけでなく元のファイルまで消えてしまうためである。したがって、バージョンを確認する必要がある。 ...

12月 24, 2019 · 2 分 · 382 文字 · Me

dotfilesの世界をパクってみた

はじめに ようこそdotfilesの世界へを参考に、Windows上での環境整備を始めてみた。ツールとしては、gitとCMD Batch、robocopyを使用。ディレクトリ構造としてはいったんこのような構造で。 Backgrounds Icons Scripts dot WindowsTerminal ConsoleZ BackgroundsはWindowsTerminalの壁紙を格納、%USERPROFILE%のPictures\Backgroundsに展開。IconsはWindowsTerminalのアイコンを格納、%USERPROFILE%のPictures\Iconsに展開する。Scriptsは環境の展開用のCMD Batchを格納している。dotには%USERPROFILE%以下に展開される、ドットファイルを格納。ConsoleZとWindowsTerminalはそれぞれ、ConsoleZとWindows Terminalの設定ファイルを格納してる。 現在の、deploy.batはこのような内容。 copy ..\WindowsTerminal\profiles.json %USERPROFILE%\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\profiles.json copy ..\ConsoleZ\console.xml %USERPROFILE%\AppData\Roaming\Console\console.xml copy ..\dot\.nyagos %USERPROFILE%\.nyagos robocopy ..\Backgrounds %USERPROFILE%\Pictures\Backgrounds /e robocopy ..\Icons %USERPROFILE%\Pictures\Icons /e

12月 8, 2019 · 1 分 · 30 文字 · Me