3

最近、引数なしで新しい tmux セッションを作成する便利な Zsh 関数を作成しました。引数が指定され、セッションが既に存在する場合は、アタッチされます。それ以外の場合は、指定された名前で新しいセッションが作成されます。

# If the session is in the list of current tmux sessions, it is attached. Otherwise, a new session 
# is created and attached with the argument as its name.
ta() {

  # create the session if it doesn't already exist
  tmux has-session -t $1 2>/dev/null
  if [[ $? != 0 ]]; then
    tmux new-session -d -s $1
  fi

  # if a tmux session is already attached, switch to the new session; otherwise, attach the new
  # session
  if { [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; } then
    tmux switch -t $1
  else
    tmux attach -t $1
  fi
}

これはうまく機能しますが、オートコンプリートを追加したいので、Tab キーを押すと現在のセッションが一覧表示されます。これが私がこれまでに持っているものです:

# List all the the sessions' names.
tln() {
  tmux list-sessions | perl -n -e'/^([^:]+)/ && print $1 . "\n"'
}

compctl -K tln ta

タブを押すと、セッション名が一覧表示されますが、それらを切り替えることはできません。私は何が欠けていますか?

4

1 に答える 1

11

ドキュメントを注意深く読まなかった:

指定された関数を呼び出して補完を取得します。名前がアンダースコアで始まらない限り、関数には 2 つの引数が渡されます。補完を試みる単語の接頭辞と接尾辞、つまりカーソル位置の前の文字とカーソル位置以降の文字です。read ビルトインの -c および -l フラグを使用して、コマンド ライン全体にアクセスできます。関数は、補完を含む配列に変数を設定する必要がありますreply(要素ごとに 1 つの補完) 。応答を関数に対してローカルにしないでください。このような関数からコマンド ラインにアクセスするには、-c フラグと -l フラグを使用して組み込み関数を読み取ります。例えば、

. 完了関数から stdout に何も出力してはなりません。代わりに配列変数を設定する必要がありますreply:

reply=( $(tmux list-sessions | cut -d: -f1) )

. ここで perl を呼び出す理由はないことに注意してくださいcut。より適しているのは perl です。^([^:]+)tmux 出力に一致しない行はありません。

于 2013-07-20T23:26:45.337 に答える