Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

dotfilesを作るときのOS別対応をする

この記事は東北大学 計算機科学研究会 Advent Calendarの6日目の記事です。

僕の場合、実家のPCがMacで手元のパソコンがUbuntu、さらにConoHaでCentOSを借りているので色々と問題が生じているわけです。今回はそんな中で工夫してみたことを書いてみようと思います。

あと本題に関係ないですが、アドベントカレンダーはノリで埋めちゃだめですね。すでに息切れしてます。

ローカルの設定ファイルを作る

これが結構役に立ちます。たとえば.zshrc.localconfig.local.fishなどです。これらを.zshrcなどから呼び出すようにしておくと、とても楽になります。

例えば、環境変数のVIMの値はだいたいどのOSも異なっています。バージョンが違ったり、ディレクトリが異なったりします。そんなときには.zshrc.localに書き込んでしまえばOKです。

ローカル設定ファイルはGitでの管理対象外となります。そのため、シンボリックリンクを貼るのではなく、直で生成してOKです。

こんな感じで読み込みます。

if [ -f ~/.zshrc.local ]; then
    source ~/.zshrc.local
fi

fishの場合もほぼ変わりません。

if [ -f ~/.config/fish/config.local.fish ]
    source ~/.config/fish/config.local.fish
end

.tmux.confの場合

tmuxでもローカルで対応すべきところがありました。それはコピーモードの部分です。コピーした内容をクリップボードへ移すためのコマンドがそれぞれ異なるためです。調べたところ、if-shellを使えばtmuxでも条件分岐ができるそうです。

if-shell "type pbcopy >/dev/null 2>&1" "bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'reattach-to-user-namespace pbcopy'"
if-shell "type xsel >/dev/null 2>&1" "bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xsel -ip && xsel -op | xsel -ib'"
if-shell "type xclip >/dev/null 2>&1" "bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -i -sel clip > /dev/null'"

何をしているかというと、pbcopyが存在する場合はpbcopyを、xselがある場合はxselを使う、というだけです。type xsel >/dev/null 2>&1というおまじないでxselが存在するか判定しています。

.npmrc

npmrcのどこに環境ごとに違うところがあるの?と思われるかもしれません。実際、環境ごとに異なるわけではありません。が、公開するとマズいデータが混じっているのでそれを隠匿する方法を紹介します。

npmrcは(npm publishしたりしてると)次のような行があります。

//registry.npmjs.org/:_authToken=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

このauthToken、当たり前ですが流出させるとマズいです(←過去に3回ほど流出させた人)。しかし、このファイルには他にも色々な設定が含まれているのでdotfilesで管理したいです。

そこで、公式サイトでも提案されているとおりにこの部分を環境変数に置き換えます。

//registry.npmjs.org/:_authToken=${NPM_TOKEN}

しかしながら、この環境変数を管理するのは当然zprofileなどprofileファイルです。「zprofileもdotfilesで管理しているんだから流出するじゃないか!」と思われるかもしれません。ご安心ください。ここで先程のローカル設定ファイルが活きてきます。

ローカルファイルはdotfilesの管轄外なので、間違えてGitHubにあげてしまう事故を防げます。ローカルに分割するとなにかと便利ですね。

NeoVim編

NeoVimでは事実上g:python_host_progを設定しなければならないのですが、これがpythonのパスなので環境ごとに異なります。そこで、init.nvim にpython のpath を指定してneovim の起動速度を早くする - Qiitaを参考にして設定します。なお、僕自身はPythonはあまり使っておらずpyenvを導入していないのと、fishを使っている関係((fishでは変数展開は$(HOGE)ではなく(HOGE)です))で次のようになりました。

let g:python_host_prog  = system('echo -n (which python)')
let g:python3_host_prog = system('echo -n (which python3)')

終わりに

いうほどOS別ではありませんでした。