Zsh
Mac
SSH
fzf

zsh + fzf で sshの接続設定 ( ~/.ssh/config ) をパパーっとフィルタリングする

More than 1 year has passed since last update.

asciicast

おもむろに Ctrl+T を押下すると、fzf が表示されて、
~/.ssh/config をぱぱーっとフィルタリングできるぞ。

環境

~/.ssh/configの分割例
/Users/nanasi/.ssh
├── conf.d
│   ├── github.conf
│   ├── example_web_server.conf
│   ├── other_example_web_server.conf
    .
    .
    .
│   └── pi.conf
├── config
└── known_hosts
~/.ssh/conf.d/github.conf
Host github                                                                                                                                               
  HostName github.com               
  IdentityFile ~/hoge/id_rsa
  User git

設定

~/.zshrc
.
.
.

__fzf_ssh() {
  # [Searching file contents](https://github.com/junegunn/fzf/wiki/Examples#searching-file-contents) 
  # を参考に
  # ファイルの中身を検索
  grep "" ~/.ssh/conf.d/*.conf | \
    fzf --exact --no-sort --reverse --delimiter=":" --preview="cat {1}" --preview-window=down:50%
}

# 新しいターミナルでSSH接続する場合
fzf_ssh_new() {
  local found
  found="$(__fzf_ssh)"
  if [[ $? -ne 0 ]] || [[ "$found" =~ "^[:blank:]*$" ]]; then
    return 1
  fi

  # とりあえずファイルの中身を表示
  cat "$(echo "$found" | cut -d ':' -f 1)"

  # 新しいターミナルウィンドウを開く 
  # 要: [mklement0/ttab](https://github.com/mklement0/ttab) 
  nohup ttab -w "ssh '$(echo "$found" | cut -d ':' -f 2 | perl -ne 'print for /Host\s+(\S+).*/;')'" > /dev/null 2>&1 &

  zle reset-prompt
}

# 直に現在のコマンド入力を入れ替える場合
fzf_ssh_inline() {
  local found
  found="$(__fzf_ssh)"
  if [[ $? -ne 0 ]] || [[ "$found" =~ "^[:blank:]*$" ]]; then
    return 1
  fi

  # バッファ書き換え
  BUFFER="ssh $(echo "$found" | cut -d ':' -f 1 | xargs perl -ne 'print for /Host\s+(\S+).*/;')"
  CURSOR=$#BUFFER

  zle reset-prompt
  zle clear-screen
}

zle     -N   fzf_ssh_inline

# キーバインド (ここでは Ctrl+T として設定)
bindkey '^T' fzf_ssh_inline

.
.
.