Linux iad1-shared-b7-18 6.6.49-grsec-jammy+ #10 SMP Thu Sep 12 23:23:08 UTC 2024 x86_64
Apache
: 67.205.6.31 | : 216.73.216.13
Cant Read [ /etc/named.conf ]
8.2.29
fernandoquevedo
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
README
+ Create Folder
+ Create File
/
usr /
share /
zsh /
functions /
Completion /
Unix /
[ HOME SHELL ]
Name
Size
Permission
Action
_a2ps
2.73
KB
-rw-r--r--
_aap
2.58
KB
-rw-r--r--
_abcde
2.39
KB
-rw-r--r--
_absolute_command_paths
1022
B
-rw-r--r--
_ack
8.09
KB
-rw-r--r--
_adb
15.1
KB
-rw-r--r--
_ansible
13.42
KB
-rw-r--r--
_ant
6.03
KB
-rw-r--r--
_antiword
1.08
KB
-rw-r--r--
_apachectl
116
B
-rw-r--r--
_apm
1.64
KB
-rw-r--r--
_arch_archives
413
B
-rw-r--r--
_arch_namespace
3.23
KB
-rw-r--r--
_arp
3.07
KB
-rw-r--r--
_arping
2.17
KB
-rw-r--r--
_asciidoctor
2.33
KB
-rw-r--r--
_asciinema
1.93
KB
-rw-r--r--
_at
1.01
KB
-rw-r--r--
_attr
3.15
KB
-rw-r--r--
_augeas
2.51
KB
-rw-r--r--
_avahi
2.27
KB
-rw-r--r--
_awk
4.57
KB
-rw-r--r--
_base64
2.04
KB
-rw-r--r--
_basename
767
B
-rw-r--r--
_bash
3.52
KB
-rw-r--r--
_baudrates
2.37
KB
-rw-r--r--
_baz
15.64
KB
-rw-r--r--
_beep
1.59
KB
-rw-r--r--
_bibtex
160
B
-rw-r--r--
_bind_addresses
1.4
KB
-rw-r--r--
_bison
923
B
-rw-r--r--
_bittorrent
4.76
KB
-rw-r--r--
_bogofilter
5.13
KB
-rw-r--r--
_bpf_filters
7.67
KB
-rw-r--r--
_bpython
1.25
KB
-rw-r--r--
_bzip2
2.17
KB
-rw-r--r--
_bzr
11.17
KB
-rw-r--r--
_cabal
292
B
-rw-r--r--
_cal
547
B
-rw-r--r--
_calendar
1.37
KB
-rw-r--r--
_canonical_paths
3.61
KB
-rw-r--r--
_cat
2.04
KB
-rw-r--r--
_ccal
778
B
-rw-r--r--
_cdcd
2.09
KB
-rw-r--r--
_cdrdao
7.95
KB
-rw-r--r--
_cdrecord
4.75
KB
-rw-r--r--
_chkconfig
777
B
-rw-r--r--
_chmod
2.87
KB
-rw-r--r--
_chown
3.5
KB
-rw-r--r--
_chroot
1.41
KB
-rw-r--r--
_chsh
1.97
KB
-rw-r--r--
_cksum
3.88
KB
-rw-r--r--
_clay
1.73
KB
-rw-r--r--
_cmdambivalent
391
B
-rw-r--r--
_cmdstring
102
B
-rw-r--r--
_cmp
1.1
KB
-rw-r--r--
_column
3.79
KB
-rw-r--r--
_comm
995
B
-rw-r--r--
_composer
31.47
KB
-rw-r--r--
_compress
1.38
KB
-rw-r--r--
_configure
444
B
-rw-r--r--
_cowsay
904
B
-rw-r--r--
_cp
4.09
KB
-rw-r--r--
_cpio
4.48
KB
-rw-r--r--
_cplay
343
B
-rw-r--r--
_crontab
2.03
KB
-rw-r--r--
_cscope
1.56
KB
-rw-r--r--
_cssh
795
B
-rw-r--r--
_ctags_tags
170
B
-rw-r--r--
_curl
224
B
-rw-r--r--
_cut
2.31
KB
-rw-r--r--
_cvs
28.32
KB
-rw-r--r--
_darcs
1.18
KB
-rw-r--r--
_date
3.07
KB
-rw-r--r--
_date_formats
2.95
KB
-rw-r--r--
_dates
3.97
KB
-rw-r--r--
_dbus
4.69
KB
-rw-r--r--
_dconf
1.75
KB
-rw-r--r--
_dd
2.74
KB
-rw-r--r--
_devtodo
4.56
KB
-rw-r--r--
_df
3.51
KB
-rw-r--r--
_dhclient
3.44
KB
-rw-r--r--
_dict
2.09
KB
-rw-r--r--
_dict_words
1.26
KB
-rw-r--r--
_diff
90
B
-rw-r--r--
_diff3
1.99
KB
-rw-r--r--
_diff_options
9.04
KB
-rw-r--r--
_diffstat
1.71
KB
-rw-r--r--
_dig
4.59
KB
-rw-r--r--
_dir_list
680
B
-rw-r--r--
_directories
108
B
-rw-r--r--
_django
5.91
KB
-rw-r--r--
_dmesg
638
B
-rw-r--r--
_dmidecode
1.53
KB
-rw-r--r--
_dns_types
331
B
-rw-r--r--
_doas
656
B
-rw-r--r--
_domains
585
B
-rw-r--r--
_dos2unix
4.76
KB
-rw-r--r--
_drill
1.91
KB
-rw-r--r--
_dsh
1.68
KB
-rw-r--r--
_dtruss
684
B
-rw-r--r--
_du
4.48
KB
-rw-r--r--
_dvi
3.95
KB
-rw-r--r--
_ecasound
8.33
KB
-rw-r--r--
_ed
952
B
-rw-r--r--
_elfdump
1.29
KB
-rw-r--r--
_elinks
2.89
KB
-rw-r--r--
_email_addresses
5.5
KB
-rw-r--r--
_enscript
7.45
KB
-rw-r--r--
_entr
729
B
-rw-r--r--
_env
1.77
KB
-rw-r--r--
_espeak
2.12
KB
-rw-r--r--
_etags
2.08
KB
-rw-r--r--
_fakeroot
486
B
-rw-r--r--
_feh
6.85
KB
-rw-r--r--
_fetchmail
554
B
-rw-r--r--
_ffmpeg
7.83
KB
-rw-r--r--
_figlet
1.47
KB
-rw-r--r--
_file_modes
862
B
-rw-r--r--
_file_systems
1.18
KB
-rw-r--r--
_files
3.97
KB
-rw-r--r--
_find
5.48
KB
-rw-r--r--
_find_net_interfaces
1.3
KB
-rw-r--r--
_finger
2.11
KB
-rw-r--r--
_flac
5.78
KB
-rw-r--r--
_flex
3.08
KB
-rw-r--r--
_fmt
1.93
KB
-rw-r--r--
_fold
713
B
-rw-r--r--
_fortune
601
B
-rw-r--r--
_fsh
546
B
-rw-r--r--
_fuser
2.44
KB
-rw-r--r--
_gcc
77.94
KB
-rw-r--r--
_gcore
1.68
KB
-rw-r--r--
_gdb
1.51
KB
-rw-r--r--
_gem
13.6
KB
-rw-r--r--
_genisoimage
1.96
KB
-rw-r--r--
_getconf
3.71
KB
-rw-r--r--
_getent
2.05
KB
-rw-r--r--
_getfacl
1.55
KB
-rw-r--r--
_getmail
1.05
KB
-rw-r--r--
_getopt
1.15
KB
-rw-r--r--
_ghostscript
4.17
KB
-rw-r--r--
_git
361.69
KB
-rw-r--r--
_global
3.11
KB
-rw-r--r--
_global_tags
186
B
-rw-r--r--
_gnu_generic
178
B
-rw-r--r--
_gnupod
5.57
KB
-rw-r--r--
_gnutls
12.32
KB
-rw-r--r--
_go
256
B
-rw-r--r--
_gpg
13.47
KB
-rw-r--r--
_gphoto2
5.02
KB
-rw-r--r--
_gprof
1.31
KB
-rw-r--r--
_gradle
6.82
KB
-rw-r--r--
_graphicsmagick
28.23
KB
-rw-r--r--
_grep
6.13
KB
-rw-r--r--
_groff
2.2
KB
-rw-r--r--
_groups
1007
B
-rw-r--r--
_growisofs
19.16
KB
-rw-r--r--
_gsettings
1.32
KB
-rw-r--r--
_guilt
1.52
KB
-rw-r--r--
_gzip
4.17
KB
-rw-r--r--
_have_glob_qual
910
B
-rw-r--r--
_head
1.65
KB
-rw-r--r--
_hexdump
1.3
KB
-rw-r--r--
_host
1.05
KB
-rw-r--r--
_hostname
2.47
KB
-rw-r--r--
_hosts
2.92
KB
-rw-r--r--
_iconv
2.8
KB
-rw-r--r--
_id
1.84
KB
-rw-r--r--
_ifconfig
3.08
KB
-rw-r--r--
_iftop
918
B
-rw-r--r--
_imagemagick
27.49
KB
-rw-r--r--
_init_d
3.48
KB
-rw-r--r--
_initctl
6.18
KB
-rw-r--r--
_install
4.49
KB
-rw-r--r--
_iostat
6.41
KB
-rw-r--r--
_ip
20.47
KB
-rw-r--r--
_ipsec
6.54
KB
-rw-r--r--
_irssi
1.32
KB
-rw-r--r--
_ispell
4.11
KB
-rw-r--r--
_java
24.6
KB
-rw-r--r--
_java_class
693
B
-rw-r--r--
_joe
2.19
KB
-rw-r--r--
_join
1.16
KB
-rw-r--r--
_jq
2.22
KB
-rw-r--r--
_killall
3.28
KB
-rw-r--r--
_knock
304
B
-rw-r--r--
_kvno
669
B
-rw-r--r--
_last
2.69
KB
-rw-r--r--
_ld_debug
1.18
KB
-rw-r--r--
_ldconfig
2.47
KB
-rw-r--r--
_ldd
1.62
KB
-rw-r--r--
_less
6.23
KB
-rw-r--r--
_lha
1.71
KB
-rw-r--r--
_libvirt
9.53
KB
-rw-r--r--
_links
8.66
KB
-rw-r--r--
_list_files
1.4
KB
-rw-r--r--
_lldb
2.62
KB
-rw-r--r--
_ln
3.52
KB
-rw-r--r--
_loadkeys
595
B
-rw-r--r--
_locale
2.81
KB
-rw-r--r--
_localedef
3.03
KB
-rw-r--r--
_locales
349
B
-rw-r--r--
_locate
4.15
KB
-rw-r--r--
_look
998
B
-rw-r--r--
_lp
8.47
KB
-rw-r--r--
_ls
8.99
KB
-rw-r--r--
_lsof
5.01
KB
-rw-r--r--
_lua
1.78
KB
-rw-r--r--
_luarocks
22.74
KB
-rw-r--r--
_lynx
11.73
KB
-rw-r--r--
_lz4
4.47
KB
-rw-r--r--
_lzop
3.84
KB
-rw-r--r--
_mail
467
B
-rw-r--r--
_mailboxes
5.88
KB
-rw-r--r--
_make
8.95
KB
-rw-r--r--
_man
17.23
KB
-rw-r--r--
_md5sum
1.75
KB
-rw-r--r--
_mencal
1.06
KB
-rw-r--r--
_mh
3.68
KB
-rw-r--r--
_mime_types
1.15
KB
-rw-r--r--
_mkdir
1.15
KB
-rw-r--r--
_mkfifo
618
B
-rw-r--r--
_mknod
1.34
KB
-rw-r--r--
_mktemp
1.55
KB
-rw-r--r--
_module
5.35
KB
-rw-r--r--
_monotone
2.32
KB
-rw-r--r--
_moosic
11.75
KB
-rw-r--r--
_mosh
1.72
KB
-rw-r--r--
_mount
38.36
KB
-rw-r--r--
_mpc
9.92
KB
-rw-r--r--
_mt
3.14
KB
-rw-r--r--
_mtools
3.99
KB
-rw-r--r--
_mtr
3.24
KB
-rw-r--r--
_mutt
1.35
KB
-rw-r--r--
_mv
2.1
KB
-rw-r--r--
_my_accounts
45
B
-rw-r--r--
_myrepos
4.22
KB
-rw-r--r--
_mysql_utils
9.75
KB
-rw-r--r--
_mysqldiff
1.03
KB
-rw-r--r--
_ncftp
429
B
-rw-r--r--
_net_interfaces
204
B
-rw-r--r--
_netcat
1.29
KB
-rw-r--r--
_netstat
12.27
KB
-rw-r--r--
_newsgroups
210
B
-rw-r--r--
_nginx
810
B
-rw-r--r--
_ngrep
1.7
KB
-rw-r--r--
_nice
246
B
-rw-r--r--
_nkf
2.1
KB
-rw-r--r--
_nl
1.83
KB
-rw-r--r--
_nm
5.81
KB
-rw-r--r--
_nmap
3.39
KB
-rw-r--r--
_npm
380
B
-rw-r--r--
_nslookup
5.54
KB
-rw-r--r--
_numfmt
1.54
KB
-rw-r--r--
_objdump
11.24
KB
-rw-r--r--
_object_files
235
B
-rw-r--r--
_od
2.9
KB
-rw-r--r--
_openstack
8.98
KB
-rw-r--r--
_other_accounts
64
B
-rw-r--r--
_pack
361
B
-rw-r--r--
_pandoc
20.65
KB
-rw-r--r--
_paste
575
B
-rw-r--r--
_patch
8.47
KB
-rw-r--r--
_patchutils
4.74
KB
-rw-r--r--
_path_commands
2.98
KB
-rw-r--r--
_path_files
27.43
KB
-rw-r--r--
_pax
2.72
KB
-rw-r--r--
_pbm
25.26
KB
-rw-r--r--
_pdf
416
B
-rw-r--r--
_perforce
100.47
KB
-rw-r--r--
_perl
5.26
KB
-rw-r--r--
_perl_basepods
716
B
-rw-r--r--
_perl_modules
4.57
KB
-rw-r--r--
_perldoc
2.28
KB
-rw-r--r--
_pgrep
6.48
KB
-rw-r--r--
_php
6.72
KB
-rw-r--r--
_picocom
2.11
KB
-rw-r--r--
_pids
1.79
KB
-rw-r--r--
_pine
2.88
KB
-rw-r--r--
_ping
7.65
KB
-rw-r--r--
_pkg-config
3.03
KB
-rw-r--r--
_pkg_instance
353
B
-rw-r--r--
_pkgadd
1012
B
-rw-r--r--
_pkginfo
613
B
-rw-r--r--
_pkgrm
551
B
-rw-r--r--
_pon
443
B
-rw-r--r--
_ports
285
B
-rw-r--r--
_postfix
6.66
KB
-rw-r--r--
_postgresql
46.74
KB
-rw-r--r--
_postscript
333
B
-rw-r--r--
_printenv
114
B
-rw-r--r--
_printers
3.13
KB
-rw-r--r--
_process_names
1.22
KB
-rw-r--r--
_prove
2.44
KB
-rw-r--r--
_ps
8.39
KB
-rw-r--r--
_pspdf
326
B
-rw-r--r--
_psutils
3.69
KB
-rw-r--r--
_pump
1.41
KB
-rw-r--r--
_pv
4.29
KB
-rw-r--r--
_pwgen
1.53
KB
-rw-r--r--
_pydoc
858
B
-rw-r--r--
_python
2.11
KB
-rw-r--r--
_python_modules
1.09
KB
-rw-r--r--
_qemu
2.55
KB
-rw-r--r--
_quilt
8.67
KB
-rw-r--r--
_rake
2.78
KB
-rw-r--r--
_ranlib
403
B
-rw-r--r--
_rar
4.46
KB
-rw-r--r--
_rclone
24.33
KB
-rw-r--r--
_rcs
766
B
-rw-r--r--
_readelf
3.7
KB
-rw-r--r--
_readlink
1.71
KB
-rw-r--r--
_remote_files
2.69
KB
-rw-r--r--
_renice
424
B
-rw-r--r--
_ri
3.71
KB
-rw-r--r--
_rlogin
1.84
KB
-rw-r--r--
_rm
2.18
KB
-rw-r--r--
_rmdir
606
B
-rw-r--r--
_route
7.32
KB
-rw-r--r--
_rrdtool
591
B
-rw-r--r--
_rsync
13.44
KB
-rw-r--r--
_rubber
2.66
KB
-rw-r--r--
_ruby
6.12
KB
-rw-r--r--
_runit
2.15
KB
-rw-r--r--
_samba
6.19
KB
-rw-r--r--
_sccs
6.04
KB
-rw-r--r--
_scons
4.08
KB
-rw-r--r--
_screen
6.91
KB
-rw-r--r--
_script
2.53
KB
-rw-r--r--
_seafile
1.12
KB
-rw-r--r--
_sed
10.03
KB
-rw-r--r--
_seq
930
B
-rw-r--r--
_service
1.31
KB
-rw-r--r--
_services
951
B
-rw-r--r--
_setfacl
2
KB
-rw-r--r--
_sh
327
B
-rw-r--r--
_shasum
1.03
KB
-rw-r--r--
_showmount
428
B
-rw-r--r--
_shred
987
B
-rw-r--r--
_shuf
978
B
-rw-r--r--
_shutdown
2.1
KB
-rw-r--r--
_signals
1.09
KB
-rw-r--r--
_sisu
3.85
KB
-rw-r--r--
_slrn
1.1
KB
-rw-r--r--
_smartmontools
4.4
KB
-rw-r--r--
_socket
1.06
KB
-rw-r--r--
_sort
3.72
KB
-rw-r--r--
_spamassassin
475
B
-rw-r--r--
_split
2.83
KB
-rw-r--r--
_sqlite
3.48
KB
-rw-r--r--
_sqsh
2.11
KB
-rw-r--r--
_ssh
28.6
KB
-rw-r--r--
_ssh_hosts
1.08
KB
-rw-r--r--
_stat
3.16
KB
-rw-r--r--
_stdbuf
674
B
-rw-r--r--
_stgit
1.26
KB
-rw-r--r--
_stow
3.27
KB
-rw-r--r--
_strings
2.43
KB
-rw-r--r--
_strip
4.09
KB
-rw-r--r--
_stty
776
B
-rw-r--r--
_su
3.34
KB
-rw-r--r--
_subversion
18.08
KB
-rw-r--r--
_sudo
3.24
KB
-rw-r--r--
_surfraw
17.72
KB
-rw-r--r--
_swaks
3.38
KB
-rw-r--r--
_swanctl
9.98
KB
-rw-r--r--
_swift
5.82
KB
-rw-r--r--
_sys_calls
558
B
-rw-r--r--
_sysctl
3.72
KB
-rw-r--r--
_tac
542
B
-rw-r--r--
_tail
2.88
KB
-rw-r--r--
_tar
6.37
KB
-rw-r--r--
_tar_archive
1
KB
-rw-r--r--
_tardy
678
B
-rw-r--r--
_tcpdump
8.49
KB
-rw-r--r--
_tcptraceroute
583
B
-rw-r--r--
_tee
956
B
-rw-r--r--
_telnet
2.84
KB
-rw-r--r--
_terminals
230
B
-rw-r--r--
_tex
1.92
KB
-rw-r--r--
_texi
129
B
-rw-r--r--
_texinfo
16.12
KB
-rw-r--r--
_tidy
3.63
KB
-rw-r--r--
_tiff
10.47
KB
-rw-r--r--
_tilde_files
785
B
-rw-r--r--
_time_zone
222
B
-rw-r--r--
_timeout
815
B
-rw-r--r--
_tin
2.14
KB
-rw-r--r--
_tla
17.58
KB
-rw-r--r--
_tmux
63.42
KB
-rw-r--r--
_todo.sh
4.48
KB
-rw-r--r--
_toilet
868
B
-rw-r--r--
_top
7.46
KB
-rw-r--r--
_topgit
177
B
-rw-r--r--
_totd
287
B
-rw-r--r--
_touch
1.53
KB
-rw-r--r--
_tput
488
B
-rw-r--r--
_tr
1.47
KB
-rw-r--r--
_transmission
20.55
KB
-rw-r--r--
_tree
2.78
KB
-rw-r--r--
_truss
3.05
KB
-rw-r--r--
_tty
436
B
-rw-r--r--
_ttys
704
B
-rw-r--r--
_twidge
1.67
KB
-rw-r--r--
_twisted
1.34
KB
-rw-r--r--
_umountable
1.42
KB
-rw-r--r--
_unace
472
B
-rw-r--r--
_uname
2.96
KB
-rw-r--r--
_unexpand
1.1
KB
-rw-r--r--
_uniq
1.5
KB
-rw-r--r--
_unison
5.39
KB
-rw-r--r--
_units
2.75
KB
-rw-r--r--
_uptime
696
B
-rw-r--r--
_urls
5.91
KB
-rw-r--r--
_user_admin
6.24
KB
-rw-r--r--
_user_at_host
729
B
-rw-r--r--
_users
240
B
-rw-r--r--
_users_on
253
B
-rw-r--r--
_vcsh
2.33
KB
-rw-r--r--
_vim
6.89
KB
-rw-r--r--
_visudo
545
B
-rw-r--r--
_vmstat
4.47
KB
-rw-r--r--
_vorbis
8.57
KB
-rw-r--r--
_vpnc
3.14
KB
-rw-r--r--
_w
1.37
KB
-rw-r--r--
_w3m
4.43
KB
-rw-r--r--
_watch
1.47
KB
-rw-r--r--
_wc
793
B
-rw-r--r--
_webbrowser
205
B
-rw-r--r--
_wget
11.13
KB
-rw-r--r--
_whereis
36
B
-rw-r--r--
_who
2.36
KB
-rw-r--r--
_whois
4.73
KB
-rw-r--r--
_wiggle
1.09
KB
-rw-r--r--
_xargs
2.79
KB
-rw-r--r--
_xmlsoft
6.67
KB
-rw-r--r--
_xmlstarlet
7.29
KB
-rw-r--r--
_xmms2
5.26
KB
-rw-r--r--
_xxd
2.16
KB
-rw-r--r--
_xz
4.31
KB
-rw-r--r--
_yafc
1.78
KB
-rw-r--r--
_yodl
658
B
-rw-r--r--
_yp
3.18
KB
-rw-r--r--
_zcat
115
B
-rw-r--r--
_zdump
112
B
-rw-r--r--
_zfs
18.02
KB
-rw-r--r--
_zfs_dataset
2.69
KB
-rw-r--r--
_zfs_keysource_props
408
B
-rw-r--r--
_zfs_pool
51
B
-rw-r--r--
_zip
9.51
KB
-rw-r--r--
_zpool
9.53
KB
-rw-r--r--
_zsh
696
B
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : _tmux
#compdef tmux # tmux <http://tmux.github.io> completion for zsh <http://zsh.sf.net>. # # Configuration: # # - On some OSs, the directory for tmux's server sockets may not be # the default (which is /tmp/tmux-<uid>/), but say # /var/run/tmux/tmux-<uid>, in which case the completion for # 'tmux -L <tab>' will not be able to find the sockets in the default # location (debian does this, for instance); tell _tmux the right place # to look: # % zstyle ':completion:*:*:tmux:*:sockets' socketdir "/var/run/tmux/tmux-${UID}" # # - tmux knows a *lot* of sub-commands, hence 'tmux <tab>' returns a lot # of possible completions. _tmux knows about all commands and their aliases. # By default, both are offered. If you do not care about the aliases, do this: # % zstyle ':completion:*:*:tmux:*:subcommands' mode 'commands' # # The same can be done to only return aliases by setting the above style # to 'aliases'. The default value is 'both' (but actually every value # different from 'commands' and 'aliases' will have the same effect). # # 'lsw' is an alias for 'list-windows' for example; note that not all # commands have aliases. So probably, either the default 'both' or # 'commands' makes most sense for this style. # # - For finer grained control over what is suggested as possible completions, # the 'ignored-patterns' style may be used; suppose you think that only # '*-window' or '*-windows' are worth being completed. You would get that # behaviour like this: # % zstyle ':completion:*:*:tmux:*:subcommands' ignored-patterns '^*-window(|s)' # # Some tmux commands currently do not work if called from a shell prompt, # so it would make sense to ignore them per default (at the time of writing, # those commands are choose-{session,client,window}, confirm-before and # find-window. This would ignore them: # % zstyle ':completion:*:*:tmux:*:subcommands' ignored-patterns \ # 'choose-*' 'confirm-before' 'find-window' # # The configuration for subcommand completions may be done in # this context: ':completion:*:*:tmux-<sub-command>:*:*' # # TODO: # # - 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. typeset -ga _tmux_commands=() _tmux_aliases=() typeset -gA _tmux_aliasmap _tmux_aliasmap=( # clients and sessions attach attach-session detach detach-client has has-session lockc lock-client locks lock-session lsc list-clients lscm list-commands ls list-sessions new new-session refresh refresh-client rename rename-session showmsgs show-messages source source-file start start-server suspendc suspend-client switchc switch-client # windows and panes breakp break-pane capturep capture-pane displayp display-panes 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 resizew resize-window respawnp respawn-pane respawnw respawn-window rotatew rotate-window selectl select-layout selectp select-pane selectw select-window splitw split-window swapp swap-pane swapw swap-window unlinkw unlink-window # key bindings bind bind-key lsk list-keys send send-keys unbind unbind-key # options set set-option setw set-window-option show show-options showw show-window-options # environment setenv set-environment showenv show-environment # status line confirm confirm-before display display-message # buffers clearhist clear-history deleteb delete-buffer lsb list-buffers loadb load-buffer pasteb paste-buffer saveb save-buffer setb set-buffer showb show-buffer # miscellaneous if if-shell lock lock-server run run-shell info server-info wait wait-for ) # --- Sub-command functions --- # These *must* be called _tmux-*(); The description generation relies on # them being named that way. *No* other functions may match that pattern. # Other utility functions should be named __tmux-*() (see below). # # Another thing, the description generation needs, is handling of # $tmux_describe: If that parameter is non-empty, the sub-command function # should only print a description of the sub-command it handles and return # immediately after doing so. # # To add support for a new sub-command, you only have to add a new # _tmux-<foo>() function below (preferably alphabetically sorted), that # behaves like described above; and add a alias->command pair in the # _tmux_aliasmap associative array above (if the command in fact has an # alias). The rest should just work[tm]. _tmux-attach-session() { [[ -n ${tmux_describe} ]] && print "attach or switch to a session" && return _arguments -s \ '-c+[specify working directory for the session]:directory:_directories' \ '-d[detach other clients attached to target session]' \ '-r[put the client into read-only mode]' \ '-t+[specify target session]:target session: __tmux-sessions-separately' \ "-E[don't apply update-environment option]" } _tmux-bind-key() { [[ -n ${tmux_describe} ]] && print "bind a key to a command" && return _arguments -s -A "-*" \ '-c[bind to command mode instead of normal mode]' \ '-n[make the binding work without the need for the prefix key]' \ '-r[the key may repeat]' \ '-T+[specify key table for the binding]:key table' \ '1:key' \ '*:::template:= _tmux' } _tmux-break-pane() { [[ -n ${tmux_describe} ]] && print "break a pane from an existing into a new window" && return _arguments -s \ "-d[don't make the new window become the active one]" \ '-F+[specify output format]:format:__tmux-formats' \ '-P[print information of new window after it has been created]' \ '-n+[specify window name]:name' \ '-s+[specify source pane]:pane:__tmux-panes' \ '-t+[specify destination window]:pane:__tmux-panes' } _tmux-capture-pane() { [[ -n ${tmux_describe} ]] && print "capture the contents of a pane to a buffer" && return _arguments -s \ '-a[use alternate screen]' \ '(-p)-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]:line number (- means last line)' \ '-J[join wrapped lines and preserve trailing space]' \ '-q[ignore errors when trying to access alternate screen]' \ '(-b)-p[print data to stdout]' \ '-P[only capture beginnings of as-yet incomplete escape sequences]' \ '-S[specify start line to capture]:first line (- means start of scrollback)' \ '-t+[choose source pane]:source pane:__tmux-panes' } _tmux-choose-buffer() { [[ -n ${tmux_describe} ]] && print "put a pane into buffer choice mode" && return _arguments -s \ '-N[start without the preview]' \ '-F+[specify format for each list item]:format:__tmux-formats' \ '-f+[filter items]:filter format:__tmux-formats' \ '-O+[initial sort order]:order:(time name size)' \ '-t+[specify target window]:session:__tmux-windows' \ '*:::template:= _tmux' } _tmux-choose-client() { [[ -n ${tmux_describe} ]] && print "put a window into client choice mode" && return _arguments -s \ '-N[start without the preview]' \ '-F+[specify format for each list item]:format:__tmux-formats' \ '-f+[filter items]:filter format:__tmux-formats' \ '-O+[initial sort order]:order:(time name size)' \ '-t+[specify target window]:session:__tmux-windows' \ '*:::template:= _tmux' } _tmux-choose-tree() { [[ -n ${tmux_describe} ]] && print "put a window into tree choice mode" && return _arguments -s \ '-G[include all sessions in any session groups in the tree rather than only the first]' \ '-N[start without the preview]' \ '-F+[specify format for each list item]:format:__tmux-formats' \ '-f+[filter items]:filter format:__tmux-formats' \ '-O+[initial sort order]:order:(time name size)' \ '-s[choose among sessions]' \ '-t+[specify target window]:session:__tmux-windows' \ '-w[choose among windows]' \ '*:::template:= _tmux' } _tmux-clear-history() { [[ -n ${tmux_describe} ]] && print "remove and clear history for a pane" && return _arguments '-t+[specify target pane]:pane:__tmux-panes' } _tmux-clock-mode() { [[ -n ${tmux_describe} ]] && print "enter clock mode" && return _arguments '-t+[specify target pane]:pane:__tmux-panes' } _tmux-command-prompt() { [[ -n ${tmux_describe} ]] && print "open the tmux command prompt in a client" && return _arguments -s \ '-1[only accept one key press]' \ '-N' \ '-i[execute the command every time the prompt input changes]' \ '-I+[specify list of initial inputs]:initial-text (comma-separated list)' \ '-p+[specify list of prompts]:prompts (comma-separated list)' \ '-t+[specify target client]:client:__tmux-clients' \ '*:::template:= _tmux' } _tmux-confirm-before() { [[ -n ${tmux_describe} ]] && print "run a command but ask for confirmation before" && return _arguments -s \ '-p+[specify prompt]:prompt string' \ '-t+[specify target client]:client:__tmux-clients' \ '*:::command:= _tmux' } _tmux-copy-mode() { [[ -n ${tmux_describe} ]] && print "enter copy mode" && return _arguments -s \ '-t+[specify target pane]:pane:__tmux-panes' \ '-u[scroll up one page]' \ '-M[begin a mouse drag]' } _tmux-delete-buffer() { [[ -n ${tmux_describe} ]] && print "delete a paste buffer" && return _arguments '-b+[specify target buffer name]:buffer:__tmux-buffers' } _tmux-detach-client() { [[ -n ${tmux_describe} ]] && print "detach a client from the server" && return _arguments -s \ '-a[kill all clients except for the named by -t]' \ '-P[send SIGHUP to parent process]' \ '-E+[run specified shell command to replace the client]:shell command:_cmdstring' \ '-s+[specify target session and kill its clients]:session:__tmux-sessions-attached' \ '-t+[specify target client]:client:__tmux-clients' } _tmux-display-message() { [[ -n ${tmux_describe} ]] && print "display a message in the status line" && return _arguments -s -S -A "-*" \ '(-p -F :)-a[list the format variables and their values]' \ '-c+[specify target client]:client:__tmux-clients' \ '(-a)-p[print message to stdout]' \ '-t+[specify target pane]:pane:__tmux-panes' \ '(-a)-F+[specify output format]:format:__tmux-formats' \ '(-a)-v[prints verbose logging as the format is parsed]' \ ':message' } _tmux-display-panes() { [[ -n ${tmux_describe} ]] && print "display an indicator for each visible pane" && return _arguments -S \ "-b[don't block other commands until indicator is closed]" \ '-d+[time to show indicator for]:duration (ms)' \ '-t+[specify target client]:client:__tmux-clients' \ '*:::command:= _tmux' } _tmux-find-window() { [[ -n ${tmux_describe} ]] && print "search for a pattern in windows" && return _arguments -s \ '-C[match visible contents]' \ '-N[match window name]' \ '-T[match window title]' \ '-t+[specify target window]:window:__tmux-windows' \ '-Z[zoom the pane]' \ ':window search pattern' } _tmux-has-session() { [[ -n ${tmux_describe} ]] && print "check and report if a session exists on the server" && return _arguments '-t+[specify target session]:session:__tmux-sessions' } _tmux-if-shell() { [[ -n ${tmux_describe} ]] && print "execute a tmux command if a shell-command succeeded" && return local curcontext="$curcontext" state line ret=1 _arguments -C -s \ '-b[run shell command in background]' \ "-F[don't execute shell command but use it as a string-value]" \ '-t+[specify target pane]:pane:__tmux-panes' \ '1:shell command:_cmdstring' \ '2:tmux command (success):->tmuxcmd' \ '3:tmux command (failure):->tmuxcmd' && ret=0 if [[ -n $state ]]; then compset -q _tmux && ret=0 fi } _tmux-join-pane() { [[ -n ${tmux_describe} ]] && print "split a pane and move an existing one into the new space" && return _arguments -s \ '-b[join source pane left of or above target pane]' \ "-d[don't 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+[specify source pane]:pane:__tmux-panes' \ '-t+[specify target pane]:pane:__tmux-panes' } _tmux-kill-pane() { [[ -n ${tmux_describe} ]] && print "destroy a given pane" && return _arguments -s \ '-a[kill all panes except the one specified by -t]' \ '-t+[specify target pane]:pane:__tmux-panes' } _tmux-kill-server() { [[ -n ${tmux_describe} ]] && print "kill clients, sessions and server" && return __tmux-nothing-else } _tmux-kill-session() { [[ -n ${tmux_describe} ]] && print "destroy a given session" && return _arguments -s \ '-a[kill all session except the one specified by -t]' \ '-t+[specify target session]:session:__tmux-sessions' \ '-C[clear alerts (bell, activity, silence) in all windows linked to the session]' } _tmux-kill-window() { [[ -n ${tmux_describe} ]] && print "destroy a given window" && return _arguments -s \ '-a[kill all windows except the one specified by -t]' \ '-t+[specify target window]:window:__tmux-windows' } _tmux-last-pane() { [[ -n ${tmux_describe} ]] && print "select the previously selected pane" && return _arguments -s \ '-d[disable input to the pane]' \ '-e[enable input to the pane]' \ '-t+[specify session]:session:__tmux-sessions' } _tmux-last-window() { [[ -n ${tmux_describe} ]] && print "select the previously selected window" && return _arguments '-t+[specify session]:session:__tmux-sessions' } _tmux-link-window() { [[ -n ${tmux_describe} ]] && print "link a window to another" && return _arguments -s \ "-d[don't make the new window become the active one]" \ '-k[kill the target window if it exists]' \ '-s+[specify source window]:window:__tmux-windows' \ '-t+[specify destination window]:window:__tmux-windows' } _tmux-list-buffers() { [[ -n ${tmux_describe} ]] && print "list paste buffers of a session" && return _arguments '-F+[specify output format]:format:__tmux-formats' } _tmux-list-clients() { [[ -n ${tmux_describe} ]] && print "list clients attached to server" && return _arguments -s \ '-F+[specify output format]:format:__tmux-formats' \ '-t+[specify session]:session:__tmux-sessions' } _tmux-list-commands() { [[ -n ${tmux_describe} ]] && print "list supported sub-commands" && return _arguments '-F+[specify format]:format' } _tmux-list-keys() { [[ -n ${tmux_describe} ]] && print "list all key-bindings" && return _arguments -s \ '-T+[specify key table]:key table' } _tmux-list-panes() { [[ -n ${tmux_describe} ]] && print "list panes of a window" && return local -a args if (( ${+words[(r)-*s*]} )); then args=( '-t+[specify target session]:session:__tmux-sessions' ) else args=( '-t+[specify target window]:window:__tmux-windows' ) fi _arguments -s $args \ '-a[list all panes the server possesses]' \ '-F+[specify output format]:format:__tmux-formats' \ '-s[if specified, -t chooses a session]' } _tmux-list-sessions() { [[ -n ${tmux_describe} ]] && print "list sessions managed by server" && return _arguments '-F+[specify output format]:format:__tmux-formats' } _tmux-list-windows() { [[ -n ${tmux_describe} ]] && print "list windows of a session" && return _arguments -s \ '-a[list all windows the tmux server possesses]' \ '-F[specify output format]:format:__tmux-formats' \ '-t+[specify session]:session:__tmux-sessions' } _tmux-load-buffer() { [[ -n ${tmux_describe} ]] && print "load a file into a paste buffer" && return _arguments -A "-*" -S \ '-b+[specify target buffer name]:buffer:__tmux-buffers' \ '1:file:_files' } _tmux-lock-client() { [[ -n ${tmux_describe} ]] && print "lock a client" && return _arguments '-t+[specify client]:client:__tmux-clients' } _tmux-lock-server() { [[ -n ${tmux_describe} ]] && print "lock all clients attached to the server" && return __tmux-nothing-else } _tmux-lock-session() { [[ -n ${tmux_describe} ]] && print "lock all clients attached to a session" && return _arguments '-t+[specify session]:session:__tmux-sessions' } _tmux-move-pane() { [[ -n ${tmux_describe} ]] && print "move a pane into a new space" && return _arguments -s \ '-b[join source pane left of or above target pane]' \ "-d[don't make the new window become the active one]" \ '-h[split horizontally]' \ '-v[split vertically]' \ "-l+[define new pane's size]:numeric value" \ "-p+[define new pane's size in percent]:numeric value" \ '-s+[specify source pane]:pane:__tmux-panes' \ '-t+[specify target pane]:pane:__tmux-panes' } _tmux-move-window() { [[ -n ${tmux_describe} ]] && print "move a window to another" && return _arguments -s \ "-d[don't make the new window become the active one]" \ '-k[kill the target window if it exists]' \ '-s+[specify source window]:window:__tmux-windows' \ '-r[renumber windows in session in sequential order]' \ '-t+[specify destination window]:window:__tmux-windows' } _tmux-new-session() { [[ -n ${tmux_describe} ]] && print "create a new session" && return _arguments -s -A "-*" -S \ '-A[attach to existing session if it already exists]' \ '-c+[specify working directory for the session]:directory:_directories' \ "-d[don't attach new session to current terminal]" \ "-D[in case of -A behave like attach-session's -d]" \ "-E[don't apply update-environment option]" \ '-F+[specify output format]:format:__tmux-formats' \ '-n+[specify initial window name]:window name' \ '-P[print information about new session after it is created]' \ '-s+[name the session]:session name:__tmux-sessions' \ '-t+[specify target session]:session:__tmux-sessions' \ '-x[specify width]:width' \ '-y[specify height]:height' \ '*:: :_cmdambivalent' } _tmux-new-window() { [[ -n ${tmux_describe} ]] && print "create a new window" && return _arguments -s -A "-*" -S \ '-a[insert new window at next free index from -t]' \ '-c+[specify working directory for the session]:directory:_directories' \ "-d[don't make the new window become the active one]" \ '-F+[specify output format]:format:__tmux-formats' \ '-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]:window:__tmux-windows' \ '*:: :_cmdambivalent' } _tmux-next-layout() { [[ -n ${tmux_describe} ]] && print "move a window to the next layout" && return _arguments '-t+[specify target window]:window:__tmux-windows' } _tmux-next-window() { [[ -n ${tmux_describe} ]] && print "move to the next window in a session" && return _arguments -s \ '-a[move to the next window with an alert]' \ '-t+[specify target session]:session:__tmux-sessions' } _tmux-paste-buffer() { [[ -n ${tmux_describe} ]] && print "insert a paste buffer into the window" && return _arguments -s \ '-b+[specify buffer]:source buffer:__tmux-buffers' \ '-d[remove buffer from stack after pasting]' \ '-p[use bracketed paste mode if the application requested it]' \ "-r[don't replace LF with CR when pasting]" \ '-s+[specify separator]:separator' \ '-t+[specify target window]:window:__tmux-windows' } _tmux-pipe-pane() { [[ -n ${tmux_describe} ]] && print "pipe output from a pane to a shell command" && return _arguments -s -A "-*" -S \ '-I[write stdout from command to the pane as if it were typed]' \ '-O[pipe output from the pane to the command (default unless -I used)]' \ '-o[only open a pipe if none is currently opened]' \ '-t+[specify target pane]:pane:__tmux-panes' \ ':shell command:_cmdstring' } _tmux-previous-layout() { [[ -n ${tmux_describe} ]] && print "move a window to the previous layout" && return _arguments '-t+[specify target window]:window:__tmux-windows' } _tmux-previous-window() { [[ -n ${tmux_describe} ]] && print "move to the previous window in a session" && return _arguments -s \ '-a[move to the previous window with an alert]' \ '-t+[specify target session]:session:__tmux-sessions' } _tmux-refresh-client() { [[ -n ${tmux_describe} ]] && print "refresh a client" && return _arguments -s -S -A "-*" \ '-C+[set the width and height of a control client]:width,height' \ '-c[reset so that the position follows the cursor]' \ '-D[move visible portion of window down]' \ '-L[move visible portion of window left]' \ '-l[request clipboard from the client and store it in a new paste buf using xterm(1) escape sequence]' \ "-S[only update the client's status bar]" \ '-t+[specify target client]:client:__tmux-clients' \ '-R[move visible portion of window right]' \ '-U[move visible portion of window up]' \ ': :_guard "[0-9]#" "adjustment"' } _tmux-rename-session() { [[ -n ${tmux_describe} ]] && print "rename a session" && return _arguments -s -A "-*" -S \ '-t+[specify target session]:session:__tmux-sessions' \ ':new session name' } _tmux-rename-window() { [[ -n ${tmux_describe} ]] && print "rename a window" && return _arguments -s -A "-*" -S \ '-t+[specify target window]:window:__tmux-windows' \ ':new window name' } _tmux-resize-pane() { [[ -n ${tmux_describe} ]] && print "resize a pane" && return _arguments -s -A "-*" -S \ '-D[resize downward]' \ '-L[resize to the left]' \ '-M[begin mouse resizing]' \ '-R[resize to the right]' \ '-U[resize upward]' \ '-t+[specify target pane]:pane:__tmux-panes' \ '-x+[specify width]:width' \ '-y+[specify height]:height' \ '-Z[toggle zoom of pane]' \ ': :_guard "[0-9]#" "adjustment"' } _tmux-resize-window() { [[ -n ${tmux_describe} ]] && print "resize a window" && return _arguments -s -A "-*" -S : \ '-A[set size of largest session containing the window]' \ '-a[set size of smallest session containing the window]' \ '-D[resize downward]' \ '-L[resize to the left]' \ '-R[resize to the right]' \ '-U[resize upward]' \ '-t+[specify target pane]:pane:__tmux-windows' \ '-x+[specify width]:width' \ '-y+[specify height]:height' \ ': :_guard "[0-9]#" "adjustment"' } _tmux-respawn-pane() { [[ -n ${tmux_describe} ]] && print "reuse a pane in which a command has exited" && return _arguments -s -A "-*" -S \ '-c+[specify a new working directory for the pane]:directory:_directories' \ '-k[kill window if it is in use]' \ '-t+[specify target pane]:pane:__tmux-pane' \ ':command:_cmdambivalent' } _tmux-respawn-window() { [[ -n ${tmux_describe} ]] && print "reuse a window in which a command has exited" && return _arguments -s -A "-*" -S \ '-c+[specify a new working directory for the window]:directory:_directories' \ '-k[kill window if it is in use]' \ '-t+[specify target window]:window:__tmux-windows' \ ':command:_cmdambivalent' } _tmux-rotate-window() { [[ -n ${tmux_describe} ]] && print "rotate positions of panes in a window" && return _arguments -s \ '-D[rotate downward]' \ '-U[rotate upward]' \ '-t+[specify target window]:window:__tmux-windows' } _tmux-run-shell() { [[ -n ${tmux_describe} ]] && print "execute a command without creating a new window" && return _arguments -s -A "-*" -S \ '-b[run shell command in background]' \ '-t+[specify target pane]:pane:__tmux-panes' \ ':command:_cmdstring' } _tmux-save-buffer() { [[ -n ${tmux_describe} ]] && print "save a paste buffer to a file" && return _arguments -s \ '-a[append to rather than overwriting file]' \ '-b+[specify a target buffer index]:buffer:__tmux-buffers' } _tmux-select-layout() { [[ -n ${tmux_describe} ]] && print "choose a layout for a pane" && return _arguments -s -A "-*" -S \ '-E[spread the current pane and any panes next to it out evenly]' \ '-n[behave like next-layout]' \ '-o[revert to previous layout]' \ '-p[behave like previous-layout]' \ '-t+[specify a target pane]:target pane:__tmux-panes' \ ':layout:(even-horizontal even-vertical main-horizontal main-vertical tiled)' } _tmux-select-pane() { [[ -n ${tmux_describe} ]] && print "make a pane the active one in the window" && return _arguments -s \ '-D[move to the pane below target]' \ '-d[disable input to the pane]' \ '-e[enable input to the pane]' \ '-g[show current pane style]' \ '-l[behave like last-pane]' \ '-L[move to the pane left of target]' \ '-M[clear marked pane]' \ '-m[set marked pane]' \ '-R[move to the pane right of target]' \ '-U[move to the pane above target]' \ '-P+[set pane style]:style:__tmux-style' \ '-T+[set the pane title]:title' \ '-t+[specify target pane]:pane:__tmux-panes' } _tmux-select-window() { [[ -n ${tmux_describe} ]] && print "select a window" && return _arguments -s \ '-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+[specify target window]:window:__tmux-windows' } _tmux-send-keys() { [[ -n ${tmux_describe} ]] && print "send key(s) to a window" && return _arguments -s -A "-*" -S \ '-l[disable key name lookup and send data literally]' \ '-R[reset terminal state]' \ '-M[pass through a mouse event]' \ '-X[send a command into copy mode]' \ '-N+[specify repeat count]:repeat count' \ '-t+[specify target pane]:pane:__tmux-panes' \ '*:key' } _tmux-send-prefix() { [[ -n ${tmux_describe} ]] && print "send the prefix key to a window" && return _arguments -s \ '-2[send secondary prefix key]' \ '-t+[specify target pane]:pane:__tmux-panes' } _tmux-server-info() { [[ -n ${tmux_describe} ]] && print "show server information" && return __tmux-nothing-else } _tmux-set-buffer() { [[ -n ${tmux_describe} ]] && print "set contents of a paster buffer" && return _arguments -s -A "-*" -S \ '-a[append to rather than overwriting target buffer]' \ '-b+[specify target buffer index]:pane:__tmux-buffers' \ '-n+[specify new buffer name]:buffer-name' \ ':data' } _tmux-set-environment() { [[ -n ${tmux_describe} ]] && print "(un)set an environment variable" && return local mode=session action=add local curcontext="$curcontext" state line ret=1 typeset -A opt_args _arguments -C -s -A "-*" -S : \ '(-t)-g[modify global environment]' \ '(-u)-r[remove variable before starting new processes]' \ '(-r)-u[unset a variable]' \ '(-g)-t[specify target session]:target session:__tmux-sessions' \ ': :->name' '(-u -r)2: :->value' && ret=0 if (( ${+opt_args[-g]} )); then mode=global fi if (( ${+opt_args[-u]} )); then action=unset fi if (( ${+opt_args[-r]} )); then action=remove fi # TODO: the exclusion "(-g -r)2:" doesn't work, so simulate it here if [[ $action == (remove|unset) ]] && [[ $state == value ]]; then __tmux-nothing-else else __tmux-environment-variables $mode $state $action && ret=0 fi return ret } _tmux-set-option() { [[ -n ${tmux_describe} ]] && print "set a session option" && return local mode=session local curcontext="$curcontext" state line ret=1 typeset -A opt_args _arguments -C -s : \ '-a[append to string options]' \ '-F[expand formats in the option value]' \ '-g[set a global session option]' \ '-o[prevent setting of an option that is already set]' \ '-q[suppress errors about unknown or ambiguous options]' \ '-u[unset a non-global option]' \ '-w[change window (not session) options]' \ '-s[change server (not session) options]' \ '-t+[specify target session]:target session:__tmux-sessions' \ '*:: :->name_or_value' && ret=0 if (( ${+opt_args[-w]} )); then mode=window elif (( ${+opt_args[-s]} )); then mode=server fi __tmux-options-complete ${mode} ${state} && ret=0 return ret } _tmux-set-window-option() { [[ -n ${tmux_describe} ]] && print "set a window option" && return local curcontext="$curcontext" state line ret=1 typeset -A opt_args _arguments -C -s : \ '-a[append to string options]' \ '-F[expand formats in the option value]' \ '-g[set a global window option]' \ '-o[prevent setting of an option that is already set]' \ '-q[suppress errors about unknown or ambiguous options]' \ '-u[unset a non-global option]' \ '-t+[specify target window]:target window:__tmux-windows' \ '*:: :->name_or_value' && ret=0 __tmux-options-complete window ${state} && ret=0 return ret } _tmux-set-hook() { [[ -n ${tmux_describe} ]] && print "set a hook to a command" && return _arguments -s \ '(-R)-g[add hook to global list]' \ '(-g -u)-R[run hook immediately]' \ '(-R)-u[unset a hook]' \ '-t+[specify target session]:session:__tmux-sessions' \ ':hook name:_tmux_hooks' \ '*:::command:= _tmux' } _tmux-show-hooks() { [[ -n ${tmux_describe} ]] && print "show the global list of hooks" && return _arguments -s -S -A "-*" \ '-g[show global list of hooks]' \ '-t+[specify target session]:session:__tmux-sessions' \ } _tmux-show-buffer() { [[ -n ${tmux_describe} ]] && print "display the contents of a paste buffer" && return _arguments '-b[specify target buffer index]:pane:->buffer' } _tmux-show-environment() { [[ -n ${tmux_describe} ]] && print "display the environment" && return local mode=session local curcontext="$curcontext" state line ret=1 typeset -A opt_args _arguments -C -A "-*" -s : \ '(-t)-g[show global environment]' \ '-s[format output as Bourne shell commands]' \ '(-g)-t+[specify target session]:target session:__tmux-sessions' \ '1:: :->name' && ret=0 if (( ${+opt_args[-g]} )); then mode=global fi __tmux-environment-variables $mode $state show && ret=0 return ret } _tmux-show-messages() { [[ -n ${tmux_describe} ]] && print "show client's message log" && return _arguments -s \ '-J[show debugging information about running jobs]' \ '-T[show debugging information about involved terminals]' \ '-t+[specify target client]:client:__tmux-clients' } _tmux-show-options() { [[ -n ${tmux_describe} ]] && print "show session options" && return local mode=session local curcontext="$curcontext" state line ret=1 typeset -A opt_args _arguments -C -s : \ '-g[show global options]' \ '-q[suppress errors about unknown or ambiguous options]' \ '-s[show server options]' \ '-v[show only the option value, not the name]' \ '-w[show window options]' \ '-t+[specify target session]:target session:__tmux-sessions' \ '*:: :->name_or_value' && ret=0 if (( ${+opt_args[-w]} )); then mode=window elif (( ${+opt_args[-s]} )); then mode=server fi __tmux-options-complete ${mode} ${state} && ret=0 return ret } _tmux-show-window-options() { [[ -n ${tmux_describe} ]] && print "show window options" && return local curcontext="$curcontext" state line ret=1 typeset -A opt_args _arguments -C -s : \ '-g[show global options]' \ '-v[show only the option value, not the name]' \ '-t+[specify target window]:target window:__tmux-windows' \ '*:: :->name_or_value' && ret=0 __tmux-options-complete window ${state} && ret=0 return ret } _tmux-source-file() { [[ -n ${tmux_describe} ]] && print "execute tmux commands from a file" && return _arguments \ "-q[don't report error if path doesn't exist]" \ '*:path:_directories' } _tmux-split-window() { [[ -n ${tmux_describe} ]] && print "splits a pane into two" && return _arguments -s \ '-b[create new pane left of or above target pane]' \ "-d[don't make the new window become the active one]" \ '-F+[specify output format]:format:__tmux-formats' \ '-f[create new pane spanning full window width or height]' \ '-h[split horizontally]' \ '-v[split vertically]' \ "-l[define new pane's size]:size" \ "-p[define new pane's size in percent]:size (percentage)" \ '-t+[specify target pane]:pane:__tmux-panes' \ ':command:_cmdambivalent' # 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. } _tmux-start-server() { [[ -n ${tmux_describe} ]] && print "start a tmux server" && return __tmux-nothing-else } _tmux-suspend-client() { [[ -n ${tmux_describe} ]] && print "suspend a client" && return _arguments '-t+[specify destination client]:client:__tmux-clients' } _tmux-swap-pane() { [[ -n ${tmux_describe} ]] && print "swap two panes" && return _arguments -s \ '-D[move pane down]' \ '-U[move pane up]' \ "-d[don't change the active pane]" \ '-s+[specify source pane]:pane:__tmux-panes' \ '-t+[specify destination pane]:pane:__tmux-panes' } _tmux-swap-window() { [[ -n ${tmux_describe} ]] && print "swap two windows" && return _arguments -s \ "-d[don't make the new window become the active one]" \ '-s+[specify source window]:window:__tmux-windows' \ '-t+[specify destination window]:window:__tmux-windows' } _tmux-switch-client() { [[ -n ${tmux_describe} ]] && print "switch the client to another session" && return _arguments -s \ '-c+[specify a target client]:client:__tmux-clients' \ "-E[don't apply update-environment option]" \ '-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+[specify target window]:window:__tmux-windows' } _tmux-unbind-key() { [[ -n ${tmux_describe} ]] && print "unbind a key" && return local curcontext="$curcontext" state line keytable local -a ow ow=( "${words[@]}" ) _arguments -C -s \ '-a[remove all key bindings]' \ '-n[remove a non-prefix binding]' \ '-T[specify key table]:key table' \ '*:: :->boundkeys' [[ ${state} != 'boundkeys' ]] && return keytable="$(__tmux-get-optarg -t "${ow[@]}")" if [[ -n ${keytable} ]]; then __tmux-bound-keys -t ${keytable} return fi __tmux-bound-keys } _tmux-unlink-window() { [[ -n ${tmux_describe} ]] && print "unlink a window" && return _arguments -s \ '-k[kill the window if it is only in one session]' \ '-t+[specify target window]:target window:__tmux-windows' } _tmux-wait-for() { [[ -n ${tmux_describe} ]] && print "wait for an event or trigger it" && return _arguments -s \ '-L[lock the named channel]' \ '-S[send signal to channel]' \ '-U[unlock the named channel]' \ ':event channel' } # --- Utility functions --- # They should be called __tmux-*() and kept separate from the # sub-command functions. function __tmux-attributes() { local -a attr already attr=( default bright bold dim underscore blink reverse hidden italics ) compset -P '*,' already=( ${(s<,>)IPREFIX} ) _describe -t tmux-attribute 'tmux attribute' attr -S, -F already -q } function __tmux-buffers() { local expl local -a buffers if [[ ${(t)bopts} != *array* ]]; then local -a bopts; bopts=() fi buffers=( ${${(f)"$(command tmux 2> /dev/null list-buffers "${bopts[@]}")"}/:[ $'\t']##/:} ) _describe -t buffers 'buffers' buffers } function __tmux-bound-keys() { local expl local -a keys keys=( ${${${${(f)"$(command tmux 2> /dev/null list-keys "$@")"}/:[ $'\t']##/:}/(#s)[ $'\t']##/}/(#s):/\\:} ) _describe -t keys 'keys' keys } function __tmux-clients() { local expl local -a clients clients=( ${${(f)"$(command tmux 2> /dev/null list-clients)"}/:[ $'\t']##/:} ) _describe -t clients 'clients' clients } function __tmux-environment-variables() { local mode="$1" state="$2" action="$3" local -a dash_g case $mode in (global) dash_g=(-g);; (session) dash_g=();; (*) return 1;; # bug in the caller esac local hint case $action in (add|remove) hint=" (or specify a new one)";; (unset|show) hint="";; (*) return 1;; # bug in the caller esac case ${state} in (name) local -a vars_and_vals=( ${(@f)"$(command tmux 2>/dev/null show-env $dash_g)"} ) local -a descriptions local k_v k v for k_v in $vars_and_vals; do k=${k_v%%=*} if [[ $k == -* ]]; then k=${k#-} v='(remove)' else v=${k_v#*=} fi descriptions+=( "${k//:/\\:}:$v" ) done # TODO: this if/else is because '_describe ${hint:+"-x"}' prints the "No matches" error in addition to the message. local msg="${dash_g[1]:+"global "}environment variables${hint}" if _describe -t parameters $msg descriptions; then : elif [[ -n $hint ]]; then _message -e $msg fi ;; (value) local var_and_val=${(@f)"$(command tmux 2>/dev/null show-env $dash_g -- ${(Q)words[-2]})"} # TODO: this if/else is because '_description -x' prints the "No matches" error in addition to the message. if [[ -n $var_and_val ]]; then local -a expl _description -x parameter-values expl "value for ${words[-2]}" compadd "$expl[@]" - ${var_and_val#*=} else _message -e "value for ${words[-2]}" fi ;; (*) return 1 ;; esac } __tmux-formats() { local hash='#' open='{' close='}' paren='(' quest='?' local tmux_variables expl compquote hash open close paren quest compset -p ${#PREFIX%$hash*} if compset -P "${(q)hash}${open}"; then if compset -P "${(q)quest}"; then close=, elif ! compset -P "([bdt]|s/[^/]#/[^/]#/|=(-|)<->):"; then _describe -t operators operator '( \?:conditional \=:length\ limit )' -S '' -- '( m:fnmatch\ comparison t:convert\ time\ to\ string b:basename c:search\ for\ fnmatch\ pattern\ in\ pane\ content d:dirname \==:comparison \!=:comparison )' -S : -- '( s:substitution )' -S / -- '( \|\|:either\ of\ two\ conditions \&\&:both\ of\ two\ conditions )' -S , fi tmux_variables=( 'alternate_on:if pane is in alternate screen' 'alternate_saved_x:saved cursor X in alternate screen' 'alternate_saved_y:saved cursor Y in alternate screen' 'buffer_created:time buffer created' 'buffer_name:name of buffer' 'buffer_sample:sample of start of buffer' 'buffer_size:size of the specified buffer in bytes' 'client_activity:time client last had activity' 'client_created:time client created' 'client_control_mode:1 if client is in control mode' 'client_discarded:bytes discarded when client behind' 'client_height:height of client' 'client_key_table:current key table' "client_last_session:name of the client's last session" 'client_name:name of client' 'client_pid:PID of client process' 'client_prefix:1 if prefix key has been pressed' 'client_readonly:1 if client is readonly' "client_session:name of the client's session" 'client_termname:terminal name of client' 'client_termtype:terminal type of client' 'client_tty:pseudo terminal of client' 'client_utf8:1 if client supports utf8' 'client_width:width of client' 'client_written:bytes written to client' 'command:name of command in use, if any' 'command_list_name:command name if listing commands' 'command_list_alias:command alias if listing commands' 'command_list_usage:command usage if listing commands' 'cursor_flag:pane cursor flag' 'cursor_character:character at cursor in pane' 'cursor_x:cursor X position in pane' 'cursor_y:cursor Y position in pane' 'history_bytes:number of bytes in window history' 'history_limit:maximum window history lines' 'history_size:size of history in lines' 'hook:name of running hook, if any' 'hook_pane:ID of pane where hook was run, if any' 'hook_session:ID of session where hook was run, if any' 'hook_session_name:name of session where hook was run, if any' 'hook_window:ID of window where hook was run, if any' 'hook_window_name:name of window where hook was run, if any' 'host:hostname of local host' 'host_short:hostname of local host (no domain name)' 'insert_flag:pane insert flag' 'keypad_cursor_flag:pane keypad cursor flag' 'keypad_flag:pane keypad flag' 'line:line number in the list' 'mouse_any_flag:pane mouse any flag' 'mouse_button_flag:pane mouse button flag' 'mouse_standard_flag:pane mouse standard flag' 'mouse_all_flag:pane mouse all flag' 'pane_active:1 if active pane' 'pane_at_bottom:1 if pane is at the bottom of window' 'pane_at_left:1 if pane is at the left of window' 'pane_at_right:1 if pane is at the right of window' 'pane_at_top:1 if pane is at the top of window' 'pane_bottom:bottom of pane' 'pane_current_command:current command if available' 'pane_dead:1 if pane is dead' 'pane_dead_status:exit status of process in dead pane' 'pane_format:1 if format is for a pane (not assuming the current)' 'pane_height:height of pane' 'pane_id:unique pane ID' 'pane_in_mode:if pane is in a mode' 'pane_input_off:if input to pane is disabled' 'pane_index:index of pane' 'pane_left:left of pane' 'pane_mode:name of pane mode, if any.' 'pane_pid:PID of first process in pane' 'pane_pipe:1 if pane is being piped' 'pane_right:right of pane' 'pane_search_string:last search string in copy mode' 'pane_start_command:command pane started with' 'pane_synchronized:if pane is synchronized' 'pane_tabs:pane tab positions' 'pane_title:title of pane' 'pane_top:top of pane' 'pane_tty:pseudo terminal of pane' 'pane_width:width of pane' 'pid:server PID' 'rectangle_toggle:1 if rectangle selection is activated' 'scroll_region_lower:bottom of scroll region in pane' 'scroll_region_upper:top of scroll region in pane' 'scroll_position:scroll position in copy mode' 'selection_present:1 if selection started in copy mode' 'session_alerts:list of window indexes with alerts' 'session_attached:number of clients session is attached to' 'session_activity:time of session last activity' 'session_created:time session created' 'session_format:1 if format is for a session (not assuming the current)' 'session_last_attached:time session last attached' 'session_group:name of session group' 'session_group_size:size of session group' 'session_group_list:list of sessions in group' 'session_grouped:1 if session in a group' 'session_id:unique session ID' 'session_many_attached:1 if multiple clients attached' 'session_name:name of session' 'session_stack:window indexes in most recent order' 'session_width:width of session' 'session_windows:number of windows in session' 'socket_path:server socket path' 'start_time:server start time' 'version:server version' 'window_activity:time of window last activity' 'window_activity_flag:1 if window has activity' 'window_active:1 if window active' 'window_bell_flag:1 if window has bell' 'window_flags:window flags' 'window_format:1 if format is for a window (not assuming the current)' 'window_height:height of window' 'window_id:unique window ID' 'window_index:index of window' 'window_last_flag:1 if window is the last used' 'window_layout:window layout description, ignoring zoomed window panes' 'window_linked:1 if window is linked across sessions' 'window_name:name of window' 'window_offset_x:X offset into window if larger than client' 'window_offset_y:Y offset into window if larger than client' 'window_panes:number of panes in window' 'window_silence_flag:1 if window has silence alert' 'window_stack_index:index in session most recent stack' 'window_visible_layout:window layout description, respecting zoomed window panes' 'window_width:width of window' 'window_zoomed_flag:1 if window is zoomed' 'wrap_flag:pane wrap flag' ) _describe -t variables variable tmux_variables -S "$close" elif compset -P "${(q)hash}${(q)paren}"; then compset -S '(\\|)\)*' _cmdstring elif [[ $PREFIX = ${hash}* ]]; then _describe -t variables variable '( \#H:local\ hostname \#h:short\ local\ hostname \#D:pane\ id \#P:pane\ index \#T:pane\ title \#S:session\ name \#F:window\ flags \#I:window\ index \#W:window\ name )' -S '' else _wanted format-specifiers expl 'format specifier' compadd -S '' \# fi } 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" ) compset -P 'colour*' if [[ -z ${IPREFIX} ]]; then _describe -t tmux-colours 'colour' colnames else _message 'colour number 0..255' fi } _tmux_hooks() { _alternative \ 'hooks:hook name:(alert-activity alert-bell alert-silence client-attached client-detached client-resized client-session-changed pane-died pane-exited pane-set-clipboard session-created session-closed session-renamed window-linked window-renamed window-unlinked)' \ 'post-hooks:command post-hook:compadd - after-${_tmux_aliasmap}' } function __tmux-get-optarg() { local opt="$1" local -i i shift for (( i = 1; i <= $#; i++ )); do if [[ ${argv[$i]} == ${opt} ]]; then if [[ ${argv[$(( i + 1 ))]} != -* ]]; then print -- ${argv[$(( i + 1 ))]} fi return fi done } __tmux-nothing-else() { _message -e "no further arguments" } function __tmux-option-guard() { local mode opt guard int_guard mode="$1" opt="$2" shift; shift local -a options desc int_guard='_guard "[0-9]#" "'${opt}': numeric value"' if [[ ${mode} == 'session' ]]; then options=( 'activity-action:DESC:any none current other' 'assume-paste-time:'${int_guard} 'base-index:'${int_guard} 'bell-action:DESC:any none current other' 'default-command:MSG:command string' 'default-shell:MSG:shell executable' 'default-size:MSG:XxY' '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} 'display-time:'${int_guard} 'history-limit:'${int_guard} 'lock-after-time:'${int_guard} 'lock-command:MSG:command string' 'message-command-style:__tmux-style' 'message-style:__tmux-style' 'mouse:DESC:on off' 'prefix:MSG:primary prefix key' 'prefix2:MSG:secondary prefix key' 'renumber-windows:DESC:on off' 'repeat-time:'${int_guard} 'set-titles:DESC:on off' 'set-titles-string:MSG:title format string' 'silence-action:DESC:any none current other' 'status:DESC:on off' 'status-format:MSG:format string' 'status-interval:'${int_guard} 'status-justify:DESC:left centre right' 'status-keys:DESC:vi emacs' 'status-left:MSG:format string' 'status-left-length:'${int_guard} 'status-left-style:__tmux-style' 'status-position:DESC:top bottom' 'status-right:MSG:format string' 'status-right-length:'${int_guard} 'status-right-style:__tmux-style' 'status-style:__tmux-style' 'update-environment:MSG:string listing env. variables' 'user-keys:MSG:key' 'visual-activity:DESC:on off' 'visual-bell:DESC:on off' 'visual-silence:DESC:on off' 'word-separators:MSG:separator string' ) elif [[ ${mode} == 'server' ]]; then options=( 'buffer-limit:'${int_guard} 'command-alias:MSG:alias' 'default-terminal:MSG:terminal string' 'escape-time:'${int_guard} 'exit-empty:DESC:on off' 'exit-unattached:DESC:on off' 'focus-events:DESC:on off' 'history-file:_path-files -g "*(-.)"' 'message-limit:'${int_guard} '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' 'main-pane-height:'${int_guard} 'main-pane-width:'${int_guard} 'mode-keys:DESC:vi emacs' 'mode-style:__tmux-style' 'monitor-activity:DESC:on off' 'monitor-bell:DESC:on off' '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-format:MSG:pane border status string' 'pane-border-status:DESC:off top bottom' 'pane-border-style:__tmux-style' 'remain-on-exit:DESC:on off' 'synchronize-panes:DESC:on off' '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-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-size:MSG:XxY' 'window-style:__tmux-style' 'wrap-search:DESC:on off' 'xterm-keys:DESC:on off' ) fi guard=${(M)options:#$opt:*} if [[ -z ${guard} ]]; then _message "unknown ${mode} option: ${opt}" return fi guard=${guard#*:} case ${guard} in ('') ;; (MSG:*) _message -e ${guard#*:} ;; (DESC:*) eval "desc=( ${guard#*:} )" _describe -t "tmux-${mode}-option-value" "${opt}" desc ;; (*) eval ${guard} ;; esac } function __tmux-session-options() { local -a tmux_session_options tmux_session_options=( 'activity-action:set action on window activity when monitor-activity is on' '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' 'default-command:default command for new windows' 'default-shell:default shell executable' 'default-size:set the default size of windows when the size is not set' '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' 'display-time:time (in msecs) messages are displayed' 'history-limit:number of copy-mode lines per window' 'key-table:default key table' 'lock-after-time:lock sessions after N seconds' 'lock-command:command to run for locking a client' 'message-command-style:status line message command style' 'message-style:status line message style' 'mouse:enable 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-titles:try to set xterm window titles' 'set-titles-string:format used by set-titles' 'silence-action:set action on window silence when monitor-silence is on' 'status:show or hide the status bar' 'status-format:specify the format to be used for each line of the status line' '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-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-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' "update-environment:list of variables to be copied to a session's environment" 'user-keys:set list of user-defined key escape sequences' 'visual-activity:display status line messages upon activity' 'visual-bell:use visual bell instead of audible' 'visual-silence:print a message if monitor-silence is on' 'word-separators:string of characters considered word separators' ) _describe -t tmux-options 'tmux session option' tmux_session_options } function __tmux-options-complete() { local mode="$1" state="$2" case ${state} in name_or_value) if (( CURRENT == 1 )) && [[ ${mode} == 'session' ]]; then __tmux-session-options elif (( CURRENT == 1 )) && [[ ${mode} == 'server' ]]; then __tmux-server-options elif (( CURRENT == 1 )) && [[ ${mode} == 'window' ]]; then __tmux-window-options elif (( CURRENT == 2 )); then __tmux-option-guard ${mode} ${words[1]} else __tmux-nothing-else fi ;; esac } function __tmux-panes() { local expl line local -i num local -a panes opts compset -P '*.' if [[ -n ${IPREFIX} ]]; then opts=( -t "${IPREFIX%.}" ) else opts=( ) fi num=0 command tmux 2> /dev/null list-panes "${opts[@]}" | while IFS= read -r line; do panes+=( $(( num++ )):${line//:/} ) done _describe -t panes 'panes' panes "$@" if [[ ${IPREFIX} != *. ]]; then _wanted windows expl 'windows' __tmux-windows -S. fi } function __tmux-server-options() { local -a tmux_server_options tmux_server_options=( 'buffer-limit:number of buffers kept per session' 'command-alias:custom command aliases' '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' 'exit-empty:exit when there are no active sessions' 'focus-events:request focus events from terminal' 'history-file:tmux command history file name' 'message-limit:set size of message log per client' '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 } function __tmux-sessions() { local -a sessions sessions=( ${${(f)"$(command tmux 2> /dev/null list-sessions)"}/:[ $'\t']##/:} ) _describe -t sessions 'sessions' sessions "$@" } function __tmux-sessions-attached() { local -a sessions sessions=( ${${(f)"$(command tmux 2> /dev/null list-sessions)"}/:[ $'\t']##/:} ) sessions=( ${(M)sessions:#*"(attached)"} ) _describe -t sessions 'attached sessions' sessions "$@" } # Complete attached-sessions and detached-sessions as separate tags. function __tmux-sessions-separately() { local ret=1 local -a sessions detached_sessions attached_sessions sessions=( ${${(f)"$(command tmux 2> /dev/null list-sessions)"}/:[ $'\t']##/:} ) detached_sessions=( ${sessions:#*"(attached)"} ) attached_sessions=( ${(M)sessions:#*"(attached)"} ) # ### This seems to work without a _tags loop but not with it. I suspect # ### that has something to do with _describe doing its own _tags loop. _tags detached-sessions attached-sessions # Placing detached before attached means the default behaviour of this # function better suits its only current caller, _tmux-attach-session(). _requested detached-sessions && _describe -t detached-sessions 'detached sessions' detached_sessions "$@" && ret=0 _requested attached-sessions && _describe -t attached-sessions 'attached sessions' attached_sessions "$@" && ret=0 return ret } function __tmux-socket-name() { local expl sdir local curcontext="${curcontext}" local -a socks zstyle -s ":completion:${curcontext}:sockets" socketdir sdir || sdir="${TMUX_TMPDIR:-/tmp}/tmux-${UID}" socks=(${sdir}/*(=:t)) _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)' 'main-pane-height:set height for main-* layouts' 'main-pane-width:set width for main-* layouts' 'mode-keys:mode to use in copy and choice modes (vi/emacs)' 'mode-style:set window modes style' 'monitor-activity:monitor window activity' 'monitor-bell:monitor for a bell in the window' '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-format:set pane border format string' 'pane-border-status:turn border status off or set its position' 'pane-border-style:style of border pane' "remain-on-exit:don't destroy windows after the program exits" 'synchronize-panes:send input to all panes of a 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-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-size:indicate how to automatically size windows' '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 } function __tmux-windows() { local expl local -a wins opts compset -P '*:' if [[ -n ${IPREFIX} ]]; then opts=( -t "${IPREFIX%:}" ) else opts=( ) fi wins=( ${${(M)${(f)"$(command tmux 2> /dev/null list-windows "${opts[@]}")"}:#<->*}/:[ $'\t']##/:} ) _describe -t windows 'windows' wins "$@" if [[ ${IPREFIX} != *: ]]; then _wanted sessions expl 'sessions' __tmux-sessions -S: fi } # And here is the actual _tmux(), that puts it all together: _tmux() { local curcontext="${curcontext}" state line ret=1 local mode local tmuxcommand local tmux_describe _arguments -C -s -w \ '-2[force using 256 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' \ '-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' && ret=0 [[ -z $state ]] && return ret if (( CURRENT == 1 )); then zstyle -s ":completion:${curcontext}:subcommands" mode mode || mode='both' if [[ ${mode} == 'commands' ]]; then _describe -t subcommands 'tmux commands' _tmux_commands && ret=0 elif [[ ${mode} == 'aliases' ]]; then _describe -t subcommands 'tmux aliases' _tmux_aliases && ret=0 else _describe -t subcommands 'tmux commands and aliases' _tmux_commands -- _tmux_aliases && ret=0 fi else tmuxcommand="${words[1]}" if [[ -n ${_tmux_aliasmap[$tmuxcommand]} ]] ; then tmuxcommand="${_tmux_aliasmap[$tmuxcommand]}" fi if ! (( ${+functions[_tmux-$tmuxcommand]} )); then local low high low=$_tmux_commands[(i)$tmuxcommand*] high=$_tmux_commands[(I)$tmuxcommand*] if (( low == high )); then tmuxcommand=${_tmux_commands[low]%%:*} elif (( low < high )); then _message "ambiguous command $tmuxcommand" else _message "subcommand $tmuxcommand not known" _normal && ret=0 fi fi curcontext="${curcontext%:*}-${tmuxcommand}:" _call_function ret _tmux-${tmuxcommand} fi return ret } # description generation follows; only done on 1st _tmux call. local f desc local -A rev local tmux_describe tmux_describe='yes, please' for f in ${(k)_tmux_aliasmap} ; do rev+=( ${_tmux_aliasmap[$f]} $f ) done for f in ${(M)${(k)functions}:#_tmux-*} ; do desc="$($f)" _tmux_commands+=( "${f#_tmux-}${desc:+:$desc}" ) [[ -n ${rev[${f#_tmux-}]} ]] && _tmux_aliases+=( "${rev[${f#_tmux-}]}${desc:+:$desc}" ) done _tmux "$@"
Close