Windows
Node.js
TypeScript
webpack
hyper

Hyperターミナルの設定ファイルをWindows/Macで共通化してGit管理する

オープンソース・クロスプラットフォームのターミナルエミュレータHyperがバージョンアップにより日本語に対応してたので、使ってみようと思いました。
参考: Hyperでイケてるターミナルをつかおう - Qiita

使うにあたり、クロスプラットフォームという利点を最大に活かすためには設定ファイルのプラットフォーム間でのGit管理が必要ですので、しました。

環境

  • hyper 2.0.0 stable
  • Windows 10 Pro 17133.1 (April 2018 Update)
  • macOS High Sierra 10.13.4

WindowsとMacの設定を共通化する

※単一のプラットフォームでしか使わない場合は読み飛ばしてください。

hyperの設定ファイル.hyper.js自体はプラットフォーム毎で共通形式となっています。同一のファイルを使うことで、フォントやテーマなどをWindowsとMacとで共通化して使うことができます。

デフォルトの設定ファイルはこんな感じ: https://github.com/zeit/hyper/blob/canary/app/config/config-default.js

ですがconfig.showHamburgerMenuのように「WindowsとLinuxでは有効だが、Macでは無視される」といった、プラットフォーム間で挙動の異なる設定値がいくつか存在します。
特にターミナルの肝である起動シェルを指定するconfig.shellについては、Windowsの場合はコマンドプロンプトか、PowerShellか、Windows Subsystem for Linux(Bash on Windows)なのかを明記しなければなりません。つまり、Linux/Macと設定を共通化することができません。

そこで、.hyper.jsを読み込んでWindows用とMac用とのファイルを書き出すスクリプトを作成してみました。無駄にTypeScript+Webpackです。

プラットフォーム別の設定ファイルを書き出すTypeScript

https://github.com/s2terminal/hyper-usersetting

index.ts
import * as fs from "fs";
import * as path from "path";
const PreferencesDirectory = "hyperjs_preferences";
enum Platforms {
  Windows = "windows.js",
  Mac = "other.js"
}

interface IHyperJS {
  // TODO
  config: {
    shell: string;
  };
}

function writeHyperJS(name: string, data: IHyperJS) {
  const filepath = path.join(process.cwd(), PreferencesDirectory, name);
  fs.writeFile(
    filepath,
    `module.exports = ${JSON.stringify(data, null, 2)};`,
    err => {
      if (err) {
        throw err;
      }
    }
  );
}

function generatePreference(hyper: IHyperJS, platform: Platforms): IHyperJS {
  if (platform === Platforms.Windows) {
    hyper.config.shell = "C:\\Windows\\System32\\bash.exe";
  } else {
    hyper.config.shell = "";
  }
  return hyper;
}

import * as hyperjs from "./.hyper.js";

// Bash on Windows
writeHyperJS(Platforms.Windows, generatePreference(hyperjs, Platforms.Windows));
// Others
writeHyperJS(Platforms.Mac, generatePreference(hyperjs, Platforms.Mac));

.hyper.jsを読み込んで、config.shellの値だけをプラットフォームごとに書き換えた別々のファイルとして出力します。
使いたい設定やプラグインを盛り込んだ.hyper.jsを作成し、特定の項目をプログラムで書き換えた設定ファイルを書き出して、これをプラットフォームごとに使い分けます。こうすることで、プラットフォーム間で共通の設定を利用することが出来ます。

process.platformで現在実行しているプラットフォームがWindowsかMacかを動的に判別しようかと思ったのですが、Windows Subsystem for Linux上で実行するとLinuxとなってしまうので諦めました。

設定ファイルを配置する

基本的な手順は下記のとおりです。

  1. 設定ファイル.hyper.jsをGit管理し、GitHub等にpushする
  2. hyperターミナルを起動している場合は、終了しておく ※設定ファイルが自動で再生成されてしまうため
  3. cloneしたGitリポジトリ内の設定ファイルに向けて、シンボリックリンクを貼る

Windowsの例

PowerShellを管理者権限で開き、下記を実行します。

PS > rm "C:\Users\$(Get-Content env:username)\.hyper.js"
PS > cmd /c mklink "C:\Users\$(Get-Content env:username)\.hyper.js" "(※Windows用の設定ファイルのありか)"

Macの例

Terminalで下記を実行します。

$ rm "$HOME/.hyper.js"
$ ln -s "$(pwd)/hyperjs_preferences/other.js" "(※Mac用の設定ファイルのありか)"

関連