iTerm2でタイムスタンプ付きのログの出力とpreztoのインストールを行う。

# はじめに
普段使っている`iTerm2`の設定を改めて行おうと思った際、以前設定したときのやり方を完全に忘れていたので、次にクリーンインストールなどを行う際に備えて手順を残しておこうと思います。

※2023/03/12 EC2・Linux向けの記事も書きました。

- 【次】[EC2・Linuxでpreztoを全ユーザで使えるようにする。](https://qiita.com/sakai00kou/items/12806386766251c4bbd6)

# iTerm2でタイムスタンプ付きのログを出力
`iTerm2`のログ出力設定は`iTerm2`のメニューから「**Settings**」→「**Profiles**」の「**Session**」タブから行えます。

職場の同僚に聞くとタイムスタンプ付きのログが出力されていないと言っていた人もいたので以前はデフォルト値が違っていたのかもしれませんが、最新版であれば「**Automatically log session input to files in:**」をチェックしてログの出力ディレクトリを指定し、「**Log plain text**」をチェックしてログの表示を見やすくすることで以下のログ出力例のようにタイムスタンプ付きで表示されるかと思います。

![Monosnap_20230223_183912.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/27f5c757-515a-63f2-7e1a-fcbd2bba1f7a.png)

```bash:タイムスタンプ付きのログ出力の例
[2023/02/05 10:48:24.675 AM] Last login: Sun Feb  5 10:47:35 on ttys001
[2023/02/05 10:48:24.763 AM]    ~  ssh -l ec2-user -i ~/keypair/test.pem xx.xx.xx.xx
[2023/02/05 10:48:27.521 AM] Last login: Sun Feb  5 01:47:39 2023 from xxxx.xxxx.xx.xx.jp

[2023/02/05 10:48:27.521 AM]        __|  __|_  )
[2023/02/05 10:48:27.521 AM]        _|  (     /   Amazon Linux 2 AMI
[2023/02/05 10:48:27.521 AM]       ___|\___|___|

[2023/02/05 10:48:27.521 AM] https://aws.amazon.com/amazon-linux-2/
[2023/02/05 10:48:27.521 AM] 14 package(s) needed for security, out of 14 available
[2023/02/05 10:48:27.521 AM] Run "sudo yum update" to apply all updates.
[2023/02/05 10:48:27.545 AM] [ec2-user@ip-10-1-0-29 ~]$ exit
[2023/02/05 10:48:28.784 AM] ログアウト
```

もし、上記の設定を行ってもタイムスタンプが表示されない場合は、「**Advanced**」の検索ボックスに「**timestamp**」と入力することで以下「**Session**」の項目が表示されるので、「**When logging plain text, include timestamps for each line?**」を「**Yes**」にします。

![Monosnap_20230223_184628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/77a4dda2-b513-5c07-61b9-8390cdb2bd79.png)

もちろん、「**No**」にすることでタイムスタンプ表示を行わないようにすることもできるので、タイムスタンプを表示させたくない場合は「**No**」としてください。

# ウィンドウの右側にタイムスタンプを表示
上記の「**Profiles**」→「**Session**」タブから「**Show timestamps**」の設定を変更することで、ウィンドウの右側にタイムスタンプを表示させることができます。

![Monosnap_20230223_185800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/b3b3cc5c-ccf0-de9e-d99c-d71f96ad3025.png)

ずっと表示させておくこともできますが、タイムスタンプ分画面が狭くなるので、私は「**When mouse hovers over scroll bar**」に設定してマウスオーバーしたときだけ表示させるようにしています。

# preztoとは
現在の`MacOS`の標準シェルとなっている`zsh`のフレームワークとなり、テーマを変えることで、見栄えを変えたり操作感を変えたりすることができます。

`prezto`以外にも`zsh`のフレームワークは色々とありますが、`prezto`は他のフレームワークと比べて比較的軽量に動作するのと、`Git`の状態がひと目で分かること、また見栄えが良いテーマがあった（重要）ので常用しています。

![Monosnap_20230223_191455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/6ef7eeb5-cb2d-8bae-ac3a-62837ad94872.png)

以下`prezto`インストールとセットアップ手順です。

- [preztoのインストール](#preztoのインストール)
- [テーマの確認](#テーマの確認)
- [preztoのテーマとモジュールについて](#preztoのテーマとモジュールについて)
    - [syntax-highlighting](#syntax-highlighting)
    - [autosuggestions](#autosuggestions)
- [モジュールとテーマの変更](#モジュールとテーマの変更)
- [テーマの修正](#テーマの修正)
- [デフォルトエディタの変更](#デフォルトエディタの変更)

## preztoのインストール
GitHubに`prezto`のページがあるため、以下のGitHubページに沿ってインストールしていきます。

- [prezto](https://github.com/sorin-ionescu/prezto)

インストール手順通り、リポジトリをクローンします。

```bash:リポジトリのクローン
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

以下コマンドを実行し、`prezto`のディレクトリに既存の`zsh`各種構成ファイルのコピーとシンボリックリンクの設定を行います。

```
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

現在の`MacOS`のデフォルトは`zsh`なので以下は実行しなくても良いですが、以下でデフォルトのシェル設定を変更します。

```bash:デフォルトシェルの設定
chsh -s /bin/zsh
```

ウィンドウを開き直すことで`prezto`のデフォルトのテーマとなる`sorin`が適用され、以下の表示がされるかと思います。

![Monosnap_20230223_194226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/a6b06fbb-d115-38bb-ab8a-7bd585b9ad9c.png)

## テーマの確認
以下コマンドを実行することで、選択できるテーマの確認とそれぞれのテーマを選択した際の表示例が一覧で確認できます。

表示形式は後から変更することができるので、自分の好みに近いテーマを見つけます。

```bash:選択可能なテーマの確認
prompt -l
```

```bash:テーマ表示例の確認
prompt -p
```

以下、コマンド実行例。

![Monosnap_20230223_194924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/1d7a0b3f-8040-1a8e-50cf-d7b532d228ef.png)

## preztoのテーマとモジュールについて
ユーザのホームディレクトリに存在する`.zpreztorc`（実際には`/Users/[ユーザディレクトリ]/.zprezto/runcoms/zpreztorc`へのリンク）に適用する`prezto`のテーマと追加したいモジュールを設定します。

モジュールは設定することで短縮文字でコマンドが実行できたり、コマンド履歴から入力したいコマンドを補完してくれるオートサジェストが有効になったりするので自分の使い方に応じて使うモジュールを選択しましょう。

デフォルトで設定できるモジュールは以下`prezto`のモジュールディレクトリにあり、ここにあるものであれば`.zpreztorc`の所定の場所に名前を記載するだけで使用できます。

また、各モジュールディレクトリの`README`を見ると、どのような動きをするモジュールなのかがわかります。

- [prezto/modules](https://github.com/sorin-ionescu/prezto/tree/master/modules)

ここからは個人によって好みや有効にしたいモジュールが異なるため、私の例となりますが、私は`prezto`のテーマを`sorin`から`agnoster`に変更し、`syntax-highlighting`と`autosuggestions`、`git`モジュールを追加で設定しています。

モジュールはデフォルトで有効となっているモジュール以外にもたくさんありますが、あまり多くモジュールを読み込ませても動作が重くなるので、使うものだけ最低限にしたほうが良いです。

以下で私が追加したモジュールについて簡単に紹介します。

### syntax-highlighting
`syntax-highlighting`はコマンドの構文を強調表示してくれるモジュールでコマンドとオプション、引数など色分けして表示してくれるので可読性が増します。

プロンプトの画面を日頃多く眺めている人に便利です。

### autosuggestions
オートサジェストを行ってくれる`autosuggestions`モジュールは、イメージとしては`Cisco`等のネットワーク機器で実装されているタブキーによるコマンド補完と同じような動きをするモジュールで、途中までコマンドを入力すれば、コマンド履歴から薄い文字でサジェストしてもらえ、右キーを押すとサジェストされたコマンドが実行できる状態になります。

元々`Cisco`機器などをコマンドで触っていた人は離れられなくなるかもしれません（笑）

### git
Gitのリポジトリのステータス情報等を表示することができるモジュールです。

また、Git関連のエイリアスも提供されているため、Gitの各種情報をエイリアスから表示させたりもできます。

## モジュールとテーマの変更
以下設定箇所の抜粋となりますが、以下の箇所の設定を修正＆追記しています。

```bash:~/.zpreztorcの設定箇所の抜粋
（略）
# Set the Prezto modules to load (browse modules).
# The order matters.
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'git' \                        # 左記git追加
  'completion' \
  'syntax-highlighting' \        # 左記syntax-highlighting追加
  'history-substring-search' \
  'autosuggestions' \            # 左記autosuggestions追加
  'prompt'
（略）
#
# Prompt
#

# Set the prompt theme to load.
# Setting it to 'random' loads a random theme.
# Auto set to 'off' on dumb terminals.
#zstyle ':prezto:module:prompt' theme 'sorin'　　　　　　　　　　　　# デフォルトのsorin行をコメントアウト
zstyle ':prezto:module:prompt' theme 'agnoster'    # テーマをagnosterに変更

（略）
```

注意点として、追加するモジュールには指定の順序で適用しないといけないモジュールがあります。

指定の順序で適用しないといけないモジュールについては、各モジュールの`README`に書かれており、今回追加した`syntax-highlighting`、`autosuggestions`にもそれぞれのモジュールの`README`に以下のように記載されております。

以下は`syntax-highlighting`の`README`に記載されている内容抜粋。

>If this module is used in conjunction with the history-substring-search module, this module must be loaded before the history-substring-search module.
>
>Additionally, if this module is used in conjunction with the autosuggestions module, this module must be loaded before the autosuggestions module as well.
>
>To elaborate, the relative order of loading the modules would be syntax-highlighting, history-substring-search, autosuggestions and prompt.

`README`に記載の通り、以下の順で`.zpreztorc`に記載しています。

1. `syntax-highlighting`
2. `history-substring-search`
3. `autosuggestions`
4. `prompt` 

また`git`モジュールにも`completion`モジュールより前の指定があるので、`README`通りに指定しました。

## テーマの修正
`agnoster`のデフォルトでは`[ユーザ名]@[ホスト名] [ディレクトリパス]`の形式で表示されるので、階層が深いディレクトリを表示すると見づらいという点と、個人用途でリモートアクセスするようなことも無い中でユーザ名とホスト名の表示があっても邪魔なだけなので、`agnoster`のテーマが書かれているファイルを直接編集し、プロンプト表示に関わる箇所を書き換えました。

`agnoster`のテーマのプロンプト表示に関わる設定は`~/.zprezto/modules/prompt/functions/prompt_agnoster_setup`に書かれているため、以下のように修正します。

```bash:~/.zprezto/modules/prompt/functions/prompt_agnoster_setupの設定箇所抜粋
（略）
# Context: user@hostname (who am I and where am I)
prompt_context() {
  local user=`whoami`

  if [[ "$user" != "$DEFAULT_USER" || -n "$SSH_CONNECTION" ]]; then
#    prompt_segment $PRIMARY_FG default " %(!.%{%F{yellow}%}.)$user@%m    # デフォルト定義のコメントアウト
    prompt_segment $PRIMARY_FG default " %(!.%{%F{yellow}%}.) "           # 左記の設定を追加
  fi
}
（略）
```

修正後は`iTerm2`を起動し直すことでテーマが反映されます。

修正前後のプロンプトを比較すると以下のようになります。

![Monosnap_20230223_212533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/d7b014b1-01cb-8d7e-87f5-8609ffe20c35.png)

また、Git管理されているリポジトリのディレクトリに移動すると、上述した「[preztoとは](#preztoとは)」の図のようにブランチ名やGitの状態がわかるようになります。

## デフォルトエディタの変更
ユーザのホームディレクトリにある`.zprofile`に設定されているデフォルトエディタの設定が`nano`となっているため、`vim`に書き換えます。

```bash:~/.zprofileの設定箇所抜粋
（略）
#
# Editors
#

if [[ -z "$EDITOR" ]]; then
  export EDITOR='vim'    # 'nano'を'vim'に変更
fi
if [[ -z "$VISUAL" ]]; then
  export VISUAL='vim'    # 'nano'を'vim'に変更
fi
（略）

```

# おわりに
`iTerm2`のログ出力設定についてはともかく、`prezto`の設定は初期設定時に色々と悩みながら設定したあと、どこを設定したのか完全に忘れていたため、今回改めて設定を確認しながら設定箇所を整理できました。

やはりメモを残しておかないと後々苦労すると感じた次第でした。