/usr/share/zsh/4.3.11/functions
NameSizeModeActions
add-zsh-hook16320644editdlrm
age20330644editdlrm
allopt7700644editdlrm
backward-kill-word-match5930644editdlrm
backward-word-match4500644editdlrm
bashcompinit47020644editdlrm
calendar117460644editdlrm
calendar_add82730755editdlrm
calendar_edit7940644editdlrm
calendar_lockfiles16290644editdlrm
calendar_parse61150644editdlrm
calendar_read12710644editdlrm
calendar_scandate291500644editdlrm
calendar_show10290644editdlrm
calendar_showdate14610644editdlrm
calendar_sort19300644editdlrm
capitalize-word-match3730644editdlrm
catch12500644editdlrm
cdr115100644editdlrm
checkmail8170755editdlrm
chpwd_recent_add5060644editdlrm
chpwd_recent_dirs15930644editdlrm
chpwd_recent_filehandler11760644editdlrm
colors34010644editdlrm
compaudit49110644editdlrm
compdump40150644editdlrm
compinit160880644editdlrm
compinstall615000644editdlrm
copy-earlier-word7950644editdlrm
cycle-completion-positions4970644editdlrm
define-composed-chars79470644editdlrm
delete-whole-word-match17050644editdlrm
down-case-word-match3760644editdlrm
down-line-or-beginning-search5860644editdlrm
edit-command-line5500644editdlrm
forward-word-match7640644editdlrm
getjobs8270644editdlrm
harden960755editdlrm
history-beginning-search-menu34830644editdlrm
history-pattern-search21700644editdlrm
history-search-end8120644editdlrm
incarg10020644editdlrm
incremental-complete-word38680644editdlrm
insert-composed-char52370644editdlrm
insert-files9970644editdlrm
insert-unicode-char6930644editdlrm
is-at-least13710644editdlrm
keeper32260644editdlrm
keymap+widget26630644editdlrm
kill-word-match5910644editdlrm
match-word-context9920644editdlrm
match-words-by-style90780644editdlrm
mere20620644editdlrm
modify-current-argument19480644editdlrm
narrow-to-region35390644editdlrm
narrow-to-region-invisible2110644editdlrm
nslookup11260644editdlrm
pick-web-browser48750644editdlrm
predict-on47150644editdlrm
promptinit58100644editdlrm
promptnl33010644editdlrm
prompt_adam1_setup18100644editdlrm
prompt_adam2_setup40900644editdlrm
prompt_bart_setup67390644editdlrm
prompt_bigfade_setup18540644editdlrm
prompt_clint_setup16950644editdlrm
prompt_elite2_setup16380644editdlrm
prompt_elite_setup15230644editdlrm
prompt_fade_setup18100644editdlrm
prompt_fire_setup19890644editdlrm
prompt_off_setup1210644editdlrm
prompt_oliver_setup14670644editdlrm
prompt_pws_setup6630644editdlrm
prompt_redhat_setup2730644editdlrm
prompt_special_chars7750644editdlrm
prompt_suse_setup2600644editdlrm
prompt_walters_setup5580644editdlrm
prompt_zefram_setup5090644editdlrm
quote-and-complete-word14420644editdlrm
read-from-minibuffer14290644editdlrm
regexp-replace10390644editdlrm
relative8880644editdlrm
replace-string6510644editdlrm
replace-string-again18240644editdlrm
run-help29150755editdlrm
run-help-git1440644editdlrm
run-help-openssl590644editdlrm
run-help-p4780644editdlrm
run-help-sudo560644editdlrm
run-help-svk420644editdlrm
run-help-svn420644editdlrm
select-word-style19010644editdlrm
smart-insert-last-word41510644editdlrm
split-shell-arguments15300644editdlrm
sticky-note47020755editdlrm
tcp_alias40930644editdlrm
tcp_close29810644editdlrm
tcp_command680644editdlrm
tcp_expect41560644editdlrm
tcp_fd_handler9700644editdlrm
tcp_log22850644editdlrm
tcp_open67890644editdlrm
tcp_output17920644editdlrm
tcp_point4430644editdlrm
tcp_proxy8490644editdlrm
tcp_read70550644editdlrm
tcp_rename8500644editdlrm
tcp_send19880644editdlrm
tcp_sess10390644editdlrm
tcp_shoot3290644editdlrm
tcp_spam29090644editdlrm
tcp_talk14720644editdlrm
tcp_wait4590644editdlrm
tetris54330644editdlrm
throw10220644editdlrm
transpose-lines10880644editdlrm
transpose-words-match13360644editdlrm
up-case-word-match3770644editdlrm
up-line-or-beginning-search5640644editdlrm
url-quote-magic57370644editdlrm
vcs_info32720644editdlrm
VCS_INFO_adjust2460644editdlrm
VCS_INFO_bydir_detect7540644editdlrm
VCS_INFO_check_com3220644editdlrm
VCS_INFO_detect_bzr3260644editdlrm
VCS_INFO_detect_cdv3350644editdlrm
VCS_INFO_detect_cvs3250644editdlrm
VCS_INFO_detect_darcs3330644editdlrm
VCS_INFO_detect_git6570644editdlrm
VCS_INFO_detect_hg6740644editdlrm
VCS_INFO_detect_mtn3360644editdlrm
VCS_INFO_detect_p423600644editdlrm
VCS_INFO_detect_svk14680644editdlrm
VCS_INFO_detect_svn3000644editdlrm
VCS_INFO_detect_tla3450644editdlrm
VCS_INFO_formats37070644editdlrm
VCS_INFO_get_cmd2330644editdlrm
VCS_INFO_get_data_bzr12380644editdlrm
VCS_INFO_get_data_cdv3050644editdlrm
VCS_INFO_get_data_cvs5120644editdlrm
VCS_INFO_get_data_darcs3110644editdlrm
VCS_INFO_get_data_git56190644editdlrm
VCS_INFO_get_data_hg81980644editdlrm
VCS_INFO_get_data_mtn4100644editdlrm
VCS_INFO_get_data_p411090644editdlrm
VCS_INFO_get_data_svk7290644editdlrm
VCS_INFO_get_data_svn12920644editdlrm
VCS_INFO_get_data_tla4790644editdlrm
VCS_INFO_hook13350644editdlrm
vcs_info_lastmsg4930644editdlrm
VCS_INFO_maxexports4720644editdlrm
VCS_INFO_nvcsformats4230644editdlrm
vcs_info_printsys12980644editdlrm
VCS_INFO_quilt55900644editdlrm
VCS_INFO_realpath2500644editdlrm
VCS_INFO_reposub2950644editdlrm
VCS_INFO_set8530644editdlrm
vcs_info_setsys5710644editdlrm
which-command10310644editdlrm
xtermctl41850644editdlrm
zargs88740644editdlrm
zcalc71290755editdlrm
zed21620755editdlrm
zed-set-file-name1450644editdlrm
zfanon19040644editdlrm
zfautocheck13180644editdlrm
zfcd19330644editdlrm
zfcd_match11610644editdlrm
zfcget20770644editdlrm
zfclose900644editdlrm
zfcput24910644editdlrm
zfdir32290644editdlrm
zffcache7290644editdlrm
zfgcp19540644editdlrm
zfget17750644editdlrm
zfget_match8240644editdlrm
zfgoto22500644editdlrm
zfhere1810644editdlrm
zfinit25500644editdlrm
zfls2080644editdlrm
zfmark14420644editdlrm
zfopen11860644editdlrm
zfparams6870644editdlrm
zfpcp13000644editdlrm
zfput14440644editdlrm
zfrglob21370644editdlrm
zfrtime13620644editdlrm
zfsession16440644editdlrm
zfstat20240644editdlrm
zftp_chpwd13860644editdlrm
zftp_progress20810644editdlrm
zftransfer15780644editdlrm
zftype6130644editdlrm
zfuget39230644editdlrm
zfuput26800644editdlrm
zkbd71720755editdlrm
zmathfuncdef22790644editdlrm
zmv111420644editdlrm
zrecompile61850644editdlrm
zsh-mime-handler80550644editdlrm
zsh-mime-setup113590644editdlrm
zsh-newuser-install300380644editdlrm
zstyle+12670644editdlrm
ztodo14050644editdlrm
_a2ps28090644editdlrm
_a2utils4870644editdlrm
_aap26380644editdlrm
_acpi12720644editdlrm
_acpitool24350644editdlrm
_acroread35010644editdlrm
_alias7110644editdlrm
_aliases7080644editdlrm
_all_labels9200644editdlrm
_all_matches9700644editdlrm
_alternative19500644editdlrm
_analyseplugin6470644editdlrm
_ant61060644editdlrm
_antiword11090644editdlrm
_apachectl1160644editdlrm
_apm16800644editdlrm
_approximate34720644editdlrm
_apt207000644editdlrm
_apt-file17960644editdlrm
_apt-move18120644editdlrm
_apt-show-versions7500644editdlrm
_aptitude32570644editdlrm
_arch_archives4130644editdlrm
_arch_namespace33080644editdlrm
_arguments169360644editdlrm
_arg_compile75690644editdlrm
_arp11690644editdlrm
_arping13510644editdlrm
_arrays860644editdlrm
_assign640644editdlrm
_attr22940644editdlrm
_auto-apt10810644editdlrm
_autocd850644editdlrm
_awk9720644editdlrm
_axi-cache7250644editdlrm
_bash_completions13580644editdlrm
_baz160170644editdlrm
_bindkey20480644editdlrm
_bind_addresses4080644editdlrm
_bison9230644editdlrm
_bittorrent49020644editdlrm
_bogofilter52880644editdlrm
_brace_parameter430644editdlrm
_brctl17620644editdlrm
_bsd_pkg55530644editdlrm
_bts70510644editdlrm
_bug46870644editdlrm
_builtin1780644editdlrm
_bzip223640644editdlrm
_bzr107320644editdlrm
_cache_invalid7070644editdlrm
_cal5470644editdlrm
_calendar14060644editdlrm
_call_function7370644editdlrm
_call_program2110644editdlrm
_canonical_paths42030644editdlrm
_ccal7780644editdlrm
_cd36710644editdlrm
_cdbs-edit-patch560644editdlrm
_cdcd21420644editdlrm
_cdr11960644editdlrm
_cdrdao82490644editdlrm
_cdrecord48620644editdlrm
_chflags15390644editdlrm
_chkconfig7770644editdlrm
_chmod22780644editdlrm
_chown25380644editdlrm
_chrt16670644editdlrm
_combination25000644editdlrm
_comm4090644editdlrm
_command2380644editdlrm
_command_names11530644editdlrm
_compdef19630644editdlrm
_complete31670644editdlrm
_complete_debug7550644editdlrm
_complete_help24550644editdlrm
_complete_help_generic4120644editdlrm
_complete_tag18660644editdlrm
_compress14140644editdlrm
_condition16960644editdlrm
_configure4440644editdlrm
_coreadm15000644editdlrm
_correct5180644editdlrm
_correct_filename19610644editdlrm
_correct_word3880644editdlrm
_cowsay5350644editdlrm
_cp23960644editdlrm
_cpio46580644editdlrm
_cplay3390644editdlrm
_cssh7950644editdlrm
_csup11280644editdlrm
_ctags_tags1700644editdlrm
_cut26360644editdlrm
_cvs289480644editdlrm
_cvsup9370644editdlrm
_cygcheck20520644editdlrm
_cygpath26130644editdlrm
_cygrunsrv27720644editdlrm
_cygserver15390644editdlrm
_cygstart21780644editdlrm
_dak91840644editdlrm
_darcs11990644editdlrm
_date11320644editdlrm
_dchroot10580644editdlrm
_dchroot-dsa9870644editdlrm
_dcop29450644editdlrm
_dd8120644editdlrm
_debchange5110644editdlrm
_debdiff8940644editdlrm
_debfoster32160644editdlrm
_debsign6230644editdlrm
_deb_packages36120644editdlrm
_default6820644editdlrm
_defaults17240644editdlrm
_delimiters3290644editdlrm
_describe31950644editdlrm
_description31070644editdlrm
_devtodo45540644editdlrm
_dhclient9250644editdlrm
_dhcpinfo12030644editdlrm
_dict21410644editdlrm
_dict_words12920644editdlrm
_diff900644editdlrm
_diffstat7270644editdlrm
_diff_options71440644editdlrm
_directories1170644editdlrm
_directory_stack14180644editdlrm
_dirs2620644editdlrm
_dir_list6800644editdlrm
_disable4590644editdlrm
_dispatch20570644editdlrm
_django59960644editdlrm
_dladm140580644editdlrm
_dlocate8930644editdlrm
_dmidecode9350644editdlrm
_domains5850644editdlrm
_dpatch-edit-patch12750644editdlrm
_dpkg74580644editdlrm
_dpkg-buildpackage12010644editdlrm
_dpkg-cross11470644editdlrm
_dpkg-repack3780644editdlrm
_dpkg_source13180644editdlrm
_dput12880644editdlrm
_du31840644editdlrm
_dumpadm5960644editdlrm
_dumper3770644editdlrm
_dupload7800644editdlrm
_dvi40340644editdlrm
_dynamic_directory_name1640644editdlrm
_ecasound85770644editdlrm
_echotc930644editdlrm
_echoti940644editdlrm
_elinks29580644editdlrm
_elm6530644editdlrm
_email_addresses54520644editdlrm
_emulate2170644editdlrm
_enable3380644editdlrm
_enscript53620644editdlrm
_env4290644editdlrm
_equal330644editdlrm
_espeak20830644editdlrm
_ethtool67710644editdlrm
_expand69020644editdlrm
_expand_alias19900644editdlrm
_expand_word3070644editdlrm
_fakeroot4860644editdlrm
_fc13640644editdlrm
_feh70110644editdlrm
_fetch13940644editdlrm
_fetchmail5540644editdlrm
_ffmpeg52780644editdlrm
_figlet15030644editdlrm
_files36020644editdlrm
_file_descriptors8260644editdlrm
_file_systems11640644editdlrm
_find26180644editdlrm
_finger21570644editdlrm
_fink53660644editdlrm
_first16310644editdlrm
_flasher16600644editdlrm
_flex14510644editdlrm
_floppy1100644editdlrm
_fortune6010644editdlrm
_freebsd-update9350644editdlrm
_fsh5190644editdlrm
_fstat6750644editdlrm
_functions1010644editdlrm
_fuser21070644editdlrm
_fusermount6500644editdlrm
_fuse_arguments10780644editdlrm
_fuse_values16480644editdlrm
_gcc114980644editdlrm
_gcore8050644editdlrm
_gdb17250644editdlrm
_generic3280644editdlrm
_genisoimage20060644editdlrm
_getclip5320644editdlrm
_getconf22250644editdlrm
_getent15140644editdlrm
_getfacl13700644editdlrm
_getmail10800644editdlrm
_git1698900644editdlrm
_git-buildpackage25740644editdlrm
_global18490644editdlrm
_global_tags1860644editdlrm
_globflags6930644editdlrm
_globquals57040644editdlrm
_globqual_delims4660644editdlrm
_gnome-gv1390644editdlrm
_gnupod56990644editdlrm
_gnutls62500644editdlrm
_gnu_generic1780644editdlrm
_gpg132750644editdlrm
_gphoto225040644editdlrm
_gprof13370644editdlrm
_gqview6190644editdlrm
_graphicsmagick288720644editdlrm
_grep40740644editdlrm
_grep-excuses3150644editdlrm
_groff22510644editdlrm
_groups10090644editdlrm
_growisofs196310644editdlrm
_gs16160644editdlrm
_guard1690644editdlrm
_guilt15520644editdlrm
_gv13090644editdlrm
_gzip35290644editdlrm
_hash11280644editdlrm
_have_glob_qual8580644editdlrm
_hdiutil224430644editdlrm
_hg297940644editdlrm
_history13430644editdlrm
_history_complete_word34510644editdlrm
_history_modifiers19530644editdlrm
_hosts23780644editdlrm
_iconv19890644editdlrm
_id4530644editdlrm
_ifconfig28660644editdlrm
_iftop6650644editdlrm
_ignored16470644editdlrm
_imagemagick281090644editdlrm
_inetadm4060644editdlrm
_init_d25760644editdlrm
_invoke-rc.d5550644editdlrm
_in_vared8130644editdlrm
_ionice3370644editdlrm
_ip189620644editdlrm
_ipset64490644editdlrm
_iptables106020644editdlrm
_irssi13510644editdlrm
_ispell42100644editdlrm
_iwconfig23970644editdlrm
_java234680644editdlrm
_java_class6810644editdlrm
_jobs19870644editdlrm
_jobs_bg270644editdlrm
_jobs_builtin3600644editdlrm
_jobs_fg310644editdlrm
_joe22740644editdlrm
_join9330644editdlrm
_kfmclient32670644editdlrm
_kill4750644editdlrm
_killall3650644editdlrm
_kld8670644editdlrm
_knock3040644editdlrm
_kvno5660644editdlrm
_last4720644editdlrm
_ldd13110644editdlrm
_ld_debug11690644editdlrm
_less56730644editdlrm
_lighttpd4130644editdlrm
_limit1660644editdlrm
_limits1050644editdlrm
_linda14430644editdlrm
_links20910644editdlrm
_lintian47450644editdlrm
_list8220644editdlrm
_list_files14200644editdlrm
_loadkeys5950644editdlrm
_locales3490644editdlrm
_locate46060644editdlrm
_logical_volumes4550644editdlrm
_look4440644editdlrm
_losetup7370644editdlrm
_lp13820644editdlrm
_ls60780644editdlrm
_lscfg6580644editdlrm
_lsdev14270644editdlrm
_lslv3480644editdlrm
_lsof23800644editdlrm
_lspv4320644editdlrm
_lsusb8610644editdlrm
_lsvg5050644editdlrm
_lynx111660644editdlrm
_lzop38390644editdlrm
_mac_applications1390644editdlrm
_mac_files_for_application20000644editdlrm
_madison6880644editdlrm
_mail4320644editdlrm
_mailboxes60240644editdlrm
_main_complete95980644editdlrm
_make47060644editdlrm
_make-kpkg26420644editdlrm
_man33240644editdlrm
_match24290644editdlrm
_math3270644editdlrm
_md5sum4570644editdlrm
_mdadm80040644editdlrm
_members3900644editdlrm
_mencal10820644editdlrm
_menu5580644editdlrm
_mere570644editdlrm
_mergechanges1060644editdlrm
_message7880644editdlrm
_metaflac14470644editdlrm
_mh35960644editdlrm
_mii-tool7480644editdlrm
_mime_types11560644editdlrm
_mkdir18940644editdlrm
_mkshortcut12740644editdlrm
_mkzsh3710644editdlrm
_module55000644editdlrm
_module-assistant20950644editdlrm
_modutils42950644editdlrm
_mondo20010644editdlrm
_monotone25110644editdlrm
_most_recent_file8710644editdlrm
_mount382760644editdlrm
_mozilla47770644editdlrm
_mpc66160644editdlrm
_mplayer82840644editdlrm
_mt32120644editdlrm
_mtools40900644editdlrm
_mtr7250644editdlrm
_multi_parts83510644editdlrm
_mutt10050644editdlrm
_mysqldiff11250644editdlrm
_mysql_utils99790644editdlrm
_my_accounts450644editdlrm
_nautilus5380644editdlrm
_ncftp2800644editdlrm
_nedit28650644editdlrm
_netcat13230644editdlrm
_netscape29350644editdlrm
_net_interfaces10560644editdlrm
_newsgroups2100644editdlrm
_next_label6000644editdlrm
_next_tags34640644editdlrm
_nice2460644editdlrm
_nmap34660644editdlrm
_normal10110644editdlrm
_nothing900644editdlrm
_nslookup56770644editdlrm
_object_classes1460644editdlrm
_oldlist19150644editdlrm
_open11030644editdlrm
_options1820644editdlrm
_options_set2990644editdlrm
_options_unset3090644editdlrm
_osc41460644editdlrm
_other_accounts640644editdlrm
_pack3610644editdlrm
_parameter370644editdlrm
_parameters7760644editdlrm
_patch81410644editdlrm
_path_commands24710644editdlrm
_path_files259690644editdlrm
_pax27860644editdlrm
_pbm258610644editdlrm
_pbuilder12580644editdlrm
_pdf4080644editdlrm
_perforce845120644editdlrm
_perl25640644editdlrm
_perldoc19450644editdlrm
_perl_basepods7160644editdlrm
_perl_modules46710644editdlrm
_pfctl42050644editdlrm
_pfexec6700644editdlrm
_php30630644editdlrm
_physical_volumes1240644editdlrm
_pick_variant7370644editdlrm
_pids16270644editdlrm
_pine29450644editdlrm
_ping17320644editdlrm
_piuparts9720644editdlrm
_pkg-config21560644editdlrm
_pkgadd10120644editdlrm
_pkginfo6130644editdlrm
_pkgrm5510644editdlrm
_pkgtool24360644editdlrm
_pkg_instance3530644editdlrm
_pon4430644editdlrm
_portaudit5630644editdlrm
_portlint7480644editdlrm
_portmaster39750644editdlrm
_ports2850644editdlrm
_portsnap10300644editdlrm
_postfix5300644editdlrm
_powerd6280644editdlrm
_prcs68480644editdlrm
_precommand1880644editdlrm
_prefix16180644editdlrm
_print15490644editdlrm
_printenv1040644editdlrm
_printers32090644editdlrm
_procstat7060644editdlrm
_prompt2960644editdlrm
_ps3330644editdlrm
_pscp7160644editdlrm
_pspdf3260644editdlrm
_psutils36460644editdlrm
_ptree4490644editdlrm
_pump14410644editdlrm
_putclip5380644editdlrm
_pydoc4360644editdlrm
_python20740644editdlrm
_qemu25270644editdlrm
_qiv26470644editdlrm
_qtplay5250644editdlrm
_quilt8020644editdlrm
_raggle27400644editdlrm
_rake28490644editdlrm
_ranlib4030644editdlrm
_rar46140644editdlrm
_rcs7660644editdlrm
_read9190644editdlrm
_readshortcut10570644editdlrm
_read_comp38520644editdlrm
_rebootin5740644editdlrm
_redirect4210644editdlrm
_regex_arguments24960644editdlrm
_regex_words7460644editdlrm
_renice4240644editdlrm
_reprepro25610644editdlrm
_requested2680644editdlrm
_retrieve_cache7320644editdlrm
_retrieve_mac_apps33030644editdlrm
_ri34700644editdlrm
_rlogin26830644editdlrm
_rm15640644editdlrm
_rpm110280644editdlrm
_rpmbuild33880644editdlrm
_rrdtool4910644editdlrm
_rsync123110644editdlrm
_rubber27080644editdlrm
_ruby29070644editdlrm
_sablotron18080644editdlrm
_samba34360644editdlrm
_savecore2280644editdlrm
_sccs61720644editdlrm
_sched4670644editdlrm
_schroot14970644editdlrm
_screen63990644editdlrm
_sed9860644editdlrm
_sep_parts38010644editdlrm
_service10480644editdlrm
_services9380644editdlrm
_set14730644editdlrm
_setfacl20100644editdlrm
_setopt1930644editdlrm
_setup19580644editdlrm
_setxkbmap24310644editdlrm
_set_command8150644editdlrm
_sh4610644editdlrm
_showmount4280644editdlrm
_signals10130644editdlrm
_sisu39360644editdlrm
_slrn11310644editdlrm
_smit8560644editdlrm
_socket10890644editdlrm
_softwareupdate23320644editdlrm
_sort20160644editdlrm
_source2260644editdlrm
_spamassassin4750644editdlrm
_sqsh21580644editdlrm
_ssh125490644editdlrm
_sshfs7520644editdlrm
_stat5680644editdlrm
_stgit9510644editdlrm
_store_cache17420644editdlrm
_strace60770644editdlrm
_strip23630644editdlrm
_stty7620644editdlrm
_su19440644editdlrm
_subscript42840644editdlrm
_subversion92500644editdlrm
_sub_commands1360644editdlrm
_sudo11370644editdlrm
_suffix_alias_files5250644editdlrm
_surfraw181430644editdlrm
_svcadm14710644editdlrm
_svccfg16670644editdlrm
_svcprop6340644editdlrm
_svcs10290644editdlrm
_svcs_fmri26840644editdlrm
_svn-buildpackage26440644editdlrm
_sysctl17120644editdlrm
_tags14660644editdlrm
_tar61040644editdlrm
_tardy6780644editdlrm
_tar_archive10140644editdlrm
_tcpdump42990644editdlrm
_tcpsys10020644editdlrm
_tcptraceroute5830644editdlrm
_telnet21400644editdlrm
_terminals2100644editdlrm
_tex2000644editdlrm
_texi1290644editdlrm
_texinfo87190644editdlrm
_tidy73050644editdlrm
_tiff72300644editdlrm
_tilde7320644editdlrm
_tilde_files6760644editdlrm
_time_zone2220644editdlrm
_tin21160644editdlrm
_tla179970644editdlrm
_tmux494230644editdlrm
_todo.sh41690644editdlrm
_toilet8630644editdlrm
_toolchain-source3280644editdlrm
_topgit1770644editdlrm
_totd2870644editdlrm
_tpb9750644editdlrm
_tpconfig11200644editdlrm
_tracepath870644editdlrm
_trap1010644editdlrm
_ttyctl1130644editdlrm
_tune2fs14050644editdlrm
_twisted28350644editdlrm
_typeset37520644editdlrm
_ulimit10200644editdlrm
_uml52610644editdlrm
_unace4720644editdlrm
_uname25580644editdlrm
_unexpand6200644editdlrm
_unhash5550644editdlrm
_uniq11730644editdlrm
_units28120644editdlrm
_unsetopt1900644editdlrm
_update-alternatives13840644editdlrm
_update-rc.d6370644editdlrm
_urls59180644editdlrm
_urpmi138180644editdlrm
_urxvt14810644editdlrm
_uscan10370644editdlrm
_users2510644editdlrm
_users_on2530644editdlrm
_user_admin19430644editdlrm
_user_at_host7290644editdlrm
_user_expand34690644editdlrm
_uzbl3040644editdlrm
_valgrind49090644editdlrm
_value16230644editdlrm
_values37500644editdlrm
_vared3260644editdlrm
_vars4690644editdlrm
_vim46620644editdlrm
_vim-addons16600644editdlrm
_vnc9040644editdlrm
_volume_groups870644editdlrm
_vorbis56990644editdlrm
_vorbiscomment6070644editdlrm
_vserver30580644editdlrm
_vux18120644editdlrm
_w3m45310644editdlrm
_wait660644editdlrm
_wajig25130644editdlrm
_wakeup_capable_devices4390644editdlrm
_wanna-build20700644editdlrm
_wanted1830644editdlrm
_webbrowser2030644editdlrm
_wget74650644editdlrm
_whereis360644editdlrm
_which11320644editdlrm
_whois48190644editdlrm
_wiggle11190644editdlrm
_xargs5020644editdlrm
_xauth25800644editdlrm
_xdvi17040644editdlrm
_xfig19720644editdlrm
_xloadimage39020644editdlrm
_xmlsoft64250644editdlrm
_xmms253830644editdlrm
_xmodmap22740644editdlrm
_xpdf17590644editdlrm
_xrandr10890644editdlrm
_xscreensaver8230644editdlrm
_xset51960644editdlrm
_xterm9050644editdlrm
_xt_arguments17440644editdlrm
_xt_session_id400644editdlrm
_xv24840644editdlrm
_xwit47430644editdlrm
_x_arguments6000644editdlrm
_x_borderwidth1250644editdlrm
_x_color10070644editdlrm
_x_colormapid3960644editdlrm
_x_cursor4090644editdlrm
_x_display750644editdlrm
_x_extension4840644editdlrm
_x_font3070644editdlrm
_x_geometry1250644editdlrm
_x_keysym6150644editdlrm
_x_locale1200644editdlrm
_x_modifier1530644editdlrm
_x_name1160644editdlrm
_x_resource1240644editdlrm
_x_selection_timeout1300644editdlrm
_x_title1180644editdlrm
_x_utils46500644editdlrm
_x_visual2720644editdlrm
_x_window4020644editdlrm
_yafc18440644editdlrm
_yast5250644editdlrm
_yodl6580644editdlrm
_yp32420644editdlrm
_yum78450644editdlrm
_zattr5520644editdlrm
_zcalc_line17210644editdlrm
_zcat990644editdlrm
_zcompile9270644editdlrm
_zdump1120644editdlrm
_zed1790644editdlrm
_zfs67160644editdlrm
_zfs_dataset6750644editdlrm
_zfs_pool510644editdlrm
_zftp25820644editdlrm
_zip53800644editdlrm
_zle22920644editdlrm
_zlogin3000644editdlrm
_zmodload22920644editdlrm
_zmv8050644editdlrm
_zpool39950644editdlrm
_zpty20050644editdlrm
_zsh-mime-handler7190644editdlrm
_zstyle145640644editdlrm
_ztodo5860644editdlrm
Edit: /usr/share/zsh/4.3.11/functions/calendar_scandate (29150B)
# Scan a line for various common date and time formats. # Set REPLY to the number of seconds since the epoch at which that # time occurs. The time does not need to be matched; this will # produce midnight at the start of the date. # # Absolute times # # The rules below are fairly complicated, to allow any natural (and # some highly unnatural but nonetheless common) combination of # time and date used by English speakers. It is recommended that, # rather than exploring the intricacies of the system, users find # a date format that is natural to them and stick to it. This # will avoid unexpected effects. Various key facts should be noted, # explained in more detail below: # # - In particular, note the confusion between month/day/year and # day/month/year when the month is numeric; this format should be # avoided if at all possible. Many alternatives are available. # - However, there is currently no localization support, so month # names must be English (though only the first three letters are required). # The same applies to days of the week if they occur (they are not useful). # - The year must be given in full to avoid confusion, and only years # from 1900 to 2099 inclusive are matched. # - Although timezones are parsed (complicated formats may not be recognized), # they are then ignored; no time adjustment is made. # - Embedding of times within dates (e.g. "Wed Jun 16 09:30:00 BST 2010") # causes horrific problems because of the combination of the many # possible date and time formats to match. The approach taken # here is to match the time, remove it, and see if the nearby text # looks like a date. The problem is that the time matched may not # be that associated with the date, in which case the time will be # ignored. To minimise this, when the argument "-a" is given to # anchor the date/time to the start of the line, we never look # beyond a newline. So if any date/time strings in the text # are on separate lines the problem is avoided. # - If you feel sophisticated enough and wish to avoid any ambiguity, # you can use RFC 2445 date/time strings, for example 20100601T170000. # These are parsed in one go. # # The following give some obvious examples; users finding here # a format they like and not subject to vagaries of style may skip # the full description. As dates and times are matched separately # (even though the time may be embedded in the date), any date format # may be mixed with any format for the time of day provide the # separators are clear (whitespace, colons, commas). # 2007/04/03 13:13 # 2007/04/03:13:13 # 2007/04/03 1:13 pm # 3rd April 2007, 13:13 # April 3rd 2007 1:13 p.m. # Apr 3, 2007 13:13 # Tue Apr 03 13:13:00 2007 # 13:13 2007/apr/3 # # Times are parsed and extracted before dates. They must use colons # to separate hours and minutes, though a dot is allowed before seconds # if they are present. This limits time formats to # HH:MM[:SS[.FFFFF]] [am|pm|a.m.|p.m.] # HH:MM.SS[.FFFFF] [am|pm|a.m.|p.m.] # in which square brackets indicate optional elements, possibly with # alternatives. Fractions of a second are recognised but ignored. # Unless -r or -R are given (see below), a date is mandatory but a time of day is # not; the time returned is at the start of the date. # # Time zones are not handled, though if one is matched following a time # specification it will be removed to allow a surrounding date to be # parsed. This only happens if the format of the timezone is not too # wacky: # +0100 # GMT # GMT-7 # CET+1CDT # etc. are all understood, but any part of the timezone that is not numeric # must have exactly three capital letters in the name. # # Dates suffer from the ambiguity between DD/MM/YYYY and MM/DD/YYYY. It is # recommended this form is avoided with purely numeric dates, but use of # ordinals, eg. 3rd/04/2007, will resolve the ambiguity as the ordinal is # always parsed as the day of the month. Years must be four digits (and # the first two must be 19 or 20); 03/04/08 is not recognised. Other # numbers may have leading zeroes, but they are not required. The # following are handled: # YYYY/MM/DD # YYYY-MM-DD # YYYY/MNM/DD # YYYY-MNM-DD # DD[th|st|rd] MNM[,] YYYY # DD[th|st|rd] MNM[,] current year assumed # MNM DD[th|st|rd][,] YYYY # MNM DD[th|st|rd][,] current year assumed # DD[th|st|rd]/MM[,] YYYY # DD[th|st|rd]/MM/YYYY # MM/DD[th|st|rd][,] YYYY # MM/DD[th|st|rd]/YYYY # Here, MNM is at least the first three letters of a month name, # matched case-insensitively. The remainder of the month name may appear but # its contents are irrelevant, so janissary, febrile, martial, apricot, # etc. are happily handled. # # Note there are only two cases that assume the current year, the # form "Jun 20" or "14 September" (the only two commonly occurring # forms, apart from a "the" in some forms of English, which isn't # currently supported). Such dates will of course become ambiguous # in the future, so should ideally be avoided. # # Times may follow dates with a colon, e.g. 1965/07/12:09:45; this # is in order to provide a format with no whitespace. A comma # and whitespace are allowed, e.g. "1965/07/12, 09:45". # Currently the order of these separators is not checked, so # illogical formats such as "1965/07/12, : ,09:45" will also # be matched. Otherwise, a time is only recognised as being associated # with a date if there is only whitespace in between, or if the time # was embedded in the date. # # Days of the week are not scanned, but will be ignored if they occur # at the start of the date pattern only. # # For example, the standard date format: # Fri Aug 18 17:00:48 BST 2006 # is handled by matching HH:MM:SS and removing it together with the # matched (but unused) time zone. This leaves the following: # Fri Aug 18 2006 # "Fri" is ignored and the rest is matched according to the sixth of # the standard rules. # # Relative times # ============== # # The option -r allows a relative time. Years (or ys, yrs, or without s), # months (or mths, mons, mnths, months, or without s --- "m", "ms" and # "mns" are ambiguous and are not handled), weeks (or ws, wks, or without # s) and days (or ds, dys, days, or without s), hours (or hs, hrs, with or # without s), minutes (or mins, with or without s) and seconds (or ss, # secs, with or without s) are understood. Spaces between the numbers # are optional, but are required between items, although a comma # may be used (with or without spaces). # # Note that a year here is 365.25 days and a month is 30 days. # # With -R start_time, a relative time is parsed and start_time is treated # as the start of the period. This allows months and years to be calculated # accurately. If the option -m (minus) is also given the relative time is # taken backwards from the start time. # # This allows forms like: # 30 years 3 months 4 days 3:42:41 # 14 days 5 hours # 4d,10hr # In this case absolute dates are ignored. emulate -L zsh setopt extendedglob # xtrace zmodload -i zsh/datetime || return 1 # separator characters before time or between time and date # allow , - or : before the time: this allows spaceless but still # relatively logical dates like 2006/09/19:14:27 # don't allow / before time ! the above # is not 19 hours 14 mins and 27 seconds after anything. local tschars="[-,:[:blank:]]" # start pattern for time when anchored local tspat_anchor="(${tschars}#)" # ... when not anchored local tspat_noanchor="(|*${tschars})" # separator characters between elements. comma is fairly # natural punctuation; otherwise only allow whitespace. local schars="[.,[:space:]]" local -a dayarr dayarr=(sun mon tue wed thu fri sat) local daypat="${schars}#((#B)(${(j.|.)dayarr})[a-z]#~month*)" # Start pattern for date: treat , as space for simplicity. This # is illogical at the start but saves lots of minor fiddling later. # Date start pattern when anchored at the start. # We need to be able to ignore the day here, although (for consistency # with the unanchored case) we don't remove it until later. # (The problem in the other case is that matching anything before # the day of the week is greedy, so the day of the week gets ignored # if it's optional.) local dspat_anchor="(|(#B)(${daypat}|)(#b)${schars}#)" local dspat_anchor_noday="(|${schars}#)" # Date start pattern when not anchored at the start. local dspat_noanchor="(|*${schars})" # end pattern for relative times: similar remark about use of $schars. local repat="(|s)(|${schars}*)" # not locale-dependent! I don't know how to get the months out # of the system for the purpose of finding out where they occur. # We may need some completely different heuristic. local monthpat="(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]#" integer daysecs=$(( 24 * 60 * 60 )) local d="[[:digit:]]" integer year year2 month month2 day day2 hour minute second then nth wday wday2 local opt line orig_line mname MATCH MBEGIN MEND tz test rest_line local -a match mbegin mend # Flags that we found a date or a time (maybe a relative time) integer date_found time_found # Flag that it's OK to have a time only integer time_ok # Indices of positions of start and end of time and dates found. # These are actual character indices as zsh would normally use, i.e. # line[time_start,time_end] is the string for the time. integer time_start time_end date_start date_end integer anchor anchor_end debug setvar integer relative relative_start reladd reldate relsign=1 newadd h1 h2 hd while getopts "aAdmrR:st" opt; do case $opt in (a) # anchor (( anchor = 1 )) ;; (A) # anchor at end, too (( anchor = 1, anchor_end = 1 )) ;; (d) # enable debug output (( debug = 1 )) ;; (m) # relative with negative offsets (( relsign = -1 )) ;; (r) # relative with no fixed start (( relative = 1 )) ;; (R) # relative with fixed start supplied (( relative_start = OPTARG, relative = 2 )) ;; (s) (( setvar = 1 )) ;; (t) (( time_ok = 1 )) ;; (*) return 1 ;; esac done shift $(( OPTIND - 1 )) line=$1 local dspat dspat_noday tspat if (( anchor )); then # Anchored at the start. dspat=$dspat_anchor dspat_noday=$dspat_anchor_noday if (( relative )); then tspat=$tspat_anchor else # We'll test later if the time is associated with the date. tspat=$tspat_noanchor fi # We can save a huge amount of grief (I've discovered) if when # we're anchored to the start we ignore anything after a newline. # However, don't do this if we're anchored to the end. The # match should fail if there are extra lines in that case. if [[ anchor_end -eq 0 && $line = (#b)([^$'\n']##)($'\n'*) ]]; then line=$match[1] rest_line=$match[2] fi else dspat=$dspat_noanchor dspat_noday=$dspat_noanchor tspat=$tspat_noanchor fi orig_line=$line # Look for a time separately; we need colons for this. # We want to look for the first time to ensure it's associated # with a date at the start of the line. Of course there may be # a time followed by some other text followed by a date, but # in that case the whole thing is too ambiguous to worry about # (and we don't need to worry about this for a calendar entry where # the date must be at the start). # # We do this by minimal matching at the head, i.e. ${...#...}. # To use a case statement we'd need to be able to request non-greedy # matching for a pattern. local rest # HH:MM:SECONDS am/pm with optional decimal seconds rest=${line#(#ibm)${~tspat}(<0-12>):(<0-59>)[.:]((<0-59>)(.<->|))[[:space:]]#([ap])(|.)[[:space:]]#m(.|[[:space:]]|(#e))} if [[ $rest != $line ]]; then hour=$match[2] minute=$match[3] second=$match[5] [[ $match[7] = (#i)p ]] && (( hour <= 12 )) && (( hour += 12 )) time_found=1 fi if (( time_found == 0 )); then # no seconds, am/pm rest=${line#(#ibm)${~tspat}(<0-12>):(<0-59>)[[:space:]]#([ap])(|.)[[:space:]]#m(.|[[:space:]]|(#e))} if [[ $rest != $line ]]; then hour=$match[2] minute=$match[3] [[ $match[4] = (#i)p ]] && (( hour <= 12 )) && (( hour += 12 )) time_found=1 fi fi if (( time_found == 0 )); then # no colon, even, but a.m./p.m. indicator rest=${line#(#ibm)${~tspat}(<0-12>)[[:space:]]#([ap])(|.)[[:space:]]#m(.|[[:space:]]|(#e))} if [[ $rest != $line ]]; then hour=$match[2] minute=0 [[ $match[3] = (#i)p ]] && (( hour <= 12 )) && (( hour += 12 )) time_found=1 fi fi if (( time_found == 0 )); then # 24 hour clock, with seconds rest=${line#(#ibm)${~tspat}(<0-24>):(<0-59>)[.:]((<0-59>)(.<->|))(.|[[:space:]]|(#e))} if [[ $rest != $line ]]; then hour=$match[2] minute=$match[3] second=$match[5] time_found=1 fi fi if (( time_found == 0 )); then rest=${line#(#ibm)${~tspat}(<0-24>):(<0-59>)(.|[[:space:]]|(#e))} if [[ $rest != $line ]]; then hour=$match[2] minute=$match[3] time_found=1 fi fi if (( time_found == 0 )); then # Combined date and time formats: here we can use an anchor because # we know the complete format. (( anchor )) && tspat=$tspat_anchor # RFC 2445 rest=${line#(#ibm)${~tspat}(|\"[^\"]##\":)($~d$~d$~d$~d)($~d$~d)($~d$~d)T($~d$~d)($~d$~d)($~d$~d)([[:space:]]#|(#e))} if [[ $rest != $line ]]; then year=$match[3] month=$match[4] day=$match[5] hour=$match[6] minute=$match[7] second=$match[8] # signal don't need to take account of time in date... time_found=2 date_found=1 date_start=$mbegin[3] date_end=$mend[-1] fi fi (( hour == 24 )) && hour=0 if (( time_found && ! date_found )); then # time was found; if data also found already, process below. time_start=$mbegin[2] time_end=$mend[-1] # Remove the timespec because it may be in the middle of # the date (as in the output of "date". # There may be a time zone, too, which we don't yet handle. # (It's not in POSIX strptime() and libraries don't support it well.) # This attempts to remove some of the weirder forms. if [[ $line[$time_end+1,-1] = (#b)[[:space:]]#([A-Z][A-Z][A-Z]|[-+][0-9][0-9][0-9][0-9])([[:space:]]|(#e))* || \ $line[$time_end+1,-1] = (#b)[[:space:]]#([A-Z][A-Z][A-Z](|[-+])<0-12>)([[:space:]]|(#e))* || \ $line[$time_end+1,-1] = (#b)[[:space:]]#([A-Z][A-Z][A-Z](|[-+])<0-12>[A-Z][A-Z][A-Z])([[:space:]]|(#e))* ]]; then (( time_end += ${mend[-1]} )) tz=$match[1] fi line=$line[1,time_start-1]$line[time_end+1,-1] (( debug )) && print "line after time: $line" fi if (( relative == 0 && date_found == 0 )); then # Date. case $line in # Look for YEAR[-/.]MONTH[-/.]DAY ((#bi)${~dspat}((19|20)[0-9][0-9])[-/](<1-12>)[-/](<1-31>)*) year=$match[2] month=$match[4] day=$match[5] date_start=$mbegin[2] date_end=$mend[5] date_found=1 ;; # Same with month name ((#bi)${~dspat}((19|20)[0-9][0-9])[-/]${~monthpat}[-/](<1-31>)*) year=$match[2] mname=$match[4] day=$match[5] date_start=$mbegin[2] date_end=$mend[5] date_found=1 ;; # Look for DAY[th/st/nd/rd] MNAME[,] YEAR ((#bi)${~dspat}(<1-31>)(|th|st|nd|rd)[[:space:]]##${~monthpat}(|,)[[:space:]]##((19|20)[0-9][0-9])*) day=$match[2] mname=$match[4] year=$match[6] date_start=$mbegin[2] date_end=$mend[6] date_found=1 ;; # Look for MNAME DAY[th/st/nd/rd][,] YEAR ((#bi)${~dspat}${~monthpat}[[:space:]]##(<1-31>)(|th|st|nd|rd)(|,)[[:space:]]##((19|20)[0-9][0-9])*) mname=$match[2] day=$match[3] year=$match[6] date_start=$mbegin[2] date_end=$mend[6] date_found=1 ;; # Look for DAY[th/st/nd/rd] MNAME; assume current year ((#bi)${~dspat}(<1-31>)(|th|st|nd|rd)[[:space:]]##${~monthpat}(|,)([[:space:]]##*|)) day=$match[2] mname=$match[4] strftime -s year "%Y" $EPOCHSECONDS date_start=$mbegin[2] date_end=$mend[5] date_found=1 ;; # Look for MNAME DAY[th/st/nd/rd]; assume current year ((#bi)${~dspat}${~monthpat}[[:space:]]##(<1-31>)(|th|st|nd|rd)(|,)([[:space:]]##*|)) mname=$match[2] day=$match[3] strftime -s year "%Y" $EPOCHSECONDS date_start=$mbegin[2] date_end=$mend[5] date_found=1 ;; # Now it gets a bit ambiguous. # Look for DAY[th/st/nd/rd][/]MONTH[/ ,]YEAR ((#bi)${~dspat}(<1-31>)(|th|st|nd|rd)/(<1-12>)((|,)[[:space:]]##|/)((19|20)[0-9][0-9])*) day=$match[2] month=$match[4] year=$match[7] date_start=$mbegin[2] date_end=$mend[7] date_found=1 ;; # Look for MONTH[/]DAY[th/st/nd/rd][/ ,]YEAR ((#bi)${~dspat}(<1-12>)/(<1-31>)(|th|st|nd|rd)((|,)[[:space:]]##|/)((19|20)[0-9][0-9])*) month=$match[2] day=$match[3] year=$match[7] date_start=$mbegin[2] date_end=$mend[7] date_found=1 ;; # Look for WEEKDAY ((#bi)${~dspat_noday}(${~daypat})(|${~schars})*) integer wday_now wday local wdaystr=${(L)match[3]} date_start=$mbegin[2] date_end=$mend[2] # Find the day number. local -a wdays # This is the ordering of %w in strtfime (zero-offset). wdays=(sun mon tue wed thu fri sat sun) (( wday = ${wdays[(i)$wdaystr]} - 1 )) # Find the date for that day. (( then = EPOCHSECONDS )) strftime -s wday_now "%w" $then # Day is either today or in the past. (( wday_now < wday )) && (( wday_now += 7 )) (( then -= (wday_now - wday) * 24 * 60 * 60 )) strftime -s year "%Y" $then strftime -s month "%m" $then strftime -s day "%d" $then date_found=1 ;; # Look for "today", "yesterday", "tomorrow" ((#bi)${~dspat_noday}(yesterday|today|tomorrow|now)(|${~schars})*) (( then = EPOCHSECONDS )) case ${(L)match[2]} in (yesterday) (( then -= daysecs )) ;; (tomorrow) (( then += daysecs )) ;; (now) time_found=1 time_end=0 time_start=1 strftime -s hour "%H" $then strftime -s minute "%M" $then strftime -s second "%S" $then ;; esac strftime -s year "%Y" $then strftime -s month "%m" $then strftime -s day "%d" $then date_start=$mbegin[2] date_end=$mend[2] date_found=1 ;; esac fi if (( date_found || (time_ok && time_found) )); then # date found # see if there's a day at the start if (( date_found )); then if [[ ${line[1,$date_start-1]} = (#bi)${~daypat}${~schars}# ]]; then date_start=$mbegin[1] fi line=${line[1,$date_start-1]}${line[$date_end+1,-1]} fi if (( time_found == 1 )); then if (( date_found )); then # If we found a time, it must be associated with the date, # or we can't use it. Since we removed the time from the # string to find the date, however, it's complicated to # know where both were found. Reconstruct the date indices of # the original string. if (( time_start <= date_start )); then # Time came before start of date; add length in. (( date_start += time_end - time_start + 1 )) fi if (( time_start <= date_end )); then (( date_end += time_end - time_start + 1 )) fi if (( time_end + 1 < date_start )); then # If time wholly before date, OK if only separator characters # in between. (This allows some illogical stuff with commas # but that's probably not important.) if [[ ${orig_line[time_end+1,date_start-1]} != ${~schars}# ]]; then # Clearly this can't work if anchor is set. In principle, # we could match the date and ignore the time if it wasn't. # However, that seems dodgy. return 1 else # Form massaged line by removing the entire date/time chunk. line="${orig_line[1,time_start-1]}${orig_line[date_end+1,-1]}" fi elif (( date_end + 1 < time_start )); then # If date wholly before time, OK if only time separator characters # in between. This allows 2006/10/12:13:43 etc. if [[ ${orig_line[date_end+1,time_start-1]} != ${~tschars}# ]]; then # Here, we assume the time is associated with something later # in the line. This is pretty much inevitable for the sort # of use we are expecting. For example, # 2006/10/24 Meeting from early, may go on till 12:00. # or with some uses of the calendar system, # 2006/10/24 MR 1 Another pointless meeting WARN 01:00 # The 01:00 says warn an hour before, not that the meeting starts # at 1 am. About the only safe way round would be to force # a time to be present, but that's not how the traditional # calendar programme works. # # Hence we need to reconstruct. (( time_found = 0, hour = 0, minute = 0, second = 0 )) line="${orig_line[1,date_start-1]}${orig_line[date_end+1,-1]}" else # As above. line="${orig_line[1,date_start-1]}${orig_line[time_end+1,-1]}" fi fi else # Time only. # We didn't test anchors for time originally, since it # might have been embedded in the date. If there's no date, # we need to test specially. if (( anchor )) && [[ ${orig_line[1,time_start-1]} != ${~tschars}# ]]; then # Anchor at start failed. return 1 fi strftime -s year "%Y" $EPOCHSECONDS strftime -s month "%m" $EPOCHSECONDS strftime -s day "%d" $EPOCHSECONDS # Date now handled. (( date_found = 1 )) fi if (( debug )); then print "Time string: $time_start,$time_end:" \ "'$orig_line[time_start,time_end]'" (( date_ok )) && print "Date string: $date_start,$date_end:" \ "'$orig_line[date_start,date_end]'" print "Remaining line: '$line$rest_line'" fi fi fi if (( relative )); then if (( relative == 2 )); then # Relative years and months are variable, and we may need to # be careful about days. strftime -s year "%Y" $relative_start strftime -s month "%m" $relative_start strftime -s day "%d" $relative_start strftime -rs then "%Y:%m:%d" "${year}:${month}:${day}" fi if [[ $line = (#bi)${~dspat}(<->|)[[:space:]]#(y|yr|year|yearly)${~repat} ]]; then [[ -z $match[2] ]] && match[2]=1 if (( relative == 2 )); then # We need the difference between relative_start & the # time ${match[2]} years later. This means keeping the month and # day the same and changing the year. (( year2 = year + relsign * ${match[2]} )) strftime -rs reldate "%Y:%m:%d" "${year2}:${month}:${day}" # If we've gone from a leap year to a non-leap year, go back a day. strftime -s month2 "%m" $reldate (( month2 != month )) && (( reldate -= daysecs )) # Keep this as a difference for now since we may need to add in other stuff. (( reladd += reldate - then )) else (( reladd += relsign * ((365*4+1) * daysecs * ${match[2]} + 1) / 4 )) fi line=${line[1,$mbegin[2]-1]}${line[$mend[4]+1,-1]} time_found=1 fi if [[ $line = (#bi)${~dspat}(<->|)[[:space:]]#(mth|mon|mnth|month|monthly)${~repat} ]]; then [[ -z $match[2] ]] && match[2]=1 if (( relative == 2 )); then # Need to add on ${match[2]} months as above. (( month2 = month + relsign * ${match[2]} )) if (( month2 <= 0 )); then # going backwards beyond start of given year (( year2 = year + month2 / 12 - 1, month2 = month2 + (year-year2)*12 )) else (( year2 = year + (month2 - 1)/ 12, month2 = (month2 - 1) % 12 + 1 )) fi strftime -rs reldate "%Y:%m:%d" "${year2}:${month2}:${day}" # If we've gone past the end of the month because it was too short, # we have two options (i) get the damn calendar fixed (ii) wind # back to the end of the previous month. (ii) is easier for now. if (( day > 28 )); then while true; do strftime -s day2 "%d" $reldate # There are only up to 3 days in it, so just wind back one at a # time. Saves counting. (( day2 >= 28 )) && break (( reldate -= daysecs )) done fi (( reladd += reldate - then )) else (( reladd += relsign * 30 * daysecs * ${match[2]} )) fi line=${line[1,$mbegin[2]-1]}${line[$mend[4]+1,-1]} time_found=1 fi # For the next three items we accumulate adjustments in "newadd". # See note below for why they are special. if [[ $relative = 2 && $line = (#bi)${~dspat_noday}(<->)(th|rd|nd|st)(${~daypat})(|${~schars}*) ]]; then nth=$match[2] test=${(L)${${match[4]##${~schars}#}%%${~schars}#}[1,3]} wday=${dayarr[(I)$test]} if (( wday )); then line=${line[1,$mbegin[2]-1]}${line[$mend[4]+1,-1]} time_found=1 # We want weekday 0 to 6 (( wday-- )) (( reldate = relative_start + reladd )) strftime -s year2 "%Y" $reldate strftime -s month2 "%m" $reldate # Find day of week of the first of the month we've landed on. strftime -rs then "%Y:%m:%d" "${year2}:${month2}:1" strftime -s wday2 "%w" $then # Calculate day of month (( day = 1 + (wday - wday2) + (nth - 1) * 7 )) (( wday < wday2 )) && (( day += 7 )) # whereas the day of the month calculated so far is... strftime -s day2 "%d" $reldate # so we need to compensate by... (( newadd += (day - day2) * daysecs )) fi fi if [[ $line = (#bi)${~dspat}(<->|)[[:space:]]#(w|wk|week|weekly)${~repat} ]]; then [[ -z $match[2] ]] && match[2]=1 (( newadd += relsign * 7 * daysecs * ${match[2]} )) line=${line[1,$mbegin[2]-1]}${line[$mend[4]+1,-1]} time_found=1 fi if [[ $line = (#bi)${~dspat}(<->|)[[:space:]]#(d|dy|day|daily)${~repat} ]]; then [[ -z $match[2] ]] && match[2]=1 (( newadd += relsign * daysecs * ${match[2]} )) line=${line[1,$mbegin[2]-1]}${line[$mend[4]+1,-1]} time_found=1 fi if (( relative == 2 && newadd )); then # You thought a day was always the same time? Ho, ho, ho. # If the clocks go forward or back, we can gain or lose # an hour. Check this by seeing what the hour is before # and after adding the number of days. If it changes, # remove the difference. # # We need this correction for days (including days of a given # month) and weeks. # We don't need it for years and months because we calculated # those by actually looking at the calendar for a given # time of day, so the adjustment came out in the wash. # We don't need it for hours or smaller periods because # presumably if a user asks for something in 3 hours time # they don't mean 4 hours if the clocks went back and # 2 hours if they went forward. At least, I think so. # Consider: # % calendar_showdate +2d,1hr # Sun Mar 25 00:37:00 GMT 2007 # % calendar_showdate +2d,2hr # Sun Mar 25 02:37:09 BST 2007 # At first sight that looks wrong because the clock appears # to jump two hours. (Yes, it took me all of 9 seconds to # edit the line.) But actually it's only jumped the hour # you asked for, because one is in GMT and the other in BST. # In principle you could say the same thing about days: # Sun Mar 25 00:00:00 GMT 2007 and Mon Mar 26 01:00:00 BST 2007 # are a day apart. But usually if you say "same time next Tuesday" # you mean "when the clock says the same time, even if someone # has nipped in and adjusted it in the mean time", although # for some reason you don't usually bother saying that. # # Hope that's clear. strftime -s h1 "%H" $(( relative_start + reladd )) strftime -s h2 "%H" $(( relative_start + reladd + newadd )) (( hd = h2 - h1 )) # and of course we might go past midnight... if (( hd > 12 )); then (( hd -= 24 )) elif (( hd < -12 )); then (( hd += 24 )) fi (( newadd -= hd * 3600 )) fi (( reladd += newadd )) if [[ $line = (#bi)${~dspat}(<->|)[[:space:]]#(h|hr|hour|hourly)${~repat} ]]; then [[ -z $match[2] ]] && match[2]=1 (( reladd += relsign * 60 * 60 * ${match[2]} )) line=${line[1,$mbegin[2]-1]}${line[$mend[4]+1,-1]} time_found=1 fi if [[ $line = (#bi)${~dspat}(<->)[[:space:]]#(min|minute)${~repat} ]]; then (( reladd += relsign * 60 * ${match[2]} )) line=${line[1,$mbegin[2]-1]}${line[$mend[4]+1,-1]} time_found=1 fi if [[ $line = (#bi)${~dspat}(<->)[[:space:]]#(s|sec|second)${~repat} ]]; then (( reladd += relsign * ${match[2]} )) line=${line[1,$mbegin[2]-1]}${line[$mend[4]+1,-1]} time_found=1 fi fi if (( relative )); then # If no date was found, we're in trouble unless we found a time. if (( time_found )); then if (( anchor_end )); then # must be left with only separator characters if [[ $line != ${~schars}# ]]; then return 1 fi fi # relative_start is zero if we're not using it (( reladd += (hour * 60 + minute) * 60 + second )) typeset -g REPLY (( REPLY = relative_start + reladd )) [[ -n $setvar ]] && typeset -g REPLY2="$line$rest_line" return 0 fi return 1 elif (( date_found == 0 )); then return 1 fi if (( anchor_end )); then # must be left with only separator characters if [[ $line != ${~schars}# ]]; then return 1 fi fi local fmt nums if [[ -n $mname ]]; then fmt="%Y %b %d %H %M %S" nums="$year $mname $day $hour $minute $second" else fmt="%Y %m %d %H %M %S" nums="$year $month $day $hour $minute $second" fi strftime -s REPLY -r $fmt $nums [[ -n $setvar ]] && typeset -g REPLY2="$line$rest_line" return 0