diff options
Diffstat (limited to 'Completion/Unix/Command/_tmux')
-rw-r--r-- | Completion/Unix/Command/_tmux | 666 |
1 files changed, 372 insertions, 294 deletions
diff --git a/Completion/Unix/Command/_tmux b/Completion/Unix/Command/_tmux index f0cc4be37..49c2b63ed 100644 --- a/Completion/Unix/Command/_tmux +++ b/Completion/Unix/Command/_tmux @@ -40,6 +40,14 @@ # # The configuration for subcommand completions may be done in # this context: ':completion:*:*:tmux-<sub-command>:*:*' +# +# TODO: +# +# - Implement __tmux-format +# - Implement __tmux-style (possibly using existing helpers like +# __tmux-attributes and __tmux-colours) +# - in _tmux-list-panes, use __tmux-windows or __tmux-sessions +# depending on -s is among the sub-commands current command line. # Global variables; setup the first time _tmux is called. # For $_tmux_commands[] generation, see the very end of this file. @@ -51,6 +59,8 @@ _tmux_aliasmap=( attach attach-session detach detach-client has has-session + lockc lock-client + locks lock-session lsc list-clients lscm list-commands ls list-sessions @@ -67,23 +77,26 @@ _tmux_aliasmap=( breakp break-pane capturep capture-pane displayp display-panes - downp down-pane findw find-window joinp join-pane killp kill-pane killw kill-window last last-window + lastp last-pane linkw link-window lsp list-panes lsw list-windows + movep move-pane movew move-window neww new-window nextl next-layout next next-window pipep pipe-pane prev previous-window + prevl previous-layout renamew rename-window resizep resize-pane + respawnp respawn-pane respawnw respawn-window rotatew rotate-window selectl select-layout @@ -93,7 +106,6 @@ _tmux_aliasmap=( swapp swap-pane swapw swap-window unlinkw unlink-window - upp up-pane # key bindings bind bind-key @@ -117,7 +129,6 @@ _tmux_aliasmap=( # buffers clearhist clear-history - copyb copy-buffer deleteb delete-buffer lsb list-buffers loadb load-buffer @@ -131,6 +142,7 @@ _tmux_aliasmap=( lock lock-server run run-shell info server-info + wait wait-for ) # --- Sub-command functions --- @@ -154,6 +166,7 @@ function _tmux-attach-session() { local -a args args=( + '-c[specify working directory for the session]:directory:_path_files -g "*(-/)"' '-d[detach other clients attached to target session]' '-r[put the client into read-only mode]' '-t[choose a target session]:target session:__tmux-sessions' @@ -189,6 +202,8 @@ function _tmux-break-pane() { local -a args args=( '-d[do not make the new window become the active one]' + '-F[specify format of output]:format:__tmux-format__tmux-format' + '-P[print information of new window after it has been created]' '-t[choose a target pane]:panes:__tmux-panes' ) _arguments ${args} @@ -198,25 +213,80 @@ function _tmux-capture-pane() { [[ -n ${tmux_describe} ]] && print "Capture the contents of a pane to a buffer" && return local -a args args=( + '-a[use alternate screen]' '-b[choose target buffer]:target buffer:__tmux-buffers' + '-C[escape non-printable characters as octal \\ooo]' + '-e[include escape sequences for attributes etc]' + '-E[specify last line to capture. - means last line of pane]' + '-J[join wrapped lines and preserver trailing space]' + '-q[ignore errors when trying to access alternate screen]' + '-p[print data to stdout]' + '-P[only capture that is the beginning of an as-yet incomplete esc seq]' + '-S[specify start line to capture. - means first line of scrollback]' '-t[choose source pane]:source pane:__tmux-panes' ) _arguments ${args} } +function _tmux-choose-buffer() { + [[ -n ${tmux_describe} ]] && print "Put a window into buffer choice mode" && return + local -a args + args=( + '-F[specify format of output]:format:__tmux-format' + '-t[choose a target window]:sessions:__tmux-windows' + '*:: :->tmpl' + ) + _arguments ${args} && return +} + function _tmux-choose-client() { [[ -n ${tmux_describe} ]] && print "Put a window into client choice mode" && return - __tmux-choose-stuff + local -a args + args=( + '-F[specify format of output]:format:__tmux-format' + '-t[choose a target window]:sessions:__tmux-windows' + '*:: :->tmpl' + ) + _arguments ${args} && return } function _tmux-choose-session() { [[ -n ${tmux_describe} ]] && print "Put a window into session choice mode" && return - __tmux-choose-stuff + local -a args + args=( + '-F[specify format of output]:format:__tmux-format' + '-t[choose a target window]:sessions:__tmux-windows' + '*:: :->tmpl' + ) + _arguments ${args} && return +} + +function _tmux-choose-tree() { + [[ -n ${tmux_describe} ]] && print "Put a window into tree choice mode" && return + local -a args + args=( + '-b[override default session command]:session-command:' + '-c[override default window command]:window-command:' + '-S[specify session format]:session-format:__tmux-formats' + '-s[choose among sessions]' + '-t[choose a target window]:sessions:__tmux-windows' + '-u[show generated tree uncollapsed at startup]' + '-W[specify window format]:window-format:__tmux-formats' + '-w[choose among windows]' + '*:: :->tmpl' + ) + _arguments ${args} && return } function _tmux-choose-window() { [[ -n ${tmux_describe} ]] && print "Put a window into window choice mode" && return - __tmux-choose-stuff + local -a args + args=( + '-F[specify format of output]:format:__tmux-format' + '-t[choose a target window]:sessions:__tmux-windows' + '*:: :->tmpl' + ) + _arguments ${args} && return } function _tmux-clear-history() { @@ -238,6 +308,7 @@ function _tmux-command-prompt() { local state local -a args args=( + '-I[comma separated list of initial inputs]:initial-text:->ilist' '-p[list of prompts]:prompts:->plist' '-t[choose a target client]:clients:__tmux-clients' '*:: :->tmpl' @@ -246,6 +317,9 @@ function _tmux-command-prompt() { if [[ ${state} == 'plist' ]]; then _message "comma seperated list of prompts" return + elif [[ ${state} == 'ilist' ]]; then + _message "comma seperated list of initial text" + return fi __tmux-lastarg ${state} 'tmpl' 1 "command template" } @@ -255,46 +329,16 @@ function _tmux-confirm-before() { local state local -a args args=( + '-p[specify prompt]:prompt:->prompt' '-t[choose a target client]:clients:__tmux-clients' '*:: :->command_and_args' ) _arguments -C ${args} && return - __tmux-lastarg ${state} 'command_and_args' 1 "command string" -} - -function _tmux-copy-buffer() { - [[ -n ${tmux_describe} ]] && print "Copy session paste buffers" && return - local state session - local -a args - local -ax bopts - - args=( - '-a[choose a source buffer index]:buffer:->srcbuf' - '-b[choose a destination buffer index]:buffer:->dstbuf' - '-s[choose a source session]:session:->srcsession' - '-t[choose a destination session]:session:->dstsession' - ) - _arguments ${args} - - case ${state} in - ((src|dst)session) - __tmux-sessions - return - ;; - (srcbuf) - session="$(__tmux-get-optarg -s "${words[@]}")" - ;; - (srcbuf) - session="$(__tmux-get-optarg -t "${words[@]}")" - ;; - esac - if [[ -n ${session} ]]; then - bopts=( -t ${session} ) - __tmux-buffers + if [[ ${state} == 'prompt' ]]; then + _message 'prompt string' return fi - bopts=() - __tmux-buffers + __tmux-lastarg ${state} 'command_and_args' 1 "command string" } function _tmux-copy-mode() { @@ -309,39 +353,20 @@ function _tmux-copy-mode() { function _tmux-delete-buffer() { [[ -n ${tmux_describe} ]] && print "Delete a paste buffer" && return - local state session local -a args - local -ax bopts - - args=( - '-b[choose a target buffer index]:panes:->buffer' - '-t[choose a target session]:panes:->session' - ) - _arguments ${args} - - case ${state} in - (session) - __tmux-sessions - return - ;; - (buffer) - session="$(__tmux-get-optarg -t "${words[@]}")" - ;; - (*) return ;; - esac - if [[ -n ${session} ]]; then - bopts=( -t ${session} ) - __tmux-buffers - return - fi - bopts=() - __tmux-buffers + args=('-b[choose a target buffer index]:buffers:__tmux-buffers') + _arguments ${args} && return } function _tmux-detach-client() { [[ -n ${tmux_describe} ]] && print "Detach a client from the server" && return local -a args - args=('-t[choose a target client]:clients:__tmux-clients') + args=( + '-a[kill all clients except for the named by -t]' + '-P[send SIGHUP to parent process]' + '-s[choose a target session and kill its clients]:sessions:__tmux-sessions' + '-t[choose a target client]:clients:__tmux-clients' + ) _arguments ${args} } @@ -349,6 +374,7 @@ function _tmux-display-message() { [[ -n ${tmux_describe} ]] && print "Display a message in the status line" && return local -a args args=( + '-c[choose a target client]:clients:__tmux-clients' '-p[print message to stdout]' '-t[choose a target client]:clients:__tmux-clients' '*:: :->msg' @@ -364,18 +390,15 @@ function _tmux-display-panes() { _arguments ${args} } -function _tmux-down-pane() { - [[ -n ${tmux_describe} ]] && print "Move down a pane" && return - local -a args - args=('-t[choose a target pane]:panes:__tmux-panes') - _arguments ${args} -} - function _tmux-find-window() { [[ -n ${tmux_describe} ]] && print "Search for a pattern in windows" && return local curcontext="${curcontext}" state local -a args args=( + '-C[match visible contents]' + '-F[specify format of output]:format:__tmux-format' + '-N[match window name]' + '-T[match window title]' '-t[choose a target window]:windows:__tmux-windows' '*:: :->pattern' ) @@ -394,6 +417,8 @@ function _tmux-if-shell() { [[ -n ${tmux_describe} ]] && print "Execute a tmux command if a shell-command succeeded" && return local -a args args=( + '-b[run shell command in background]' + '-F[do not execute shell command but use it as a string-value]' '1:shell command:' '2:tmux command:' ) @@ -404,6 +429,7 @@ function _tmux-join-pane() { [[ -n ${tmux_describe} ]] && print "Split a pane and move an existing one into the new space" && return local -a args args=( + '-b[join source pane left of or above target pane]' '-d[do not make the new window become the active one]' '-h[split horizontally]' '-v[split vertically]' @@ -419,7 +445,7 @@ function _tmux-kill-pane() { [[ -n ${tmux_describe} ]] && print "Destroy a given pane" && return local -a args args=( - '-a[kill all panes, except current]' + '-a[kill all panes except the one specified by -t]' '-t[choose a target pane]:panes:__tmux-panes' ) _arguments ${args} @@ -433,17 +459,34 @@ function _tmux-kill-server() { function _tmux-kill-session() { [[ -n ${tmux_describe} ]] && print "Destroy a given session" && return local -a args - args=('-t[choose a target session]:sessions:__tmux-sessions') + args=( + '-a[kill all session except the one specified by -t]' + '-t[choose a target session]:sessions:__tmux-sessions' + ) _arguments ${args} } function _tmux-kill-window() { [[ -n ${tmux_describe} ]] && print "Destroy a given window" && return local -a args - args=('-t[choose a target window]:windows:__tmux-windows') + args=( + '-a[kill all windows except the one specified by -t]' + '-t[choose a target window]:windows:__tmux-windows' + ) _arguments ${args} } +function _tmux-last-pane() { + [[ -n ${tmux_describe} ]] && print "Select the previously selected pane" && return + local -a args + args=( + '-d[disable input to the pane]' + '-e[enable input to the pane]' + '-t[choose a session]:sessions:__tmux-sessions' + ) + _arguments ${args} && return +} + function _tmux-last-window() { [[ -n ${tmux_describe} ]] && print "Select the previously selected window" && return local -a args @@ -466,13 +509,18 @@ function _tmux-link-window() { function _tmux-list-buffers() { [[ -n ${tmux_describe} ]] && print "List paste buffers of a session" && return local -a args - args=('-t[choose a session]:sessions:__tmux-sessions') + args=('-F[specify format of output]:format:__tmux-format') _arguments ${args} && return } function _tmux-list-clients() { [[ -n ${tmux_describe} ]] && print "List clients attached to server" && return - __tmux-nothing-else + local -a args + args=( + '-F[specify format of output]:format:__tmux-format' + '-t[choose a session]:sessions:__tmux-sessions' + ) + _arguments ${args} && return } function _tmux-list-commands() { @@ -490,52 +538,43 @@ function _tmux-list-keys() { function _tmux-list-panes() { [[ -n ${tmux_describe} ]] && print "List panes of a window" && return local -a args - args=('-t[choose a window]:windows:__tmux-windows') + args=( + '-a[list all panes the server possesses]' + '-F[specify format of output]:format:__tmux-format' + '-s[if specified, -t chooses a session]' + # TODO: Use __tmux-windows or __tmux-sessions depending on -s. + '-t[choose a window]:windows:__tmux-windows' + ) _arguments ${args} && return } function _tmux-list-sessions() { [[ -n ${tmux_describe} ]] && print "List sessions managed by server" && return - __tmux-nothing-else + local -a args + args=('-F[specify format of output]:format:__tmux-format') + _arguments ${args} && return } function _tmux-list-windows() { [[ -n ${tmux_describe} ]] && print "List windows of a session" && return local -a args - args=('-t[choose a session]:sessions:__tmux-sessions') + args=( + '-a[list all windows the tmux server possesses]' + '-F[specify format of output]:format:__tmux-format' + '-t[choose a session]:sessions:__tmux-sessions' + ) _arguments ${args} && return } function _tmux-load-buffer() { [[ -n ${tmux_describe} ]] && print "Load a file into a paste buffer" && return - local state session local -a args - local -ax bopts args=( - '-b[choose a target buffer index]:panes:->buffer' - '-t[choose a target session]:panes:->session' + '-b[choose a target buffer index]:panes:__tmux-buffers' '1:file name:_files -g "*(-.)"' ) - _arguments ${args} - - case ${state} in - (session) - __tmux-sessions - return - ;; - (buffer) - session="$(__tmux-get-optarg -t "${words[@]}")" - ;; - (*) return ;; - esac - if [[ -n ${session} ]]; then - bopts=( -t ${session} ) - __tmux-buffers - return - fi - bopts=() - __tmux-buffers + _arguments ${args} && return } function _tmux-lock-client() { @@ -557,12 +596,30 @@ function _tmux-lock-session() { _arguments ${args} && return } +function _tmux-move-pane() { + [[ -n ${tmux_describe} ]] && print "Move a pane into a new space" && return + local -a args + args=( + '-b[join source pane left of or above target pane]' + '-d[do not make the new window become the active one]' + '-h[split horizontally]' + '-v[split vertically]' + '-l[define new pane'\''s size]: :_guard "[0-9]#" "numeric value"' + '-p[define new pane'\''s size in percent]: :_guard "[0-9]#" "numeric value"' + '-s[choose source pane]:window:__tmux-panes' + '-t[choose target pane]:window:__tmux-panes' + ) + _arguments ${args} && return +} + function _tmux-move-window() { [[ -n ${tmux_describe} ]] && print "Move a window to another" && return local -a args args=( '-d[do not make the new window become the active one]' + '-k[kill the target window if it exists]' '-s[choose source window]:window:__tmux-windows' + '-r[renumber windows in session in sequential order]' '-t[choose destination window]:window:__tmux-windows' ) _arguments ${args} @@ -572,11 +629,17 @@ function _tmux-new-session() { [[ -n ${tmux_describe} ]] && print "Create a new session" && return local -a args args=( - '-d[do not attach new session to current terminal]' '-A[attach to existing session if it already exists]' + '-c[specify working directory for the session]:directory:_path_files -g "*(-/)"' + '-d[do not attach new session to current terminal]' + '-D[in case of -A behave like attach-session'\''s -d]' + '-F[specify format of output]:format:__tmux-format' '-n[name the initial window]:window name' + '-P[print information about new session after it is created]' '-s[name the session]:session name:__tmux-sessions' '-t[specify target session]:sessions:__tmux-sessions' + '-x[specify width]:width:_guard "[0-9]#" "numeric value"' + '-y[specify height]:height:_guard "[0-9]#" "numeric value"' '*:: :_command' ) _arguments -s ${args} @@ -586,9 +649,13 @@ function _tmux-new-window() { [[ -n ${tmux_describe} ]] && print "Create a new window" && return local -a args args=( + '-a[insert new window at next free index from -t]' + '-c[specify working directory for the session]:directory:_path_files -g "*(-/)"' '-d[do not make the new window become the active one]' + '-F[specify format of output]:format:__tmux-format' '-k[destroy it if the specified window exists]' '-n[specify a window name]:window name:' + '-P[print information about new window after it is created]' '-t[specify target window]:windows:__tmux-windows' '*:: :_command' ) @@ -606,7 +673,7 @@ function _tmux-next-window() { [[ -n ${tmux_describe} ]] && print "Move to the next window in a session" && return local -a args args=( - '-a[move to the next window with activity]' + '-a[move to the next window with an alert]' '-t[choose target session]:session:__tmux-sessions' ) _arguments ${args} @@ -616,9 +683,11 @@ function _tmux-paste-buffer() { [[ -n ${tmux_describe} ]] && print "Insert a paste buffer into the window" && return local -a args args=( + '-b[choose buffer]:source buffer:__tmux-buffers' '-d[remove buffer from stack after pasting]' + '-p[use bracketed paste mode if the application requested it]' '-r[do not replace LF with CR when pasting]' - '-b[choose buffer]:source buffer:__tmux-buffers' + '-s[specify separator]:separator:' '-t[choose target window]:window:__tmux-windows' ) _arguments ${args} @@ -647,7 +716,7 @@ function _tmux-previous-window() { [[ -n ${tmux_describe} ]] && print "Move to the previous window in a session" && return local -a args args=( - '-a[move to the previous window with activity]' + '-a[move to the previous window with an alert]' '-t[choose target session]:session:__tmux-sessions' ) _arguments ${args} @@ -656,7 +725,10 @@ function _tmux-previous-window() { function _tmux-refresh-client() { [[ -n ${tmux_describe} ]] && print "Refresh a client" && return local -a args - args=('-t[choose target client]:client:__tmux-clients') + args=( + '-S[Only update the client'\''s status bar]' + '-t[choose target client]:client:__tmux-clients' + ) _arguments ${args} } @@ -690,11 +762,25 @@ function _tmux-resize-pane() { '-R[resize to the right]' '-U[resize upward]' '-t[choose target pane]:pane:__tmux-panes' + '-x[specify width]:width:_guard "[0-9]#" "numeric value"' + '-y[specify height]:height:_guard "[0-9]#" "numeric value"' + '-Z[toggle zoom of pane]' '1::adjustment (defaults to one):_guard "[0-9]#" "numeric value"' ) _arguments ${args} } +function _tmux-respawn-pane() { + [[ -n ${tmux_describe} ]] && print "Reuse a pane in which a command has exited" && return + local -a args + args=( + '-k[kill window if it is in use]' + '-t[choose target pane]:window:__tmux-pane' + '*::command:_command' + ) + _arguments ${args} +} + function _tmux-respawn-window() { [[ -n ${tmux_describe} ]] && print "Reuse a window in which a command has exited" && return local -a args @@ -719,43 +805,31 @@ function _tmux-rotate-window() { function _tmux-run-shell() { [[ -n ${tmux_describe} ]] && print "Execute a command without creating a new window" && return - _command + local -a args + args=( + '-b[run shell command in background]' + '-t[choose target pane]:pane:__tmux-panes' + '*::command:_command' + ) + _arguments ${args} } function _tmux-save-buffer() { [[ -n ${tmux_describe} ]] && print "Save a paste buffer to a file" && return - local state session local -a args - local -ax bopts args=( - '-b[choose a target buffer index]:buffer:->buffer' - '-t[choose a target session]:buffer:->session' + '-a[append to rather than overwriting file]' + '-b[choose a target buffer index]:buffer:__tmux-buffers' ) - _arguments ${args} - - case ${state} in - (session) - __tmux-sessions - return - ;; - (buffer) - session="$(__tmux-get-optarg -t "${words[@]}")" - ;; - (*) return ;; - esac - if [[ -n ${session} ]]; then - bopts=( -t ${session} ) - __tmux-buffers - return - fi - bopts=() - __tmux-buffers + _arguments ${args} && return } function _tmux-select-layout() { [[ -n ${tmux_describe} ]] && print "Choose a layout for a window" && return args=( + '-n[behave like next-layout]' + '-p[behave like previous-layout]' '-t[choose a target window]:target window:__tmux-windows' '*::layout name:__tmux-layouts' ) @@ -765,21 +839,29 @@ function _tmux-select-layout() { function _tmux-select-pane() { [[ -n ${tmux_describe} ]] && print "Make a pane the active one in the window" && return local -a args - args=('-t[choose a target pane]:panes:__tmux-panes') - _arguments ${args} && return -} - -function _tmux-select-prompt() { - [[ -n ${tmux_describe} ]] && print "Open a prompt to enter a window index" && return - local -a args - args=('-t[choose a target client]:clients:__tmux-clients') + args=( + '-D[Move to the pane down of this]' + '-d[disable input to the pane]' + '-e[enable input to the pane]' + '-l[behave like last-pane]' + '-L[Move to the pane left of this]' + '-R[Move to the pane right of this]' + '-U[Move to the pane above this]' + '-t[choose a target pane]:panes:__tmux-panes' + ) _arguments ${args} && return } function _tmux-select-window() { [[ -n ${tmux_describe} ]] && print "Select a window" && return local -a args - args=('-t[choose a target window]:windows:__tmux-windows') + args=( + '-l[behave like last-window]' + '-n[behave like next-window]' + '-p[behave like previous-window]' + '-T[if selected window is the current behave like last-window]' + '-t[choose a target window]:windows:__tmux-windows' + ) _arguments ${args} && return } @@ -788,6 +870,8 @@ function _tmux-send-keys() { local curcontext="${curcontext}" state local -a args args=( + '-l[disable key name lookup and send data literally]' + '-R[reset terminal state]' '-t[choose a target pane]:panes:__tmux-panes' '*:: :->key' ) @@ -798,7 +882,10 @@ function _tmux-send-keys() { function _tmux-send-prefix() { [[ -n ${tmux_describe} ]] && print "Send the prefix key to a window" && return local -a args - args=('-t[choose a target pane]:panes:__tmux-panes') + args=( + '-2[send secondary prefix key]' + '-t[choose a target pane]:panes:__tmux-panes' + ) _arguments ${args} } @@ -809,33 +896,16 @@ function _tmux-server-info() { function _tmux-set-buffer() { [[ -n ${tmux_describe} ]] && print "Set contents of a paster buffer" && return - local state session + local state local -a args - local -ax bopts - args=( - '-b[choose a target buffer index]:panes:->buffer' - '-t[choose a target session]:panes:->session' + '-a[append to rather than overwriting target buffer]' + '-b[choose a target buffer index]:panes:__tmux-buffer' + '-n[specify new buffer name]:buffer-name:' + '*:: :->data' ) - _arguments ${args} - - case ${state} in - (session) - __tmux-sessions - return - ;; - (buffer) - session="$(__tmux-get-optarg -t "${words[@]}")" - ;; - (*) return ;; - esac - if [[ -n ${session} ]]; then - bopts=( -t ${session} ) - __tmux-buffers - return - fi - bopts=() - __tmux-buffers + _arguments ${args} && return + __tmux-lastarg ${state} 'data' 1 "data" } function _tmux-set-environment() { @@ -904,33 +974,9 @@ function _tmux-set-window-option() { function _tmux-show-buffer() { [[ -n ${tmux_describe} ]] && print "Display the contents of a paste buffer" && return - local state session local -a args - local -ax bopts - - args=( - '-b[choose a target buffer index]:panes:->buffer' - '-t[choose a target session]:panes:->session' - ) - _arguments ${args} - - case ${state} in - (session) - __tmux-sessions - return - ;; - (buffer) - session="$(__tmux-get-optarg -t "${words[@]}")" - ;; - (*) return ;; - esac - if [[ -n ${session} ]]; then - bopts=( -t ${session} ) - __tmux-buffers - return - fi - bopts=() - __tmux-buffers + args=('-b[choose a target buffer index]:panes:->buffer') + _arguments ${args} && return } function _tmux-show-environment() { @@ -945,7 +991,13 @@ function _tmux-show-environment() { function _tmux-show-messages() { [[ -n ${tmux_describe} ]] && print "Show client"\'"s message log" && return - args=('-t[choose target client]:client:__tmux-clients') + local -a args + args=( + '-I[show debugging information about the tmux server]' + '-J[show debugging information about running jobs]' + '-T[show debugging information about involved terminals]' + '-t[choose target client]:client:__tmux-clients' + ) _arguments ${args} } @@ -978,12 +1030,14 @@ function _tmux-split-window() { [[ -n ${tmux_describe} ]] && print "Splits a pane into two" && return local -a args args=( + '-b[create new pane left of or above target pane]' '-d[do not make the new window become the active one]' + '-F[specify format of output]:format:__tmux-format' '-h[split horizontally]' '-v[split vertically]' '-l[define new pane'\''s size]: :_guard "[0-9]#" "numeric value"' '-p[define new pane'\''s size in percent]: :_guard "[0-9]#" "numeric value"' - # Yes, __tmux_pane is correct here. The behaviour was changed + # Yes, __tmux-panes is correct here. The behaviour was changed # in recent tmux versions and makes more sense. Except that # changing the command's name might annoy users. So it stays like # this. @@ -1034,6 +1088,10 @@ function _tmux-switch-client() { local -a args args=( '-c[choose a target client]:client:__tmux-clients' + '-l[move client to last session]' + '-n[move client to next session]' + '-p[move client to previous session]' + '-r[toggle read-only flag of client]' '-t[choose a target window]:window:__tmux-windows' ) _arguments ${args} @@ -1046,6 +1104,7 @@ function _tmux-unbind-key() { ow=( "${words[@]}" ) args=( + '-a[Remove all key bindings]' '-c[kill the window if it is only in one session]' '-n[remove a non-prefix binding]' '-t[choose a key table]:key table:__tmux-key-tables' @@ -1071,11 +1130,18 @@ function _tmux-unlink-window() { _arguments ${args} } -function _tmux-up-pane() { - [[ -n ${tmux_describe} ]] && print "Move up a pane" && return +function _tmux-wait-for() { + [[ -n ${tmux_describe} ]] && print "Wait for an event or trigger it" && return + local state local -a args - args=('-t[choose a target pane]:panes:__tmux-panes') - _arguments ${args} + args=( + '-L[lock the named channel]' + '-S[send signal to channel]' + '-U[unlock the named channel]' + '*:: :->channel' + ) + _arguments ${args} && return + __tmux-lastarg ${state} 'channel' 1 "event channel" } # --- Utility functions --- @@ -1110,18 +1176,6 @@ function __tmux-bound-keys() { _describe -t keys 'keys' keys } -function __tmux-choose-stuff() { - # choose-{client,session,window} accept exactly the same arguments, so... - local curcontext="${curcontext}" state - local -a args - args=( - '-t[choose a target pane]:panes:__tmux-panes' - '*:: :->tmpl' - ) - _arguments ${args} && return - __tmux-lastarg ${state} 'tmpl' 1 "tmux command template" -} - function __tmux-clients() { local expl local -a clients @@ -1129,6 +1183,10 @@ function __tmux-clients() { _describe -t clients 'clients' clients } +function __tmux-format() { + _message 'not implemented yet' +} + function __tmux-colours() { local -a colnames colnames=( default black red green yellow blue magenta cyan white colourN:"replace N by a number between 0 and 255" ) @@ -1197,13 +1255,14 @@ function __tmux-option-guard() { int_guard='_guard "[0-9]#" "'${opt}': numeric value"' if [[ ${mode} == 'session' ]]; then options=( + 'assume-paste-time:'${int_guard} 'base-index:'${int_guard} - 'bell-action:DESC:any none current' - 'buffer-limit:'${int_guard} + 'bell-action:DESC:any none current other' + 'bell-on-alert:DESC:on off' 'default-command:MSG:command string' - 'default-path:MSG:path name' 'default-shell:MSG:shell executable' - 'default-terminal:MSG:terminal string' + 'destroy-unattached:DESC:on off' + 'detach-on-destroy:DESC:on off' 'display-panes-colour:__tmux-colours' 'display-panes-active-colour:__tmux-colours' 'display-panes-time:'${int_guard} @@ -1212,78 +1271,85 @@ function __tmux-option-guard() { 'lock-after-time:'${int_guard} 'lock-command:MSG:command string' 'lock-server:DESC:on off' - 'message-attr:__tmux-attributes' - 'message-bg:__tmux-colours' - 'message-fg:__tmux-colours' - 'message-limit:'${int_guard} - 'mouse-select-pane:DESC:on off' - 'pane-border-bg:__tmux-colours' - 'pane-border-fg:__tmux-colours' - 'pane-active-border-bg:__tmux-colours' - 'pane-active-border-fg:__tmux-colours' - 'prefix:MSG:comma-seperated key list' + 'message-command-style:__tmux-style' + 'message-style:__tmux-style' + 'mouse:DESC:on off' + 'mouse-utf8:DESC:on off' + 'prefix:MSG:primary prefix key' + 'prefix2:MSG:secondary prefix key' + 'renumber-windows:DESC:on off' 'repeat-time:'${int_guard} 'set-remain-on-exit:DESC:on off' 'set-titles:DESC:on off' 'set-titles-string:MSG:title format string' 'status:DESC:on off' - 'status-attr:__tmux-attributes' - 'status-bg:__tmux-colours' - 'status-fg:__tmux-colours' 'status-interval:'${int_guard} 'status-justify:DESC:left centre right' 'status-keys:DESC:vi emacs' 'status-left:MSG:format string' - 'status-left-attr:__tmux-attributes' - 'status-left-bg:__tmux-colours' - 'status-left-fg:__tmux-colours' 'status-left-length:'${int_guard} + 'status-left-style:__tmux-style' + 'status-position:DESC:top bottom' 'status-right:MSG:format string' - 'status-right-attr:__tmux-attributes' - 'status-right-bg:__tmux-colours' - 'status-right-fg:__tmux-colours' 'status-right-length:'${int_guard} + 'status-right-style:__tmux-style' + 'status-style:__tmux-style' 'status-utf8:DESC:on off' - 'terminal-overrides:MSG:overrides string' 'update-environment:MSG:string listing env. variables' 'visual-activity:DESC:on off' 'visual-bell:DESC:on off' - 'visual-content:DESC:on off' + 'visual-silence:DESC:on off' + 'word-separators:MSG:separator string' ) elif [[ ${mode} == 'server' ]]; then options=( + 'buffer-limit:'${int_guard} + 'default-terminal:MSG:terminal string' 'escape-time:'${int_guard} + 'exit-unattached:DESC:on off' + 'focus-events:DESC:on off' + 'history-file:_path-files -g "*(-.)"' + 'message-limit:'${int_guard} 'quiet:DESC:on off' + 'set-clipboard:DESC:on off' + 'terminal-overrides:MSG:overrides string' ) else options=( 'aggressive-resize:DESC:on off' + 'allow-rename:DESC:on off' 'alternate-screen:DESC:on off' 'automatic-rename:DESC:on off' + 'automatic-rename-format:DESC:__tmux-format' 'clock-mode-colour:__tmux-colours' 'clock-mode-style:DESC:12 24' 'force-height:'${int_guard} 'force-width:'${int_guard} 'main-pane-height:'${int_guard} 'main-pane-width:'${int_guard} - 'mode-attr:__tmux-attributes' - 'mode-bg:__tmux-colours' - 'mode-fg:__tmux-colours' 'mode-keys:DESC:vi emacs' - 'mode-mouse:DESC:on off' + 'mode-style:__tmux-style' 'monitor-activity:DESC:on off' - 'monitor-content:MSG:fnmatch(3) pattern' + 'monitor-silence:DESC:on off' + 'other-pane-height:'${int_guard} + 'other-pane-width:'${int_guard} + 'pane-active-border-style:__tmux-style' + 'pane-base-index:'${int_guard} + 'pane-border-style:__tmux-style' 'remain-on-exit:DESC:on off' 'synchronize-panes:DESC:on off' 'utf8:DESC:on off' - 'window-status-attr:__tmux-attributes' - 'window-status-bg:__tmux-colours' - 'window-status-current-attr:__tmux-attributes' - 'window-status-current-bg:__tmux-colours' - 'window-status-current-fg:__tmux-colours' + 'window-active-style:__tmux-style' + 'window-status-activity-style:__tmux-style' + 'window-status-bell-style:__tmux-style' 'window-status-current-format:MSG:status format string' - 'window-status-fg:__tmux-colours' + 'window-status-current-style:__tmux-style' 'window-status-format:MSG:status format string' + 'window-status-last-style:__tmux-style' + 'window-status-separator:MSG:separator string' + 'window-status-style:__tmux-style' + 'window-style:__tmux-style' + 'wrap-seach:DESC:on off' 'xterm-keys:DESC:on off' ) fi @@ -1310,16 +1376,17 @@ function __tmux-option-guard() { esac } -function __tmux-options() { - local -a tmux_options - tmux_options=( +function __tmux-session-options() { + local -a tmux_session_options + tmux_session_options=( + 'assume-paste-time:assume keys are pasted instead of typed if this fast' 'base-index:define where to start numbering' 'bell-action:set action on window bell' - 'buffer-limit:number of buffers kept per session' + 'bell-on-alert:ring the terminal bell when an alert occurs' 'default-command:default command for new windows' - 'default-path:default working directory' 'default-shell:default shell executable' - 'default-terminal:default terminal definition string' + 'destroy-unattached:destroy session if no client is attached' + 'detach-on-destroy:detach client if attached session is destroyed' 'display-panes-colour:colour used for display-panes' 'display-panes-active-colour:colour for active pane in display-panes' 'display-panes-time:time (in msecs) of display-panes output' @@ -1328,45 +1395,37 @@ function __tmux-options() { 'lock-after-time:lock sessions after N seconds' 'lock-command:command to run for locking a client' 'lock-server:make lock-after-time lock the server instead of sessions' - 'message-attr:set status line message attributes' - 'message-bg:set status line message background colour' - 'message-fg:set status line message foreground colour' - 'message-limit:set size of message log per client' - 'mouse-select-pane:make mouse clicks select window panes' - 'pane-border-bg:set pane border foreground colour' - 'pane-border-fg:set pane border background colour' - 'pane-active-border-bg:set active pane border foreground colour' - 'pane-active-border-fg:set active pane border background colour' - 'prefix:comma seperated line of keys accepted as prefix key' + 'message-command-style:status line message command style' + 'message-style:status line message style' + 'mouse:enable mouse support' + 'mouse-utf8:request utf8 mouse support' + 'prefix:primary prefix key' + 'prefix2:secondary prefix key' + 'renumber-windows:renumber windows if a window is closed' 'repeat-time:time for multiple commands without prefix-key presses' 'set-remain-on-exit:set remain-on-exit window option' 'set-titles:try to set xterm window titles' 'set-titles-string:format used by set-titles' 'status:show or hide the status bar' - 'status-attr:status bar attributes' - 'status-bg:status bar background colour' - 'status-fg:status bar foreground colour' 'status-interval:interval (in seconds) for status bar updates' 'status-justify:position of the window list in status bar' 'status-keys:mode to use in status bar modes (vi/emacs)' 'status-left:format to use left in status bar' - 'status-left-attr:attribute for the left part of the status bar' - 'status-left-bg:background colour of the left part of the status bar' - 'status-left-fg:foreground colour of the left part of the status bar' 'status-left-length:maximum length of the left part of the status bar' + 'status-left-style:style of left part of status line' + 'status-position:status line position' 'status-right:format to use right in status bar' - 'status-right-attr:attribute for the right part of the status bar' - 'status-right-bg:background colour of the right part of the status bar' - 'status-right-fg:foreground colour of the right part of the status bar' 'status-right-length:maximum length of the right part of the status bar' + 'status-right-style:style of right part of status line' + 'status-style:style status line' 'status-utf8:assume UTF-8 sequences to appear in status bar' - 'terminal-overrides:override terminal descriptions' 'update-environment:list of variables to be copied to a session'\''s environment' 'visual-activity:display status line messages upon activity' 'visual-bell:use visual bell instead of audible' - 'visual-content:display status line messages upon content changes' + 'visual-silence:print a message if monitor-silence is on' + 'word-separators:string of characters considered word separators' ) - _describe -t tmux-options 'tmux option' tmux_options + _describe -t tmux-options 'tmux session option' tmux_session_options } function __tmux-options-complete() { @@ -1375,7 +1434,7 @@ function __tmux-options-complete() { case ${state} in name_or_value) if (( CURRENT == 1 )) && [[ ${mode} == 'session' ]]; then - __tmux-options + __tmux-session-options elif (( CURRENT == 1 )) && [[ ${mode} == 'server' ]]; then __tmux-server-options elif (( CURRENT == 1 )) && [[ ${mode} == 'window' ]]; then @@ -1413,8 +1472,16 @@ function __tmux-panes() { function __tmux-server-options() { local -a tmux_server_options tmux_server_options=( + 'buffer-limit:number of buffers kept per session' + 'default-terminal:default terminal definition string' 'escape-time:set timeout to detect single escape characters (in msecs)' + 'exit-unattached:make server exit if it has no attached clients' + 'focus-events:request focus events from terminal' + 'history-file:tmux command history file name' + 'message-limit:set size of message log per client' 'quiet:enable/disable the display of various informational messages' + 'set-clipboard:use esc sequences to set terminal clipboard' + 'terminal-overrides:override terminal descriptions' ) _describe -t tmux-server-options 'tmux server option' tmux_server_options } @@ -1435,36 +1502,47 @@ function __tmux-socket-name() { _wanted socket expl 'socket name' compadd ${expl} -- ${socks} } +function __tmux-style() { + _message 'not implemented yet' +} + function __tmux-window-options() { local -a tmux_window_options tmux_window_options=( 'aggressive-resize:aggressively resize windows' + 'allow-rename:allow programs to change window titles' 'alternate-screen:allow alternate screen feature to be used' 'automatic-rename:attempt to automatically rename windows' + 'automatic-rename-format:format for automatic renames' 'clock-mode-colour:set clock colour' 'clock-mode-style:set clock hour format (12/24)' 'force-height:force a windows to a certain height' 'force-width:force a windows to a certain width' 'main-pane-height:set height for main-* layouts' 'main-pane-width:set width for main-* layouts' - 'mode-attr:set window modes attributes' - 'mode-bg:set window modes background colour' - 'mode-fg:set window modes foreground colour' 'mode-keys:mode to use in copy and choice modes (vi/emacs)' - 'mode-mouse:use mouse in modes' + 'mode-style:set window modes style' 'monitor-activity:monitor window activity' - 'monitor-content:monitor window contents for a fnmatch(3) pattern' + 'monitor-silence:monitor window for inactivity' + 'other-pane-height:height of other panes' + 'other-pane-width:width of other panes' + 'pane-active-border-style:style of border of active pane' + 'pane-base-index:integer at which to start indexing panes' + 'pane-border-style:style of border pane' 'remain-on-exit:do not destroy windows after the program exits' 'synchronize-panes:send input to all panes of a window' 'utf8:assume UTF-8 sequences to appear in a window' - 'window-status-attr:set status line attributes for a window' - 'window-status-bg:set status line background for a window' - 'window-status-current-attr:set status line attributes for active window' - 'window-status-current-bg:set status line background for active window' - 'window-status-current-fg:set status line foreground for active window' + 'window-active-style:style of active window' + 'window-status-activity-style:style of status bar activity tag' + 'window-status-bell-style:style of status bar bell tag' 'window-status-current-format:set status line format for active window' - 'window-status-fg:set status line foreground for a window' + 'window-status-current-style:style of current window in status bar' 'window-status-format:set status line format for all but the active window' + 'window-status-last-style:style of last window in status bar' + 'window-status-separator:separator drawn between windows in status line' + 'window-status-style:general status bar style' + 'window-style:style of window' + 'wrap-search:search wrap around at the end of a pane' 'xterm-keys:generate xterm-style function key sequences' ) _describe -t tmux-window-options 'tmux window option' tmux_window_options @@ -1492,20 +1570,21 @@ function _tmux() { local curcontext="${curcontext}" local mode state ret=1 local -a args - local -x tmuxcommand - unset tmux_describe + local tmuxcommand + local tmux_describe= args=( '-2[force using 256 colours]' '-8[force using 88 colours]' '-c[execute a shell command]:command name:_command_names' + '-C[start tmux in control mode. -CC disables echo]' '-f[specify configuration file]:tmux config file:_files -g "*(-.)"' '-l[behave like a login shell]' '-L[specify socket name]:socket name:__tmux-socket-name' - '-q[do not send informational messages]' '-S[specify socket path]:server socket:_path_files -g "*(=,/)"' '-u[force using UTF-8]' '-v[request verbose logging]' + '-V[report tmux version]' '*:: :->subcommand_or_options' ) _arguments -C -s -w ${args} && ret=0 @@ -1551,7 +1630,7 @@ function _tmux() { # description generation follows; only done on 1st _tmux call. local f desc local -A rev -local -x tmux_describe +local tmux_describe tmux_describe='yes, please' for f in ${(k)_tmux_aliasmap} ; do rev+=( ${_tmux_aliasmap[$f]} $f ) @@ -1561,6 +1640,5 @@ for f in ${(M)${(k)functions}:#_tmux-*} ; do _tmux_commands+=( "${f#_tmux-}${desc:+:$desc}" ) [[ -n ${rev[${f#_tmux-}]} ]] && _tmux_aliases+=( "${rev[${f#_tmux-}]}${desc:+:$desc}" ) done -unset desc f rev tmux_describe -_tmux +_tmux "$@" |