Compare commits

..

561 Commits

Author SHA1 Message Date
axel
44e8a12b66 Update darcs completions with additional command specific completion for setpref subcommand
darcs-hash:20070208172759-ac50b-2a233f8590dbb13a47ff243efa351dc6bce8f47a.gz
2007-02-09 03:27:59 +10:00
axel
fe21577a8e MArk make_mercurial_completions.fish as executable
darcs-hash:20070208172658-ac50b-c721b6a07934d11e8467dad78a2fbb206f0b24cd.gz
2007-02-09 03:26:58 +10:00
axel
a4ac924512 Bump version number
darcs-hash:20070208170725-ac50b-083a3c094fc4901b949cd71e7ff956f6dae958c4.gz
2007-02-09 03:07:25 +10:00
axel
e936629dc3 Minor documentation update to reflect change in how __fish_complete_suffix function works
darcs-hash:20070208170339-ac50b-3ce23bc61e8cd7c4874748dd5f1395739c57ad36.gz
2007-02-09 03:03:39 +10:00
axel
dfabf7f206 Update todo list
darcs-hash:20070208170232-ac50b-7413e8283f40a38c9790b391a70954897ae0bcae.gz
2007-02-09 03:02:32 +10:00
axel
7118269e4b Minor tweaks to vared function
darcs-hash:20070208170118-ac50b-76ea318d47de28a4437ecf0a50daea2c617017ea.gz
2007-02-09 03:01:18 +10:00
axel
100355c3c1 Add chengelog entry to spec file for fish
darcs-hash:20070208170032-ac50b-d748dc073ffb6ea0e209d0d99bd3dcc6eba2f2cd.gz
2007-02-09 03:00:32 +10:00
axel
4b1fced1f8 Add -u flag to case completions - case is often used to parse switches, coloring them red makes no sense
darcs-hash:20070205122839-ac50b-a87b86846216ad495f58825f3cb27692fc8bf269.gz
2007-02-05 22:28:39 +10:00
axel
abff4e5b41 Add flags for long file support in configure.ac. They should be useful when supported (e.g. Linux and Solaris) and should do no harm when unsupported.
darcs-hash:20070205122553-ac50b-93adeeafc5c4bb43397e4b088f6e9de5744b3058.gz
2007-02-05 22:25:53 +10:00
axel
25082b6528 Update vi/vim completions. Add __fish_complete_text function that completes using any text file, and __fish_filter_mime that filters a file list based on mimetype. This update was written by Velko Hristov with some suggestions and updates by me.
darcs-hash:20070204151809-ac50b-b7f3b44ac528f9e994bf0f842ee2e008866fb620.gz
2007-02-05 01:18:09 +10:00
axel
766482d90e Fix bug in read builtin - signal handlers where not correctly set, causiong ^C not to work
darcs-hash:20070201002053-ac50b-b73e22cbeecaeb364974cd2c512efbd517bb90d3.gz
2007-02-01 10:20:53 +10:00
axel
15e0a44fc7 Fix bug where pressing ^C while in the read builtin would mess up the block execution bit
darcs-hash:20070131235810-ac50b-23dde9d0e13cc028b744307073c1daf989258b54.gz
2007-02-01 09:58:10 +10:00
axel
3b653cd26a Fix indentation error - the else builtin was not properly indented
darcs-hash:20070131231820-ac50b-1c5825cd78a1636801b8a4a26c1d15eb811cb28f.gz
2007-02-01 09:18:20 +10:00
axel
ba6661e9df Fix occasional duplicate stack trace, reported by Mike Roberts. Also make fish less likely to print huge amounts of help in non-interactive mode, as per suggestion from Mike Roberts.
darcs-hash:20070131160317-ac50b-8354948f55a1478515ebfe7ddb6db14b6775dd18.gz
2007-02-01 02:03:17 +10:00
axel
55af8e4966 Add support for checking the existance of specific variable array elements
darcs-hash:20070130204344-ac50b-d006de7693722677d052f7559923753acd27a4a2.gz
2007-01-31 06:43:44 +10:00
axel
dcad2ef17b Switch various completions to the simpler format for __fish_complete_suffix
darcs-hash:20070130153435-ac50b-abe42f3f464cb96db062c83084d97ef377a72e80.gz
2007-01-31 01:34:35 +10:00
axel
418192b312 Make the first and last argument to __fish_complete_suffix optional. Use mimedb to look up descriptions if not supplied.
darcs-hash:20070130152631-ac50b-24f1c947d88ce3ad20f31a17b58adfe02cf002e2.gz
2007-01-31 01:26:31 +10:00
axel
76d9051605 Add vim completions, written by Velko Hristov
darcs-hash:20070130004233-ac50b-5c48b940b29ac4f3c377bc88e2abf2e490e9df48.gz
2007-01-30 10:42:33 +10:00
axel
ca2b2103d3 Add command specific completions for xterm, written by Velko Hristov
darcs-hash:20070130000155-ac50b-7834a733d6bc48f3b57172fa6dc49c36680d575d.gz
2007-01-30 10:01:55 +10:00
axel
14e6bdb139 Add command specific completions for totem, written by Velko Hristov
darcs-hash:20070130000128-ac50b-8aec9bbe3858d03189720ed6fc9906ce8f9d4ddc.gz
2007-01-30 10:01:28 +10:00
axel
20d42378de Remove trailing period in descriptions for darcs and svn
darcs-hash:20070129183116-ac50b-c4870570baaee554457413360c084209cb6a4090.gz
2007-01-30 04:31:16 +10:00
axel
41c9f89fcf Add memory allocation check
darcs-hash:20070129175223-ac50b-05b933837cf0522889287069d5ed2fcacaf62b6a.gz
2007-01-30 03:52:23 +10:00
axel
7953863b38 Fix bug where quiting from the read builtin could cause the prompt not to repaint
darcs-hash:20070129174501-ac50b-7e7f62ab8a1864617291208919551505bae6e156.gz
2007-01-30 03:45:01 +10:00
axel
3fff030ee2 When clearing a line in the screen handler, also make sure that the internal state reflects this. This helps avoid issues with wiping out parts of the prompt
darcs-hash:20070129174358-ac50b-73d002a44ef53ba63e33c66073eea6fec449b9d0.gz
2007-01-30 03:43:58 +10:00
axel
da9f7227f5 Fix repaint bug for read - screen needed repainting after call to read
darcs-hash:20070129162807-ac50b-c037ecfc0670a1f2795982337760f76036d6cdc5.gz
2007-01-30 02:28:07 +10:00
axel
ba932b6590 Add support for -s switch to read builtin, enables shell syntax highlighting in the read builtin
darcs-hash:20070129162624-ac50b-dff9d9ebf16ce3247b83d917efbffd4942cda83f.gz
2007-01-30 02:26:24 +10:00
axel
c02e2b1320 Empty environemnt variable array entrys are now set to the empty string - what value should they really have?
darcs-hash:20070128134331-ac50b-a1efdcd67e1d142c5f234a4018187fdb2f70b567.gz
2007-01-28 23:43:31 +10:00
axel
37a95a3096 Make parsing of --authorative switch for complete builtin more logical. Fix bug with previous approach causing some completions to be ignored.
darcs-hash:20070128134059-ac50b-de53eb223939fbdf0d247dfbe343c62fc31cce11.gz
2007-01-28 23:40:59 +10:00
axel
bbd229b206 Add command specific completions for file and locate, written by Velko Hristov
darcs-hash:20070128114415-ac50b-f5844d6523a9aed3ca0e881c6c125072caee4978.gz
2007-01-28 21:44:15 +10:00
axel
6a60377e02 Add -u switch to completions which can have unknown switches or which are incomplete
darcs-hash:20070128032652-ac50b-dae70e7b2efddbc757aae8bc7d1884ff5e010621.gz
2007-01-28 13:26:52 +10:00
axel
fc87b3c4b4 Make it possible to specify the -u switch tom complete without actually specifying any new completions, since it affects all previous completions
darcs-hash:20070128032416-ac50b-93b943d712ac072f1bdb7f568e8064f73ffb85e0.gz
2007-01-28 13:24:16 +10:00
axel
fcbdb6f2a7 Add command specific completions for mutt and sylpheed, written by Velko Hristov
darcs-hash:20070128024639-ac50b-484668bdfb13c4cd23e058224d14b8f6d52b04d0.gz
2007-01-28 12:46:39 +10:00
axel
a537b01814 Add aptitude completions, written by Velko Hristov.
darcs-hash:20070127231612-ac50b-0a3b6ef52a01b5b15b0b1a9f11df739d02fa353c.gz
2007-01-28 09:16:12 +10:00
axel
bd5a16d213 Add support for using __environ instead of environ, if it exists and environ isn't set
darcs-hash:20070127165911-ac50b-72747760d767a6918152c2e4f254febb19ab1205.gz
2007-01-28 02:59:11 +10:00
axel
be0bd50bad Remove unneeded code from isatty, fix spelling in docs
darcs-hash:20070127141215-ac50b-d15c657b62862841df80c55095a05e9c38086a11.gz
2007-01-28 00:12:15 +10:00
axel
cab5c63402 Verify that fd redirection is an int
darcs-hash:20070127135010-ac50b-d9c048edc5579c460ed2b181c366c67e9cfd7beb.gz
2007-01-27 23:50:10 +10:00
axel
d480d892c9 Do not call getc if getwc fails - mixing wide and byte-based readin may cause a crash. IT's better to simply hope that getwc can recover.
darcs-hash:20070127021026-ac50b-b85e10029d2bc0ce4857ec48945a92270e499a07.gz
2007-01-27 12:10:26 +10:00
axel
f2ccbe7374 Make get_desc_buff variable functions local static instead of global
darcs-hash:20070127020924-ac50b-0dfd72f6c30a82adc9500020df4b7bafb8d6dd56.gz
2007-01-27 12:09:24 +10:00
axel
85241817f8 Drop unneeded generic descriptions for completion of functions and builtins. Add description for count.
darcs-hash:20070127020752-ac50b-62dba47967cac04cd242894bfaa03116461883f3.gz
2007-01-27 12:07:52 +10:00
axel
8cf46bdb5c Add make target for vuilding svn and cvs completions
darcs-hash:20070127020406-ac50b-a5dee791cf05cf76dd23395deee5e2d9f347c71b.gz
2007-01-27 12:04:06 +10:00
axel
5e6d1efb56 Fix a few more trailing N_ calls
darcs-hash:20070127020240-ac50b-6081d8cc0bc5d648b53b3ddfe878ec0f65412b6e.gz
2007-01-27 12:02:40 +10:00
axel
bc1f9b6f1c Another batch of fixes for the VCS completions
darcs-hash:20070127020141-ac50b-e617fbabb234af668fa7ded7f838d66477605c8d.gz
2007-01-27 12:01:41 +10:00
axel
85d069c106 Fix crash in tab completion code when completing an imcomplete backsalsh escape
darcs-hash:20070126171413-ac50b-a9338dc73863381f2b22e09fb8b5e711f64b8f29.gz
2007-01-27 03:14:13 +10:00
axel
cfecb58bb6 Fix various completions that didno't drop the N_ no-op
darcs-hash:20070126012631-ac50b-4e13c06ddbf73f05a0a26824c71dbb96aa7ce0b9.gz
2007-01-26 11:26:31 +10:00
axel
11c2ec91d4 Update make_mercurial_completions.fish to also handle cvs. Correct bug causing issues in darcs completions.
darcs-hash:20070126012321-ac50b-caa9749f5e844ce5d06d84f2c38e282049369ed1.gz
2007-01-26 11:23:21 +10:00
axel
cc6f133368 make the make_mercurial_completions.fish script able to handle svn as well. Update svn completions.
darcs-hash:20070125153452-ac50b-60dce711d8614f99ba24ab9b24acfbd879d58bfa.gz
2007-01-26 01:34:52 +10:00
axel
350b637a1a Generalize make_mercurial_completions.fish a bit so it can be used with darcs as well. Add make targets for creating darcs/hg completions.
darcs-hash:20070125132836-ac50b-0e7a728e4be2386d696094a414a1c8bcaee771fc.gz
2007-01-25 23:28:36 +10:00
axel
f917dccf6f Use make_completions.py to make new completions for gcc
darcs-hash:20070125012757-ac50b-21408f89b71abb894850ddff452c83d130ed0401.gz
2007-01-25 11:27:57 +10:00
axel
62d380a1ee Make first stab at a manual page parser. It takes the name of a command as input and outputs completions for it.
darcs-hash:20070125012728-ac50b-442dec7a0252f7cf817f442623161e33ce50c355.gz
2007-01-25 11:27:28 +10:00
axel
65ef6cf217 Add completions for hg (Mercurial). These completions are autogenerated from the help commands for mercurial through the make_mercurial_completions.fish script
darcs-hash:20070124225136-ac50b-1636989747df4e2510905e3286dbf1871522f653.gz
2007-01-25 08:51:36 +10:00
axel
2bba0f7b8f Use MB_LEN_MAX instead of MB_CUR_MAX as the length of an array, since the latter does not need to be a constant value, meaning it is illegal as an array size
darcs-hash:20070122165125-ac50b-884456df993125e0dc16cd8dfed1e63d350d05dd.gz
2007-01-23 02:51:25 +10:00
axel
565970b8ca Fix uninitialized varialble in env.c
darcs-hash:20070122012815-ac50b-a04cfc343ce75afd4feff8e25c580f9e54d5c5ef.gz
2007-01-22 11:28:15 +10:00
axel
6ea3dd7dfe Minor edit to init scripts to reduce number of non-builtins called on init
darcs-hash:20070121155057-ac50b-1fae99ef89abc7bc08dc31eb671bfc556e34202d.gz
2007-01-22 01:50:57 +10:00
axel
8176a1253b Do not use stdout to report errors when stderr is dead - take the hint instead...
darcs-hash:20070121152242-ac50b-3e192328959cf65f03756b3bfbb794fb43dccead.gz
2007-01-22 01:22:42 +10:00
axel
4f67c38777 Use constant instead of hardcoded value for sleeptime on failed fork call
darcs-hash:20070121152026-ac50b-1daaac921f31dd10b2646d51b65af5260890d291.gz
2007-01-22 01:20:26 +10:00
axel
86beb7b109 Minor code simplification in exec.c
darcs-hash:20070121151943-ac50b-d913d1b205443cdf40a83a1d001e4d7a114c6e0c.gz
2007-01-22 01:19:43 +10:00
axel
98a6c491b1 Print stack trace when execting due to fatal problem or bug
darcs-hash:20070121150341-ac50b-66b86014963568bf402a76d5beb7c1d4e188c5f7.gz
2007-01-22 01:03:41 +10:00
axel
66c045c439 Minor code edits. Add curly brackets in various places, add or rewrite various comments, fix indentation, etc.
darcs-hash:20070121150114-ac50b-4fd6965cb2c557178923f8afa944835166e08423.gz
2007-01-22 01:01:14 +10:00
axel
a1ec38f53b Check error code when writing output from builtins - try to report errors
darcs-hash:20070121145810-ac50b-46ecb601ce9f0d862f00e4a97f25b6034e52f4cc.gz
2007-01-22 00:58:10 +10:00
axel
64f1024eb5 Make all error messages from options parsin in builtins redirectable
darcs-hash:20070121145527-ac50b-1375af219a5eba6167e99d3fe24b26dba60eba2a.gz
2007-01-22 00:55:27 +10:00
axel
b3500bfbdc Fix bug in rsync completions
darcs-hash:20070121024539-ac50b-6bef9090303c56d117633077554bb43c40f64024.gz
2007-01-21 12:45:39 +10:00
axel
f8c45324b6 Add switch completions for the rsync command
darcs-hash:20070121023815-ac50b-178776e2fe6c3d510f4f1342269c132797a7793a.gz
2007-01-21 12:38:15 +10:00
axel
bf5d4f6b07 Simplify completions for a few commands (svn, cvs, darcs, yum)
darcs-hash:20070120170940-ac50b-24c0e5b05ca03a590b90e795bbd62b15583e2bd1.gz
2007-01-21 03:09:40 +10:00
axel
1300e68fa5 Add support for backtraces - if the compiler and libc version supports it (probably only glibc/gcc) then a stack trace is printed on serious bugs
darcs-hash:20070120023649-ac50b-5efa310bea0deddfa1d8dfca1000163eee89c7cb.gz
2007-01-20 12:36:49 +10:00
axel
1a76f2ecb9 Do not purge internal history if saving history to file fails
darcs-hash:20070120023347-ac50b-8e61c5f65cfca3ffdb6dd740fc32b91a975fdb87.gz
2007-01-20 12:33:47 +10:00
axel
9c5fb0392d Make save_function print the help text when given no argumetns. Thanks to Alexander Kellett for the suggestion.
darcs-hash:20070119131538-ac50b-a77f60f557677543f38c73ffc21a209432b8b26a.gz
2007-01-19 23:15:38 +10:00
axel
f4c5eaf05b Spelling fixes in documentation
darcs-hash:20070118173337-ac50b-4bfe34ea056f6fbc007df4c0b97cde695c822923.gz
2007-01-19 03:33:37 +10:00
axel
dd90b4ece4 Fix incorrect use of the term 'alias' where 'function' was meant in documentation
darcs-hash:20070118170034-ac50b-f10d79a1aed0e91d350db13187965bf2f5c45b7e.gz
2007-01-19 03:00:34 +10:00
axel
4930db35e2 Correctly unescape tokens when performing switch completion
darcs-hash:20070118164528-ac50b-fcaa59d247c4c6b430ab47b293d5eb173a97e9fc.gz
2007-01-19 02:45:28 +10:00
axel
e6409a88d5 Add missing completion for the commandline builtin
darcs-hash:20070118163104-ac50b-e33d3888efa42218881291ce1d2636ca14f10805.gz
2007-01-19 02:31:04 +10:00
axel
77a48dc252 Minor performance improvement in the variable assignment code
darcs-hash:20070118162922-ac50b-0f4bfd125e20673fdcb928e2a7aac6af50a1dec7.gz
2007-01-19 02:29:22 +10:00
axel
029be823e2 Remove the final non-builtin call from __fish_gnu_complete, to make it even faster
darcs-hash:20070118162853-ac50b-a31f51d53ba3121eaf6dfb4006dde00491fd53c2.gz
2007-01-19 02:28:53 +10:00
axel
421aff7d67 Make command specific completions handle quoted and otherwise escaped tokens better by making sure that the output from the commandline builtin is properly unescaped
darcs-hash:20070118162700-ac50b-cd93d9a6aff5bb7629a790d60b241000eb1d0ac0.gz
2007-01-19 02:27:00 +10:00
axel
9e7094adfc Fix bug in code for unescapiong strings - when not in unescape_special mode, quotes would not get properly removed. This patch also adds the ability to check that quotes match up when unescaping. This functionality is on by default and can be disabled using a special flag.
darcs-hash:20070118160246-ac50b-b230c3fcd8440025b5243d76de2a9fd400f7ea32.gz
2007-01-19 02:02:46 +10:00
axel
19e8d60179 Make 'fish --help' display a help message, not start the help browser
darcs-hash:20070117131246-ac50b-328c735ba09b8488cf6ee5b95d73290681ce5f06.gz
2007-01-17 23:12:46 +10:00
axel
9d9869e515 Documentation touchup. Give a few examples in the section about escapeing characters
darcs-hash:20070116164834-ac50b-dd4c23ae1b8e35bbb2d3e186c2a819d8f2647ec2.gz
2007-01-17 02:48:34 +10:00
axel
54e19b1efb Add a one-item cache into the hash table. This reduces the number of hash computations by roughly 20%
darcs-hash:20070116163707-ac50b-214a16d4210d32fb50693e71a14b6b8f3fededfe.gz
2007-01-17 02:37:07 +10:00
axel
f603b6ef68 Fix potential use of ininitialized variable. Could cause fish to save the history even when unneeded.
darcs-hash:20070116151130-ac50b-6186e6da834bae3ea07f3f25a105592f5115e0f3.gz
2007-01-17 01:11:30 +10:00
axel
81e0fcbc13 Additional performance tweak for __fish_gnu_complete
darcs-hash:20070116125116-ac50b-0a702bc02f9a126b36505864dcc597661a7ca2b0.gz
2007-01-16 22:51:16 +10:00
axel
b999bd9c8c Bugfix in __fish_gnu_complete - switches could be ignored
darcs-hash:20070116112226-ac50b-6d6ce88d87f74a3779e4c6de6c62068c49354966.gz
2007-01-16 21:22:26 +10:00
axel
9c9a8f9d0f Improve speed of __fish_gnu_complete on systems with no native seq implementation by avoiding using seq at all
darcs-hash:20070116102651-ac50b-ad7e0acd325f88d1676e4c533bc863caedf91748.gz
2007-01-16 20:26:51 +10:00
axel
461ef2a508 Fix completion bug where fish would refuse to provide completion strings for '--'
darcs-hash:20070116015938-ac50b-353566d9fd8984cabd56127a9088d57695e2b7ba.gz
2007-01-16 11:59:38 +10:00
axel
7492b6cdb3 Make all descriptions for function calls use the implicit translation from the previous patch instead of explicitly using N_
darcs-hash:20070116012918-ac50b-c1c0df64333ad910ca81dbc86ad193ece6680722.gz
2007-01-16 11:29:18 +10:00
axel
34e27ff4c2 Drop use of the N_ no-op for translation descriptions. Instead, tell xgettext that any token following '--description' should be translated. This should greatly speed up completion loading on platforms where fork() is slow. (Hi, OS X)
darcs-hash:20070116011828-ac50b-fb923dc877869ded4d506bbe0bc5364eea44092f.gz
2007-01-16 11:18:28 +10:00
axel
47588c8e75 Darcs completions: Check for file existance before trying to complete using the repos file. Thanks to Alexander Kellett for the bug report.
darcs-hash:20070115205209-ac50b-60c03383f55bb2dc1d0f5317d907f71c63b2bb7b.gz
2007-01-16 06:52:09 +10:00
axel
00c6fcfe98 Document -f option for psub, add tab completions
darcs-hash:20070115181924-ac50b-6ac48aec8937e9dd172858dfa7eaaac1aca14775.gz
2007-01-16 04:19:24 +10:00
axel
c90f7c3203 Update todo list
darcs-hash:20070115175516-ac50b-8e5e316633ff0951b9165067b9b0e777753f5365.gz
2007-01-16 03:55:16 +10:00
axel
6467ead9ad Make sure read returns with a non-zero status if no string was actually given
darcs-hash:20070115175346-ac50b-9bbcfd114344f030c46456d2d603ce323406bfea.gz
2007-01-16 03:53:46 +10:00
axel
cb7caf2afc Minor edits - add a few input checks, remove a few commented pieces of debug code, add a few brackets, etc.
darcs-hash:20070115175144-ac50b-2045f2132156645222e6dde57487aa299a5316e2.gz
2007-01-16 03:51:44 +10:00
axel
c6ebb23f38 Add a -f switch to psub to use regular files instead of fifos. This makes psub work with programs that need to seek. This change was suggested by Alexander Kellet.
darcs-hash:20070115174330-ac50b-2349cef2d1a26a9e7c9356691bc74991135c1d2c.gz
2007-01-16 03:43:30 +10:00
axel
5753d63958 Check all file writes for errors when saving history file
darcs-hash:20070112161724-ac50b-21721102c5844ba871668093cb7428dc793d2ba6.gz
2007-01-13 02:17:24 +10:00
axel
e56d9765d7 Add missing completions to ulimit
darcs-hash:20070112152048-ac50b-b402f5e5fb9bfa0720b7b89de465d06bf66a1ac3.gz
2007-01-13 01:20:48 +10:00
axel
a5b7ec2624 Clarify documentation for the ulimit builtin
darcs-hash:20070112151540-ac50b-70ce1dbbad6b4e559723e1c5f8cf6fc3e271cf77.gz
2007-01-13 01:15:40 +10:00
axel
b2fa41307c Clean up the 'ulimit' builtin. There was a bug making it impossible to set the stack size, the switch '-p' was erroneously accepted, and the multiplier was not always correctly used, e.g. when reporting limits.
darcs-hash:20070112150017-ac50b-aff8db509f1bc8bb9803aa66bfad70ebc85d27b2.gz
2007-01-13 01:00:17 +10:00
axel
fce74c73c7 Minor code edits - show user name when completing home directories and minor code simplifications
darcs-hash:20070110173445-ac50b-40fd22ba766239dcfe6797155a852591b76f9253.gz
2007-01-11 03:34:45 +10:00
axel
e110b29c2f Do not complete using switches after a '--' has been encountered
darcs-hash:20070110124528-ac50b-111f01af0701f2fcc2bd22a7666b74497835356a.gz
2007-01-10 22:45:28 +10:00
axel
a3aba0269d Make it possible to cancel a long-winded wildcard match by pressing ^C
darcs-hash:20070109164705-ac50b-d8bf2c22e9ecb6bccec6892da266016dcae79a4c.gz
2007-01-10 02:47:05 +10:00
axel
e1f4aa5fcd Updates to the swedish translation
darcs-hash:20070109141310-ac50b-0fd8faccb396f0576917be3e4096701a2cdc3ca7.gz
2007-01-10 00:13:10 +10:00
axel
e19ee86b0d Update dependencies for making .po files in Makefile
darcs-hash:20070109134457-ac50b-31e9a1225e7deb5c097fb05c103bc5dc5bb58eea.gz
2007-01-09 23:44:57 +10:00
axel
6e71b5a59c A few more error checks during string to integer conversion in various places
darcs-hash:20070109134117-ac50b-8816e238b0b6aa3fe83c0a4695d719a60b0d17d4.gz
2007-01-09 23:41:17 +10:00
axel
b70092e281 Check for errors during string to integer conversion in various places
darcs-hash:20070109032005-ac50b-29514c9c8c19c70b7cfe7670a5c74899f316931f.gz
2007-01-09 13:20:05 +10:00
axel
602eac89c4 Fix typo in user message, remove a few warnings, minor indentation edits
darcs-hash:20070109025356-ac50b-328e42b8898bbc9b40b4841a032ae7871dba9e13.gz
2007-01-09 12:53:56 +10:00
axel
d8b5cc6717 Handle out of memory condition in various parts of fish by shutting down instead of crashing
darcs-hash:20070109025102-ac50b-ee7951028e626628257852fd9b5de97572609cea.gz
2007-01-09 12:51:02 +10:00
axel
76fedccf13 Make it possible to specify an error handler function for out of memory in any of the collection functions. Make the default oom handler print the line where things failed and exit.
darcs-hash:20070109013521-ac50b-dc7304cfb548cf1efc100124125eed032e392169.gz
2007-01-09 11:35:21 +10:00
axel
41206e70b4 Make the bg builtin check that all specified jobs exist before sending any of them to background. Also make sure that the string to pid conversion didn't throw errors.
darcs-hash:20070109002144-ac50b-c3954d98bab5cd95699966b2d1f2480797a9094d.gz
2007-01-09 10:21:44 +10:00
axel
bc2c37c739 Fix accidentally triggering of error condition when nothing bad happened in fish pager init code
darcs-hash:20070108230338-ac50b-c4d0a44ee06660acf107388f1c889296a535494b.gz
2007-01-09 09:03:38 +10:00
axel
4a2a47666f Fix indentation and add a few comments to fish_pager
darcs-hash:20070107164336-ac50b-d3cfa100a499d3f0996aac16288c4c892a65c1fe.gz
2007-01-08 02:43:36 +10:00
axel
94fbbb7669 Update todo list
darcs-hash:20070107142445-ac50b-391ff0eac6a84ae3dd5345d338682d243d40fb0a.gz
2007-01-08 00:24:45 +10:00
axel
63010c26ad Two very minor code touch ups
darcs-hash:20070107142430-ac50b-20cd4fe96c03c052bb6fb5c07ce207a534e86498.gz
2007-01-08 00:24:30 +10:00
axel
f398b2eafa Remove comments from apropos matching in function for getting description for command from whatis database
darcs-hash:20070107142000-ac50b-0221d36e24d3d68f0a25535e7a7b303e4fb84abe.gz
2007-01-08 00:20:00 +10:00
axel
1214067d03 Redo the interface between fish and the completion pager. The old interface has issues if the current user does not own the tty, as happens when using 'su'. It also had issues when stderr was redirected. The new interface should be more extensible as well.
darcs-hash:20070107141336-ac50b-30bdfb198674b93a67d323c0a65b8e08b43c0525.gz
2007-01-08 00:13:36 +10:00
axel
0469d05447 Make it possible to buffer input to other file descriptors than stdin. It is still only possible to buffer input on a single descriptor to any given job.
darcs-hash:20070107141052-ac50b-561265cd5acde7d882e4506870f13d61d34b3734.gz
2007-01-08 00:10:52 +10:00
axel
2fcec27e23 Make sure errno is not changed when error reporting after a failed call to execve
darcs-hash:20070107140918-ac50b-35186f2300d6ec03dbeac2cb5d5ffcee3feffc4e.gz
2007-01-08 00:09:18 +10:00
axel
42d0283489 Fix bug in IO redirection making is possible for the IO redirections to fail in cases where there are multiple pipes and buffers using file descriptors above 2.
darcs-hash:20070107140646-ac50b-dee4f380320ef2743635e77401a789c28d45f805.gz
2007-01-08 00:06:46 +10:00
axel
3fbd8036f4 Fix potential crash bug when pasting large amounts of text into the shell
darcs-hash:20070107140410-ac50b-c7b680b05f3aaf7f10e6e06a0fdc232d30c3e1b1.gz
2007-01-08 00:04:10 +10:00
axel
3b4bacb5ba Allow the user to specify name of history file to use with the read builtin
darcs-hash:20070106142430-ac50b-32ad52077e11438799b17911dc83e57f89e02f2b.gz
2007-01-07 00:24:30 +10:00
axel
7e350dab66 Update the dcop completions. This update was written by David Bitseff.
darcs-hash:20070106130722-ac50b-a73277cfccbf456595f0fb7ceeb18d23b2f744ab.gz
2007-01-06 23:07:22 +10:00
axel
9c23d50e92 Fix bug in completion pager where non-ascii characters where escaped because the locale was set after the completion strings where read in. Thanks to mikeX for the report.
darcs-hash:20070103125702-ac50b-752f6e1182dba4356e068191b52fdb05d3cb5649.gz
2007-01-03 22:57:02 +10:00
axel
2ec7428e32 Add iconv completions
darcs-hash:20061226142933-ac50b-dd385732a0337f215855db4c517dc1bab52b2aca.gz
2006-12-27 00:29:33 +10:00
Tassilo Horn
594f81ec8c svn-delete-completion.dpatch
darcs-hash:20061221212334-c06f4-2db8d07267b142165302d63fd94fdc0eb9f6f791.gz
2006-12-22 07:23:34 +10:00
axel
9767b76881 Fix minor type in 'find' completions
darcs-hash:20061219152443-ac50b-989d374683f181a5fc41d162f2a0793ca31227ac.gz
2006-12-20 01:24:43 +10:00
axel
0ace93c2a4 Fix yet another place where the 'builtin' builtin was used in stead of 'command'
darcs-hash:20061214182409-ac50b-60af38f1b1edcafcf1c0aff9c64094b92a84e5fc.gz
2006-12-15 04:24:09 +10:00
axel
c73d165165 Make the directory history keyboard shortcuts repaint the screen. Otherwise, the prompt won't reflect the new CWD. This is needed because of the reduced amounts of repainting done since 1.22.2
darcs-hash:20061214182313-ac50b-a912bcc0fac6e1d78f116e19f31f1c50ffc409cb.gz
2006-12-15 04:23:13 +10:00
axel
c1945f8275 Minor highlighting tweaks to make highlighter handle switches to 'command' and 'builtin' builtins more correctly
darcs-hash:20061214134025-ac50b-e17f79d1d4d7594ab20a358296f84dbb6356f42b.gz
2006-12-14 23:40:25 +10:00
axel
4d368dc06c Do not add --help completions for builtins at init time. These completions are already present in the commmand specific completions
darcs-hash:20061214131239-ac50b-3626c53c9c985bc3b786d5d6baff5e162a5e4951.gz
2006-12-14 23:12:39 +10:00
axel
9ff0e9cf72 Fix incorrect use of the 'builtin' builtin when the 'command' builtin was intended
darcs-hash:20061214120630-ac50b-5cee4b32042bb23c1a4b01e2a400a4af13c64c9c.gz
2006-12-14 22:06:30 +10:00
axel
a971d91a70 Make tab completion of process expansion consider other processes than those owned by the shell. Also makes tab completion of process expansion properly handle paths in command names
darcs-hash:20061214115811-ac50b-8569bcd30f97fe505dc1e7f2596d2fbd23f31525.gz
2006-12-14 21:58:11 +10:00
axel
52b74f9f34 Make sure debug() never alters errno, so that it can safely be called between an error and calling wperror()
darcs-hash:20061214100131-ac50b-b1c2e4819567fc35858233c265a26b934620fc6d.gz
2006-12-14 20:01:31 +10:00
axel
b932a9a084 Minor correction to script for extracting translation strings
darcs-hash:20061214014117-ac50b-fe792403646e1859116973494f2278c88f76072b.gz
2006-12-14 11:41:17 +10:00
axel
997f2dffbf Make syntax highlighter flag invalid command types as subcommands for 'command' or 'builtin' builtins. Also make sure that the '--' switch is understood by the highlighter
darcs-hash:20061214013537-ac50b-9d84fe371eed10ce48ade5ebe88b00442658d67a.gz
2006-12-14 11:35:37 +10:00
axel
1289e03134 Only complelete valid command types as subcommands for 'command' or 'builtin' builtins. Also make sure that the '--' switch is understood by the completions
darcs-hash:20061214000326-ac50b-3ee9130ebb3fcc9b2723686945cfca055c4f44a4.gz
2006-12-14 10:03:26 +10:00
axel
9a8e5e64ed Make sure that a command is never executed as the subcommand of the 'builtin' builtin
darcs-hash:20061214000152-ac50b-f1593dfeb4cecdbe48599ffe8d76a956989c7d24.gz
2006-12-14 10:01:52 +10:00
axel
774c050f92 Minor code tweaks. Move a few deeple nested pieces of code to their own functions. There are lots of other places where this should be done as well.
darcs-hash:20061213235838-ac50b-c3bedea3017910cc4f0d257ad6ee1da6b76efd12.gz
2006-12-14 09:58:38 +10:00
axel
478a319442 Make the builtins 'and', 'or', 'not', 'exec', 'command' and 'builtin' respect the '--' argument
darcs-hash:20061213154449-ac50b-d2ae8ff5a1cab8e753ddb97545071cc985051411.gz
2006-12-14 01:44:49 +10:00
axel
24fea5dd7b Code cleanup: Use a macro constant instead fo a literal for builtin exit codes
darcs-hash:20061213143431-ac50b-5c5cec623ecca9f52c7d44cfcb26f07fe2fcda39.gz
2006-12-14 00:34:31 +10:00
axel
2b05bdfa94 Update functions builtin so that default behaviour when not given any arguments is to print only names of all existing functions, not their definitions. Use 'functions (functions)' to get the latter.
darcs-hash:20061213142107-ac50b-16d0a9097ede4b0cd49847618d65fcbfee699393.gz
2006-12-14 00:21:07 +10:00
axel
6c8a559023 Drop unneeded '--' when using set builtin in various places
darcs-hash:20061212203727-ac50b-23fbb54bba0c5773e8a3dd2e5737ea8a670c801d.gz
2006-12-13 06:37:27 +10:00
axel
ca8c337c94 Drop unneeded '--' when using set builtin in the trap function
darcs-hash:20061212181841-ac50b-dd1fd50b80c6d3c759c123832bc6334613529ee6.gz
2006-12-13 04:18:41 +10:00
axel
8ccad65504 Minor fix to help generation to avoid creating a stray doxygen file in share/man
darcs-hash:20061212172518-ac50b-fec0999bd0b19259eaeee76c78c04b052392a6bb.gz
2006-12-13 03:25:18 +10:00
axel
fd11f294bc Use the math function instead of calling bc directly in various places
darcs-hash:20061212171118-ac50b-a40709edf008f3d725e3755d5282ae5a84818c88.gz
2006-12-13 03:11:18 +10:00
axel
b3fa76c1be Extend documentation for the math function
darcs-hash:20061212171037-ac50b-1b9d0f51b284925fe0fc3020774ec32bb1414ce7.gz
2006-12-13 03:10:37 +10:00
axel
d3dd9400e3 Make sure the rm command and not a wrapper function that could change its behaviour is used. This patch was written by David Bitseff.
darcs-hash:20061212122853-ac50b-4f3c9962bc6daed95c8f53a19af05bc3d924eac7.gz
2006-12-12 22:28:53 +10:00
axel
234034d302 Make sure cwd colors update when the variable changes. This is a common regression, it seems. This time it was caused by the repaint reductions added in 1.22.2.
darcs-hash:20061212101348-ac50b-970686fcd3317f19c6131cdc46885a841c68a6d6.gz
2006-12-12 20:13:48 +10:00
axel
edc20a7505 Update to the ':' patch by Nicholas Burlett. This patch makes sure that ':' style executing of a command is only performed if a regular call to execve fails. This should improve performance a mall bit in the common case.
darcs-hash:20061211190308-ac50b-d284fa30c8c633816898141b644bd3039f80cc62.gz
2006-12-12 05:03:08 +10:00
axel
3a29028f60 Fix broken example in the documentation for the begin builtin
darcs-hash:20061211134723-ac50b-6ea37b6dca30a85d00651129a762d8a9d95d40a2.gz
2006-12-11 23:47:23 +10:00
axel
f4af7603da Add completions for flac, written by David Bitseff
darcs-hash:20061210092326-ac50b-4de3e3473cdc73ef05052d4053f56dd790cc1403.gz
2006-12-10 19:23:26 +10:00
axel
63a28eb46f Add completions for oggenc, written by David Bitseff
darcs-hash:20061209085946-ac50b-747b61e4a0d717b5b9a5b7dcc3bdad8e33e79e18.gz
2006-12-09 18:59:46 +10:00
axel
b85d9ee737 Minor documentation update
darcs-hash:20061209011911-ac50b-2295056319c5b7a95e77df897f0310cd52c6580a.gz
2006-12-09 11:19:11 +10:00
Tassilo Horn
58042b0e9f ruby-gems-completion.dpatch
darcs-hash:20061208232818-c06f4-510633a992d3557967709713ab8ed8df94a36c05.gz
2006-12-09 09:28:18 +10:00
nickburlett
23759e6eca colon-command support
Shells such as bash, sh, tcsh, and ksh each support a "colon command" that causes the script to be
evaluated as a bourne script. In the case of bash and sh, this command is a no-op. For others,
it means the script has sh syntax.

To suppor this in fish, I've added code to launch_process that checks for a ':' as the first
character of p->actual_cmd. If it is a colon, the process descriptor is modified to call
/bin/sh, which should exist on any POSIX system.

darcs-hash:20061208220428-5830d-6bde4f1a3e8100296a60c21f9e47988e20688a77.gz
2006-12-09 08:04:28 +10:00
axel
1d3465698f Add dcop completions, written by David Bitseff
darcs-hash:20061208215855-ac50b-aa2ee1fc551ce7bca50d5979800e6674015a3737.gz
2006-12-09 07:58:55 +10:00
axel
b156f083be Fix off-by-one error making it impossible to edit the first element of an array using array slicing. Thanks to useer for reporting this bug.
darcs-hash:20061208133136-ac50b-3c8085ec61fcc3987356ee412133dba6c7f32d1f.gz
2006-12-08 23:31:36 +10:00
axel
f83b754cd4 Bump version number
darcs-hash:20061207224603-ac50b-a8f5ce18d44626814a15fc2c0b0fe0d51dae0567.gz
2006-12-08 08:46:03 +10:00
axel
df4a0d65bd Update comlpetions for the help function
darcs-hash:20061206131020-ac50b-f7f1a3c5aa85d90a6538583681167abca7f50e63.gz
2006-12-06 23:10:20 +10:00
axel
77b5532ce9 Make delete-or-exit work with multiline commands
darcs-hash:20061206122537-ac50b-80e3b3d6dff886eba162fbb8db5a82ff0f7a107f.gz
2006-12-06 22:25:37 +10:00
axel
d9ec65da4d Update user documentation - add section on internal completion functions, update todo list, minor documentation tweaks
darcs-hash:20061206000810-ac50b-08f12efdb74224abe46301d3722cd8180d8ba37d.gz
2006-12-06 10:08:10 +10:00
axel
4b9dcf1cf2 Add ant target completions, written by Nate Drake
darcs-hash:20061205235252-ac50b-112c0ff335e456ed0b419c6c5c7a889c517baed1.gz
2006-12-06 09:52:52 +10:00
axel
1fbac89a38 Do not highlight parameters beginning with a '-' as switches if the '--' parameter has been given
darcs-hash:20061204120707-ac50b-3c2099fd75ac615dfcdc0b0954713728142cd505.gz
2006-12-04 22:07:07 +10:00
axel
ceacfb83a8 Add completions for the env command
darcs-hash:20061204115838-ac50b-f75e067b50ee2cbc8f735110c34892613c53c4d9.gz
2006-12-04 21:58:38 +10:00
axel
d736c8cca6 Add completions for the locate command
darcs-hash:20061204114205-ac50b-1231627ff987bbb3dc4c7af1436cfdf17bd3a5c1.gz
2006-12-04 21:42:05 +10:00
axel
60769903a5 Add subcommand completion support to nice completions
darcs-hash:20061204111346-ac50b-913f68c7fcbf71117ac6d662423d64d05d38c6e5.gz
2006-12-04 21:13:46 +10:00
axel
8b73bac580 Rename __fish_complete_directory to increase consistency
darcs-hash:20061202233433-ac50b-48368a338773ad47807b0032389fd305d86b3275.gz
2006-12-03 09:34:33 +10:00
axel
c8162c2900 Flash commandline each time completion fails, not just the first one
darcs-hash:20061130235852-ac50b-de6e94a878e7a6de6ec9f34289437aec87d95b07.gz
2006-12-01 09:58:52 +10:00
axel
de181c91d5 Only flash commandline, not entire screen, when completion fails
darcs-hash:20061130235749-ac50b-436e5619f7818db7660269545de19e21c6a7e1b8.gz
2006-12-01 09:57:49 +10:00
axel
687ba1c9ef Add completions for the find command
darcs-hash:20061130231414-ac50b-4636dbd460ad23479c5740b22dcba011c2e140a3.gz
2006-12-01 09:14:14 +10:00
axel
02802b509d Make keyboard shortcuts that execute a shellscript function (^D, for example) a lot quicker. This is done by not changing the titlebar message or reexecuting the prompt. A full repaint is still performed though. This patch also changes the behaviour of the 'null' virtual keypress - it no longer reexecutes the prompt, it only causes a repaint.
darcs-hash:20061201163009-ac50b-65508b8e5aa3b2c73695feb0a47a718419868f8e.gz
2006-12-02 02:30:09 +10:00
axel
7f18dd6a4a Improve kill completions on non-Debian systems (They where fine before on Debian systems)
darcs-hash:20061130163230-ac50b-0f72c7a609b1218e30ec193362df13c76f4cb35b.gz
2006-12-01 02:32:30 +10:00
axel
2f7a472230 Remove fallback of using globals when universal variables are broken in config file- fish does the equivalen internally now
darcs-hash:20061130154838-ac50b-04861991dfc12fc4a7d1bb675dbffe4b78df920e.gz
2006-12-01 01:48:38 +10:00
axel
b8f2f46945 Use dircolors to set default colors for ls
darcs-hash:20061130154026-ac50b-d6d5e182a71516aa56ab16851e47510f2561b585.gz
2006-12-01 01:40:26 +10:00
axel
2570eb1ab8 Fix bug in save_function script
darcs-hash:20061130154006-ac50b-cb9ae4c46d3eced0fa432c47de996016519d29cd.gz
2006-12-01 01:40:06 +10:00
axel
d3062f9a97 Fix bed indentation in a few places
darcs-hash:20061130132431-ac50b-e17b1a55733c4f42264e88cb259a78b4a5cfc4e0.gz
2006-11-30 23:24:31 +10:00
axel
8619d17f43 Minor documentation, indentation tweaks
darcs-hash:20061129142102-ac50b-0ae69ec0878a54092f16261b314b34ef4eeeb5ba.gz
2006-11-30 00:21:02 +10:00
axel
8062eb3511 Makefile tweakage - make sure build messages suggest using correct make version
darcs-hash:20061129142004-ac50b-2776b3e6db870f6e04836a7d6e464e09d20f6274.gz
2006-11-30 00:20:04 +10:00
axel
e0322bf0e0 Add --without-gettext switch to optionally disable gettext support
darcs-hash:20061129141822-ac50b-64a78e7a3594827abe5024fdbf7d4c79ac21162c.gz
2006-11-30 00:18:22 +10:00
axel
ddc617f80a Fix bug in save_function that causes it to not create missing directory entries before saving function
darcs-hash:20061129140229-ac50b-525f2cff869a066d5c3624880125e37862a9fd3b.gz
2006-11-30 00:02:29 +10:00
axel
f64364cced Replace all internal uses of grep with sgrep, which is a wrapper around grep that strips away any GREP_OPTIONS. This is needed to avoid users who have added arbitrary switches to GREP_OPTIONS, thus changing its behaviour.
darcs-hash:20061129140004-ac50b-485ff6bfd71e9459ba62461f6e093ca5c9ddd664.gz
2006-11-30 00:00:04 +10:00
axel
32502bfac8 Don't use GREP_OPTIONS in 'contains' function - this is a modified version of a patch by David Bitseff
darcs-hash:20061126131150-ac50b-640bfaf2c3a4111809d9091631b79e35005e68b5.gz
2006-11-26 23:11:50 +10:00
axel
1f6a98ecb8 Make sure that non-exporeted variables can shadow exported ones. This problem was reported by David Bitseff.
darcs-hash:20061126130943-ac50b-b99cddc9a042545d5555b281d7e0aa8f667131d6.gz
2006-11-26 23:09:43 +10:00
axel
6ad0f141be Add missing rulers in faq
darcs-hash:20061124170631-ac50b-ee9823eb30fb84be07a512f7ad6dd46cbc2d0b44.gz
2006-11-25 03:06:31 +10:00
axel
0b6366aacb Fix missing code snippet in faq. Thank you to Binny V A for reporting this bug.
darcs-hash:20061124164641-ac50b-5c6594b320269aa5941b84d1d99eac70b636b332.gz
2006-11-25 02:46:41 +10:00
axel
deed3a63a3 Make completion descriptions on symlinks to directories have their own description
darcs-hash:20061123104145-ac50b-6b48de9c46593312d9c65368d17a45999d197e4a.gz
2006-11-23 20:41:45 +10:00
axel
cab80b452b Fix bug where tab completions for implicit 'cd' would ignore symbolic links to directories
darcs-hash:20061123104023-ac50b-7245f70e0f6fbbc97358e32c6dc7ca5258f24a53.gz
2006-11-23 20:40:23 +10:00
axel
338d32a7c6 Drop the old, unused fish manual page
darcs-hash:20061122185443-ac50b-aa46cf36aa38990ba49b4e08f7ce7a5c68abfdf3.gz
2006-11-23 04:54:43 +10:00
axel
88f15a6804 Simplify documentation building - again.
darcs-hash:20061122185333-ac50b-078910540c33e18265c7d5804d1f14f241ad597f.gz
2006-11-23 04:53:33 +10:00
axel
20b3f3b9a1 Add completions for the wajig command. These where generated by the create_wajig_completions.py script, written by Reuben Thomas.
darcs-hash:20061120152707-ac50b-fe478814bcc5edec9dc9d49d0da665b21ba8956c.gz
2006-11-21 01:27:07 +10:00
axel
1145a5d483 Touch up completions for builtin commands
darcs-hash:20061120152518-ac50b-cbd3d14af4fd2d67304278d442443decbac1ef7c.gz
2006-11-21 01:25:18 +10:00
axel
125ca9ff73 Minor edits, whitespace fixes, etc.
darcs-hash:20061120131412-ac50b-0d9bc9d3fb35b4c9831bdf3a606e9aa8df844478.gz
2006-11-20 23:14:12 +10:00
axel
bc1efb1556 Minor code edit - move a bit of code into its own function
darcs-hash:20061120131224-ac50b-974496cc800377e4e06475491f89998b9640fbba.gz
2006-11-20 23:12:24 +10:00
axel
7b5649097f Correctly handle multiple backslashes at end of line w.r.t. multiline handling
darcs-hash:20061120021934-ac50b-20d953c16711a4959cac9d435217309fc78aab98.gz
2006-11-20 12:19:34 +10:00
axel
c2e1d76400 Fix missing man-page generation when building from darcs tree. Also simplifys doc generation a small bit.
darcs-hash:20061120135336-ac50b-d3b7a4ce2ac6bcc307c57cfcd23db86a8ac411a8.gz
2006-11-20 23:53:36 +10:00
axel
f7435559a7 Simplify Makefile by using a wildcard to specify help files
darcs-hash:20061120010620-ac50b-1a838bdd75607a503bc8335bb39abd2aa11ac7e8.gz
2006-11-20 11:06:20 +10:00
axel
47afca1fdb Add missing help text for the save_function function
darcs-hash:20061119233640-ac50b-5fb02f7ce3ec3317aa57be2d936cc430b27276b4.gz
2006-11-20 09:36:40 +10:00
axel
372c811763 Support bold and underlined characters in help output
darcs-hash:20061119232734-ac50b-d426980ee143b44065a3ea2afc7d3808174acd5f.gz
2006-11-20 09:27:34 +10:00
axel
dd061b1dda Minor comment edits and removal of a warning
darcs-hash:20061118212459-ac50b-d6f4dddb560b4815ca850f9e9c3e8d7a5cf5ea70.gz
2006-11-19 07:24:59 +10:00
axel
eb3c99c54e Move the event handler for fish_color_cwd to init file, so it is not autounloaded. Also cache output of call to set_color command to improve performance a bit.
darcs-hash:20061118212147-ac50b-b0f44cca2acf7465dd9ff071aa35a3ac81f0615f.gz
2006-11-19 07:21:47 +10:00
axel
5d864e3f69 After processing a signal/event while waiting for commandline input, check the lookahead buffer for inserted characters
darcs-hash:20061118211531-ac50b-355fd5556f65e9cec3af5ed9e19a44af9bfe3b7b.gz
2006-11-19 07:15:31 +10:00
axel
1b71f91a01 Update documentation display code to run roff on the client system instead of pregenerating documentation and compiling it into program binaries
darcs-hash:20061117162438-ac50b-5c4c7f0bd8bf53a16e16ecfead9569e642b7160f.gz
2006-11-18 02:24:38 +10:00
axel
b30886228c Speed up history token search
darcs-hash:20061117233726-ac50b-eb7ef60b837a4dd5fee61c7a692d8210fdcc4719.gz
2006-11-18 09:37:26 +10:00
axel
f91de04269 Update todo list
darcs-hash:20061117150013-ac50b-ded7a41336a64df095ede01657a9af341f571d52.gz
2006-11-18 01:00:13 +10:00
axel
a3531db645 Add missing include in screen.c
darcs-hash:20061117145925-ac50b-267cb0b81f78672f3522cb320a0e951f84f70de2.gz
2006-11-18 00:59:25 +10:00
axel
1e8fe508f0 Tweak error messages in tokenizer a bit
darcs-hash:20061117145905-ac50b-ee735bf04d2dcbabc272c4f12cb64a8af51b83bf.gz
2006-11-18 00:59:05 +10:00
axel
54244fd33d Add a bugreport function for writing out a message about how to file bug reports
darcs-hash:20061117145825-ac50b-0480300cce24657aae9572b79f145d956db93593.gz
2006-11-18 00:58:25 +10:00
axel
4c1d1bb218 Complete using known repos in darcs
darcs-hash:20061116132251-ac50b-d62d1a1b08d21b57fa6f7e7ae105d9b77026fd39.gz
2006-11-16 23:22:51 +10:00
axel
903326ddf5 Make hitory token search interruptible. This code was written by Netocrat.
darcs-hash:20061117130612-ac50b-0f1f4e58c9794e705117bde0716f07b39e0176af.gz
2006-11-17 23:06:12 +10:00
axel
0105ec284d Don't intern as much completion data - this helps reduce memory usage when autounloading
darcs-hash:20061116130833-ac50b-b19887dc36b16476bb3b2a1593b23dd3325187ee.gz
2006-11-16 23:08:33 +10:00
axel
55b253152c Only do command description lookup if we have non-directory commands
darcs-hash:20061116130400-ac50b-47b7159276d607aab8c4a8d52a9c8a60a3f77819.gz
2006-11-16 23:04:00 +10:00
axel
6573d2b451 Use halloc to simplyfy allocations in function.c
darcs-hash:20061115141649-ac50b-aff0e3369bb19d6d88130781b13e598c9445b138.gz
2006-11-16 00:16:49 +10:00
axel
cfa9ecbfd2 Drop search highlighting when exiting search mode. Thanks to Philip Ganchev and Martin Bähr for the bug reports.
darcs-hash:20061116125803-ac50b-6eb95d76c3679a32db940a698466381ef7822b9e.gz
2006-11-16 22:58:03 +10:00
axel
b139201a33 A few additional input checks, minor code simplifications, and some indentation/documentation fixes
darcs-hash:20061115133046-ac50b-a6145bd9a63b6667357cc3ec603e185696bf1951.gz
2006-11-15 23:30:46 +10:00
axel
946b5d1528 Remove getpgid prototype from exec.c - this prototype seems to be no longer missing
darcs-hash:20061115132959-ac50b-d163141db6ad824ea0f6788338ebcec5001cbf5b.gz
2006-11-15 23:29:59 +10:00
axel
3b2670532a Make fish store universal variables locally if fishd can't be started - local changes are lost of the fishd connection is restored
darcs-hash:20061115123447-ac50b-bf17c55079e1196205cc3a4fd0ca22d9f539836c.gz
2006-11-15 22:34:47 +10:00
axel
d00bc973fe Use fcntl to automatically close fishd socken on exec instead of handling it manually
darcs-hash:20061115111857-ac50b-3e04a0bc16c8442bef02cf4a50777d4556b8eaa6.gz
2006-11-15 21:18:57 +10:00
axel
4768b37531 Add support for detecting and handling the screen-specific \ek\e\ escape sequence for setting the titlebar message in the prompt calculating code.
darcs-hash:20061114162125-ac50b-debe872f5916328f74a4560d0833b33f9eb89a40.gz
2006-11-15 02:21:25 +10:00
axel
ab162c6c25 Bump version number
darcs-hash:20061112210938-ac50b-af5fc653b1ec0da6832338aec2d56c98fba69897.gz
2006-11-13 07:09:38 +10:00
axel
5ed912bebc The incorrect pointer is used for the autounload callback, causing possible crashes
darcs-hash:20061112121725-ac50b-1f49f3f37c20d3fe2d4a12617e9dda139d2ad5ec.gz
2006-11-12 22:17:25 +10:00
axel
ec43090c16 Fix file descriptor leakage from completion pager
darcs-hash:20061112121613-ac50b-209d42c06401faf675ff123236823dcaa651d6f7.gz
2006-11-12 22:16:13 +10:00
axel
80759ee03f Fix exit status of delete-or-exit function
darcs-hash:20061112114544-ac50b-d5fd61b3819715057caba2dd8b48119df080edd1.gz
2006-11-12 21:45:44 +10:00
axel
816f473ac9 Add a few missing completions for the ls command
darcs-hash:20061111113315-ac50b-2a77e93a78571e1e83801128c1793c52bb03e13f.gz
2006-11-11 21:33:15 +10:00
axel
d59d3b4463 Minor code simplification in main.c
darcs-hash:20061111110650-ac50b-0d50d10087ea863ff0c79d05c614fdb06fa3b9bd.gz
2006-11-11 21:06:50 +10:00
axel
8784b78d84 Add a few more darcs completions. These are still unfinished, though.
darcs-hash:20061111105547-ac50b-0791e833664ff67d8ced1176577d8266fe4a3782.gz
2006-11-11 20:55:47 +10:00
axel
5005c67d76 Minor cleanups, mostly of code comments
darcs-hash:20061111105452-ac50b-24ab7965f6208ecdfced738e08cdb4cb4a565458.gz
2006-11-11 20:54:52 +10:00
axel
63732a99e9 Tweak Makefile, including fixing slight dependency problem
darcs-hash:20061111105314-ac50b-69703cc2575856a321515aa0554e97d1895a4606.gz
2006-11-11 20:53:14 +10:00
axel
04b7da336d Documentation updates
darcs-hash:20061111105208-ac50b-27e335ba701b021d3119206e91d68c8504d45c2b.gz
2006-11-11 20:52:08 +10:00
axel
5f69f2bb0c Make fish send a HUP signal to jobs when the terminal tells it to exit.
darcs-hash:20061111104840-ac50b-ae989e26bdb6c769ed93dcf11b742887c97858aa.gz
2006-11-11 20:48:40 +10:00
tassilo
fb62a35921 complete-eik-and-friends.dpatch
Completions for all tools which come with eix.
(http://dev.croup.de/proj/eix)

darcs-hash:20061110155925-a923b-fd06120f7ea5f65cb752fe437bfccb6f16c87b45.gz
2006-11-11 01:59:25 +10:00
axel
08787c7674 fix bug where off_t was assumed to be long long, causing display errors on systems with no large file support
darcs-hash:20061109175804-ac50b-b05ec0aa9ae6f7dd23b7432c321eff44b446397d.gz
2006-11-10 03:58:04 +10:00
tassilo
79de45eed5 better-emerge-completion.dpatch
- You don't need to supply the package right after -C or -u etc.
- Better descriptions

darcs-hash:20061109145341-a923b-a1a54d3a5a040396ccba350c125f3b1ba645c601.gz
2006-11-10 00:53:41 +10:00
axel
9bc9e1c08d Add completions for equery, written by Tassilo Horn.
darcs-hash:20061107211708-ac50b-6199e58e84bc8ee8729be5f2a5ff2f3518888bfc.gz
2006-11-08 07:17:08 +10:00
axel
3acdeb87a4 Update the emerge completions. They are now complete, ignore switch ordering, handle packages in different catagories with the same name. This update was made by Tassilo Horn.
darcs-hash:20061107211617-ac50b-fcd3108209671283b2d5553d3adf5a81a46869f9.gz
2006-11-08 07:16:17 +10:00
axel
9959e53985 Add alias function. Thanks to Tassilo Horn for pointing out that it was missing.
darcs-hash:20061107205539-ac50b-0053f828d40be5bcb088cdb8d669c239c201b433.gz
2006-11-08 06:55:39 +10:00
axel
4edb71325f Do not escape the ':' character. Thanks to Tassilo Horn for pointing this out.
darcs-hash:20061107205437-ac50b-51632ce51915d4ca8680ab4c4522bcd002a794b6.gz
2006-11-08 06:54:37 +10:00
axel
310768e8d2 Try to avoid the '
darcs-hash:20061107181911-ac50b-fda6044a81b3a09707f17d4017c2c3dacf4e1801.gz
2006-11-08 04:19:11 +10:00
axel
dc90e460fe Fix a bug in the help function causing help to fail when trying to open help for a builtin command. Thanks to Reuben Thomas for the report.
darcs-hash:20061107131211-ac50b-9727a813d940b34923b23b073c80a7b42c023486.gz
2006-11-07 23:12:11 +10:00
axel
d20c14b4bb Do not print a newline on empty greeting message. Thanks to Reuben Thomas for pointing this out.
darcs-hash:20061107130629-ac50b-553bc13390c0f040f4cecf2780e34da674e065fa.gz
2006-11-07 23:06:29 +10:00
axel
981f5782d8 Fix code for locating inputrc-file in users fish configuration directory. Thanks to Reuben Thomas for reporting this.
darcs-hash:20061103155335-ac50b-23ddaec5d0ca591b00e8a59ccc39e63ed8b9ff25.gz
2006-11-04 01:53:35 +10:00
axel
c2021b6225 Fix typo in documentation for the commandline builtin. Thanks to Reuben Thomas for reporting this.
darcs-hash:20061103143140-ac50b-b37fbfe68321f904936c002010045e467bc3a778.gz
2006-11-04 00:31:40 +10:00
axel
9de4dbdd03 Add the file that generated the wajig completions to the tree. This should not be installed but it should be included with the tarball. The file was written by Reuben Thomas.
darcs-hash:20061103142645-ac50b-0e13e41941b5dc990c60d775cdd8503ed8e54529.gz
2006-11-04 00:26:45 +10:00
axel
1a84a44cc2 Add completions for ps2pdf, dvipdf and dvipdfm commands, written by Reuben Thomas.
darcs-hash:20061103141945-ac50b-7592bb5784a55272747bbb0322281b9090e5fd65.gz
2006-11-04 00:19:45 +10:00
axel
80a9fc2fce Add mention of uninstalling old fish versions to the INSTALL file. Thanks to Jason Grossman for the suggestion
darcs-hash:20061103141254-ac50b-27f1f4741379bff54298b6c18d289947f66f91cf.gz
2006-11-04 00:12:54 +10:00
axel
8aac7e82c0 Try to detect seq versions installed by earlier fish versions and replace them
darcs-hash:20061103131621-ac50b-2748c958f8614f39fbaa7a45261877a912de539e.gz
2006-11-03 23:16:21 +10:00
axel
49e300d0ca Check if any libraries need to be linked in order to use iconv. This is needed on OS X. Thanks to Jason Grossman for the report
darcs-hash:20061103100004-ac50b-861ca2bc42414c475b1ab24399c8d240cf1e4651.gz
2006-11-03 20:00:04 +10:00
axel
136e99de62 Fix bugs causing all unmapped inputs below 31 to be interpreted as newlines. Thanks to Reuben Thomas for the report.
darcs-hash:20061103003457-ac50b-5f3fee63e211b12014e40dc3d8d8c94eaa22f24d.gz
2006-11-03 10:34:57 +10:00
axel
c41986a63f Add command specific completions for unrar command (No switches yet, only commands and files in archive)
darcs-hash:20061102235727-ac50b-7b7638289be4de52b4e3e3d109ad3167b7285023.gz
2006-11-03 09:57:27 +10:00
axel
bedf8ea55e Add support for completing using contents of tar archives
darcs-hash:20061102235548-ac50b-ec4a3b206c73f8fc44cc715b2a95fe6fef2d53c0.gz
2006-11-03 09:55:48 +10:00
axel
d8f1c0abcd Minor tweaks in the reader. Vastly simplyfu the insert_char function, and add a few code commants.
darcs-hash:20061102135019-ac50b-c5d4f7f307deb93b71e797bbb8a1d420a5790dc3.gz
2006-11-02 23:50:19 +10:00
axel
13a85ee3f1 Make sure fish has the currect exit status
darcs-hash:20061102134859-ac50b-692f9e9aff838ea375e5cf29eeae1e29b1b75338.gz
2006-11-02 23:48:59 +10:00
axel
fab18bae80 Updates to the documentation - add a few crossreferences, remove redundant listing of builtins and update the todo list
darcs-hash:20061102134725-ac50b-802d5cf8754ff94c4cc9533b2ff16a759e9aa2c9.gz
2006-11-02 23:47:25 +10:00
axel
6e24b26e2c Fix the code for ignoring infinite recursion
darcs-hash:20061102134537-ac50b-2dddd06dd77c362caf44c9160acc29b76278b230.gz
2006-11-02 23:45:37 +10:00
axel
7fb44d4d5f Spelling fix. Thanks to Reuben Thomas
darcs-hash:20061101231404-ac50b-8f5b08242aed565baf37035805d7b3614fe8022b.gz
2006-11-02 09:14:04 +10:00
axel
44f85d04f9 Fix formating issue for the documentation for the prevd function
darcs-hash:20061101221835-ac50b-03a9b5abc7e4a25cc75effecc734c20eb8fee342.gz
2006-11-02 08:18:35 +10:00
axel
bd71f0a096 Fix build error
darcs-hash:20061101181221-ac50b-227b2d2f6f5122c9f25c471872376884bdace13c.gz
2006-11-02 04:12:21 +10:00
axel
f7b656017f Use the same wording about license in Makefile and main.c.
darcs-hash:20061101144747-ac50b-fac8e3693445a8601f0c71ab191a64dac0ad7a67.gz
2006-11-02 00:47:47 +10:00
axel
7a8ca73376 Add missing include to fix a warning
darcs-hash:20061101105412-ac50b-1ee3d996330ad435954abfc8f827deb3f121adb5.gz
2006-11-01 20:54:12 +10:00
axel
9eb1826961 Update to buildscripts to fix dependency issues caused by new documentation layout
darcs-hash:20061101103112-ac50b-8ee49c3031b7802822c95ffcfee26d10e1870ed1.gz
2006-11-01 20:31:12 +10:00
axel
728a60bd67 Fix beginning/end-of-line input function, add beginning/end-of-buffer functions
darcs-hash:20061031220149-ac50b-6e6b8f523642bead730059dd96ee2d1290283b5e.gz
2006-11-01 08:01:49 +10:00
axel
0099c3c420 Add table of contents to begining of documentation. This involves some restructuring of the documentation files.
darcs-hash:20061031153614-ac50b-7a6e97e30ae759591028227466e76c574b931fd5.gz
2006-11-01 01:36:14 +10:00
axel
885d16fcd6 Fix casing and other minor issues in documentation
darcs-hash:20061031152316-ac50b-e68db9853d6e9461a0c054f1ea290704ccfc0a31.gz
2006-11-01 01:23:16 +10:00
axel
c4a8f4c890 Code beutification in build files
darcs-hash:20061031020656-ac50b-2385bb51d7df624e5691b7659120596600fd1d5d.gz
2006-10-31 12:06:56 +10:00
axel
c098cb5c87 Bump version number
darcs-hash:20061030160357-ac50b-29729cb4ba358e09f9c19e6d6e07e0c2489e14fd.gz
2006-10-31 02:03:57 +10:00
axel
63643ff17f Fix completions for which and type, which where broken by previous script updates
darcs-hash:20061030015221-ac50b-e4a0f2802e7a5dc4a1e594933f25cae00d9ea104.gz
2006-10-30 11:52:21 +10:00
axel
f83575f084 Make sure signals aren't blocked while autoloading, also add a few consistency checks to see that signals aren't blocked in critical places
darcs-hash:20061029210911-ac50b-50bec85c3d59d0332ba44f3ece1a012cdc3e8c4b.gz
2006-10-30 07:09:11 +10:00
axel
a6c00ca0d2 Minor edits
darcs-hash:20061028164448-ac50b-c53d5f235d01db3a11b01996b77411a213dc5303.gz
2006-10-29 02:44:48 +10:00
axel
c5eaefc8b5 Update autoloader to fix concurrency issues when changing loader path in autoloaded function
darcs-hash:20061028164122-ac50b-25f978df9afeb370a06ef7576ef03183034bc057.gz
2006-10-29 02:41:22 +10:00
axel
f16bb285be Documentation updates and clarifications
darcs-hash:20061028163229-ac50b-2b6d3712a97903788520c155326b0e7a193b5eec.gz
2006-10-29 02:32:29 +10:00
axel
09c348bef2 Add a shellscript function 'save'function' for saving the current definition of a function to file
darcs-hash:20061027225004-ac50b-2454152687ff84deec90e3d938a0288e62dc34e6.gz
2006-10-28 08:50:04 +10:00
axel
561ec7d5f5 Change the way the umask is used so that executable bits are ignored on file creation. Thanks to sqweek and Jamessan for explaining the issue.
darcs-hash:20061026151946-ac50b-3a55159343f1fe0a4edf3f077bcec8afd6f131f5.gz
2006-10-27 01:19:46 +10:00
axel
e98a604a21 Minor edits, remove unneeded code, add a few commants, correct spelling, tweak the todo list, etc.
darcs-hash:20061026102253-ac50b-eb42fdab9a9211d68386a563134856a96b870d90.gz
2006-10-26 20:22:53 +10:00
axel
3341fc888c Make the fish manpage in Doxygen and add it to the main fish documentation
darcs-hash:20061026102059-ac50b-2a7956bb4651b5ffe867e7c6eb26a29e2f15ad24.gz
2006-10-26 20:20:59 +10:00
axel
1faf7df371 Move out argument parsing into it's own function
darcs-hash:20061025205443-ac50b-2889624cadb3b92be13da523df32b178c773dbf7.gz
2006-10-26 06:54:43 +10:00
axel
3a128e1484 Use bitset to implement flags for jobs instead of wasting a whole int for every flag
darcs-hash:20061025204759-ac50b-ea07caa30782a1ea02d2cd8aa7cbc94474047a10.gz
2006-10-26 06:47:59 +10:00
axel
cdc52f7bde Add more comments to the history implementation
darcs-hash:20061025204650-ac50b-419d37d9ea68de0deee613524d06882a8e4c908e.gz
2006-10-26 06:46:50 +10:00
axel
e0899addcb Minor cleanups and improved error checking in reader code
darcs-hash:20061025203608-ac50b-213edeb462eaabce849d9cd13ffc30879e810bb8.gz
2006-10-26 06:36:08 +10:00
axel
c627509e59 Make al_pop return null on empty lists instead of crashing
darcs-hash:20061025203433-ac50b-5d3a18d788d6f36dffe1136664f029a500989db9.gz
2006-10-26 06:34:33 +10:00
axel
4502fc74c3 Fix spelling error in init file
darcs-hash:20061025203337-ac50b-576bd81401e332f94ecdff5665ca8da82c63fa8e.gz
2006-10-26 06:33:37 +10:00
axel
3b0ed061cd If the builtin help won't fit on-screen, and it can't be shortened, don't print it
darcs-hash:20061025203225-ac50b-8675f297a8aabea080edf7946d6f136296a6d7bb.gz
2006-10-26 06:32:25 +10:00
axel
dfa73c7cc1 Remove the --key-binding switch for fish
darcs-hash:20061025202836-ac50b-682015e2f5830a85ff520e89b0a951ca9d2913dc.gz
2006-10-26 06:28:36 +10:00
axel
12be24ef47 Update dependency list
darcs-hash:20061025163950-ac50b-161f81c51f5e923bfaf0aa9fda4d74f785e7aff7.gz
2006-10-26 02:39:50 +10:00
axel
c684b7c7c7 Update makefile to not try to delete old config files during install, and instead fail with a relevant error message. Thanks to Jamessan for pointing out the evilness of the old method and suggesting the new method.
darcs-hash:20061025163532-ac50b-ff394c53b8eb0d932894784bc25e086f9c9b65ec.gz
2006-10-26 02:35:32 +10:00
axel
4f22082a5c Do not remove trailing whitespace from function definitions, the may be a part of a function
darcs-hash:20061025122712-ac50b-6d7ab43572f71cafa5fddd65b8350498e2651b41.gz
2006-10-25 22:27:12 +10:00
axel
e3c1363831 Drop switch for saving of functions to file from the function builtin
darcs-hash:20061025105746-ac50b-942e878b01f5e080d7cf1e6414246b68b608b08f.gz
2006-10-25 20:57:46 +10:00
axel
6d413c8dc3 Fix bug where in rare cases calling the exit builtin would cause jobs to not execute even though the call to exit was blocked by running jobs
darcs-hash:20061025101402-ac50b-36456915671513f376a90c4455d1c9256f4a9030.gz
2006-10-25 20:14:02 +10:00
axel
32a49e45c8 Use the _t suffix for typedef:ed structs in complete.c
darcs-hash:20061024110352-ac50b-30768be6a11d9a5935be479fbdb430a42b0a95b9.gz
2006-10-24 21:03:52 +10:00
axel
b37d49a708 Fix bug in sed scripts for generating configuration files from templates. Multiple substitutions on the same line where ignored.
darcs-hash:20061023104315-ac50b-e5e84fb1e33fad98d81efccca0ae5dd57b479c7e.gz
2006-10-23 20:43:15 +10:00
axel
86b7023536 Decrease priority of fishd debug message
darcs-hash:20061022160329-ac50b-5f35fe90f6be184f02fc6514fc6047b25e4f93c3.gz
2006-10-23 02:03:29 +10:00
axel
287ab597ca Remove extra whitespace from warning message on directory transition
darcs-hash:20061022155759-ac50b-e1cd50b1b0d05413ad6e4d6c06a0f005e17d6976.gz
2006-10-23 01:57:59 +10:00
axel
c313f21066 A few more minor code tweaks to fish_pager, including added documentation and removing a few hardcoded constants.
darcs-hash:20061022115026-ac50b-590de2ef2f0cbe474ca4e41fd134e0c46d6877b3.gz
2006-10-22 21:50:26 +10:00
axel
e2dca4273a Add documentation, fix memory leaks and do minor code tweaks in fish_pager
darcs-hash:20061022110414-ac50b-e5ba776e795e0273d819d4eb51d5f60fba967db2.gz
2006-10-22 21:04:14 +10:00
axel
5a7a8003a0 Give search highligting precedence over other highligting types
darcs-hash:20061022094018-ac50b-0f688dc7e756f428c05e6977db6dc9cf9f642475.gz
2006-10-22 19:40:18 +10:00
axel
b83a7cb659 Make automatic history reloading actually work the way it should
darcs-hash:20061022012102-ac50b-e57a0dd2c918a2a8abd0210b9f8a2163ce664b74.gz
2006-10-22 11:21:02 +10:00
axel
da81328d75 Fix warning messages in fish_tests
darcs-hash:20061021225900-ac50b-992edf0914250ae090ef952717ef3a05cb9cfa6e.gz
2006-10-22 08:59:00 +10:00
axel
5ae4306418 Change meaning of ** to match both files and directories
darcs-hash:20061021224429-ac50b-38e46fa533baf9a46d207ab95bfa7af55abbe54a.gz
2006-10-22 08:44:29 +10:00
axel
ed36f30eae Fix crash bug in new history code - fish would segfauls in non-interactive mode on exit
darcs-hash:20061021103035-ac50b-a2a8d96416ff217cc5640f8f27db8dbac2c39b82.gz
2006-10-21 20:30:35 +10:00
axel
7b8ebdadd6 Fix flags for mmap in history, don't unload history items written to disk in order to keep proper ordering
darcs-hash:20061021101609-ac50b-563c0b14b620a6ef4bffe69202e97103b1d75ea5.gz
2006-10-21 20:16:09 +10:00
axel
bb4e166b37 Add some documentation to the new history code, and fix some minor code issues
darcs-hash:20061020230420-ac50b-39a08d68b82481514b0d6c1024a12618bf329d57.gz
2006-10-21 09:04:20 +10:00
axel
9dc1a7d5e9 Rewritten history implementation - uses mmap to save lots of memory and also allows incremental saving. The history is autosaved every five minutes and every five added entries
darcs-hash:20061020223649-ac50b-5e3e2c1e395feec0f5ac457149639f68d52d40f0.gz
2006-10-21 08:36:49 +10:00
axel
79f59e2a2d Decrease number of gettext messages that are buffered to save memory
darcs-hash:20061020223440-ac50b-ad0c0f685bfc851c62c340ee7d97fa1413bc9fca.gz
2006-10-21 08:34:40 +10:00
axel
8285242ff6 Add wrename wrapper around rename function
darcs-hash:20061020223347-ac50b-1735f7e63b87f021ca71c44e5278726d3e8debc3.gz
2006-10-21 08:33:47 +10:00
axel
c0a54955e7 Remove /etc/fish file before creating directory with the same name to avoid clash
darcs-hash:20061019234336-ac50b-569c1b492ab4d1f5f84dc8a4730700264c4e3e10.gz
2006-10-20 09:43:36 +10:00
axel
b2d4e85f17 Make any character except '/' legal in function names
darcs-hash:20061019154747-ac50b-f3ab0df1085b91ec0eadcceddb23f03d5b0247aa.gz
2006-10-20 01:47:47 +10:00
axel
a5868d67f5 Make failed process expansions expand to zero arguments, not to the original string
darcs-hash:20061019154127-ac50b-86975e62d9947819862a98e7b6fff3ff630f26b7.gz
2006-10-20 01:41:27 +10:00
axel
45f1263112 Minor code fixes
darcs-hash:20061019153950-ac50b-9a7d5939ce47cd5f8b7167a97b0e9c62315b7b6e.gz
2006-10-20 01:39:50 +10:00
axel
4683f4c989 Fix a number of bugs found using the warnings generated by earlier patch
darcs-hash:20061019153603-ac50b-4efb1ad1fe2cbe693a921648a0616a3d258d7933.gz
2006-10-20 01:36:03 +10:00
axel
ae16397e1c Fix occasional garbled characters in output of the set builtin
darcs-hash:20061019152418-ac50b-2ef6e93820deb5e272f28f893c51dca642a6b080.gz
2006-10-20 01:24:18 +10:00
axel
2d05b1c1b4 Add compiler warnings for some common incorrect usage of functions, such as forgetting to cast null pointers to variadic functions
darcs-hash:20061019151947-ac50b-4043638a7a830fa80fd918f92365f5afe3ff208a.gz
2006-10-20 01:19:47 +10:00
axel
ea998b03f2 First stab at directory transition. Test with care...
darcs-hash:20061019115023-ac50b-30c3fd51d8af8a616d63dfcac39370d7fe6d144e.gz
2006-10-19 21:50:23 +10:00
axel
52b2525b0e Make the callback for the file autoloader optional, and clarify its use
darcs-hash:20061019114632-ac50b-a0b3e1b3e7f26aa7cd674ade1a4fb2246f978ebc.gz
2006-10-19 21:46:32 +10:00
axel
ff96668151 Minor edits to documentation
darcs-hash:20061019114024-ac50b-e283638e3a34e1d38be58971f31900129230c598.gz
2006-10-19 21:40:24 +10:00
axel
d7576a409a Make history variable contain whole history
darcs-hash:20061019113916-ac50b-7e24780cdd591ae23210f0da2cb80a4cf09ba5c6.gz
2006-10-19 21:39:16 +10:00
axel
f6815629fc Give USER and HOME default values if undefined
darcs-hash:20061019113844-ac50b-def2288d589f479779166ed64903e99c8c8ab71a.gz
2006-10-19 21:38:44 +10:00
axel
8b3bcd2c4c Tweak initial capacity calculations to always be a Mersenne number
darcs-hash:20061018230246-ac50b-3da6ada42423f5bba3f8c3fdb366ce1f352cffde.gz
2006-10-19 09:02:46 +10:00
axel
c7bc31fe50 Fix exceptaionally rare crash bug in hash tables (happens once in every 2^32 hash lookups
darcs-hash:20061018230148-ac50b-4e67ecf1f9aeae8239c40101ae2ad6aa164c31bb.gz
2006-10-19 09:01:48 +10:00
axel
bab168f1d1 Fix yet another universal variable issue with initialization of the read buffer. This may fix fishd bugs reported by Philip Ganchev and Martin Bähr
darcs-hash:20061018164438-ac50b-c586b1ad36249853d613d0137b505377fe890d37.gz
2006-10-19 02:44:38 +10:00
axel
2ab04f4043 Skip command description lookup when no commands where found
darcs-hash:20061018155151-ac50b-5562479da23b89571f91ae1e2ed15e640ef0a094.gz
2006-10-19 01:51:51 +10:00
axel
b32bbb24b9 Fix bug in command description lookup code causing missing descriptions when command is given with a path
darcs-hash:20061018155059-ac50b-40936e573c07deb6b159a16d843f02ed60e79b49.gz
2006-10-19 01:50:59 +10:00
axel
f86f80fcd6 Properly handle character sets in universal variables
darcs-hash:20061017211129-ac50b-6aecd04b74a9122ff0e1b320a2cf48db36dd2194.gz
2006-10-18 07:11:29 +10:00
axel
d563e428e8 Avoid unloading an item currently being loaded by the autoloader
darcs-hash:20061016154022-ac50b-f4b74457a9e3acdcc70076f65dff4c1f00ac379f.gz
2006-10-17 01:40:22 +10:00
axel
5473711a20 Minor code simplifications in the reader and related libraries
darcs-hash:20061016153226-ac50b-830735fadfdf578dfa4c686a2a6cd98df0e50c95.gz
2006-10-17 01:32:26 +10:00
axel
91009ac9aa Fix hang bug when appending to killring
darcs-hash:20061016150017-ac50b-c1f789d9913949ebc44cd9d02af5c3555bdf51bf.gz
2006-10-17 01:00:17 +10:00
axel
49bff53370 Avoid reading before begining of buffer when moving/erasing word, fixes crash bug reported by Martin Bähr and further described by Philip Ganchev.
darcs-hash:20061016143912-ac50b-1deacc00f6c0438e6d760568ef5b1e47e3fe08c4.gz
2006-10-17 00:39:12 +10:00
axel
afcab9f1b3 Minor bugfix in the kill-ring code
darcs-hash:20061012223200-ac50b-6a046a89295f01937a38000ef6d016b7be5c19f1.gz
2006-10-13 08:32:00 +10:00
axel
841fdf3a04 Make kill-word and backward-kill-word accumulate kills in the killring
darcs-hash:20061012193000-ac50b-69f261df78b3957b9cec3d728fe05b8a27267c31.gz
2006-10-13 05:30:00 +10:00
axel
92446bda80 Yet another tweak to the move_word function
darcs-hash:20061012161317-ac50b-3b374e2b6c4c22f82c1cf018bf83298c8216fcb1.gz
2006-10-13 02:13:17 +10:00
axel
a620a1e5ed Update todo-list
darcs-hash:20061012140247-ac50b-ae6b9a26c5979dc7080ff3fea8dad618211227e1.gz
2006-10-13 00:02:47 +10:00
axel
5a8df6cc85 Fix major memory leak in autoloader introduced by recent autounloader patch
darcs-hash:20061012133012-ac50b-d03de17d9df4d41db075b24c2f7e48ad8c0f6417.gz
2006-10-12 23:30:12 +10:00
axel
b70b966f90 Fix the kill-line, backward-kill-line and kill-whole-line commands to work correctly with multiline editing
darcs-hash:20061012132732-ac50b-03fe641cf32ace645c88174528e849ab0d1ecb4b.gz
2006-10-12 23:27:32 +10:00
axel
97f7c2093b Drop warning in parse_util.c
darcs-hash:20061012120859-ac50b-1af2af938cd99630c2ea7b532e6213c26cc4ea6b.gz
2006-10-12 22:08:59 +10:00
axel
8ece4f3ddc Better string hashing function
darcs-hash:20061012010129-ac50b-3c420efe649e892c491d9d9830dda153ca395655.gz
2006-10-12 11:01:29 +10:00
axel
17a13a8eb7 Use the xdg-open command in the open function if it exists
darcs-hash:20061011161749-ac50b-f700489a238dafbd9aec4ef4f2eed731a8622b27.gz
2006-10-12 02:17:49 +10:00
axel
afaf156a42 Fix compilation issue in test suite,. Thanks to Martin Bähr for the report.
darcs-hash:20061010224721-ac50b-0bd07f325c2026d991cf9535941060fadd5869cb.gz
2006-10-11 08:47:21 +10:00
axel
c4f3b5e9ef Unload older autoloaded functions
darcs-hash:20061010224546-ac50b-7c3f38d32d4a413a9c0d8436bb13a5d65235f3a7.gz
2006-10-11 08:45:46 +10:00
axel
f5916358e5 Fix bug in the input buffering of messages to/from fishd causing garbled messages
darcs-hash:20061010222113-ac50b-1b6b01ab781ecbadf11a99b501f19a526ae7a7cf.gz
2006-10-11 08:21:13 +10:00
axel
e3e1b34fec Only show greeting in interactive mode
darcs-hash:20061010173154-ac50b-4831a80be03ed132ca5f709dcc5284d17d828d4e.gz
2006-10-11 03:31:54 +10:00
James Vega
18bb4ca826 Makefile.in: Update clean target to preserve builtin_help.c, user_doc, doc_src/builtin_doc and remove share/fish
darcs-hash:20060920040413-35ec8-2bc89e5dff67e2cab274676df2ca90eb1bb385e9.gz
2006-09-20 14:04:13 +10:00
axel
007e4662e3 Fix bug in contains function
darcs-hash:20061009215133-ac50b-3dc99c245e69c176f334046d9746d533a106cf2a.gz
2006-10-10 07:51:33 +10:00
axel
e11677ef66 Make the greeting message configurable using the fish_greeting variable
darcs-hash:20061009214905-ac50b-cc07bf2b76c5306f96d1bca7fd478d972de25de8.gz
2006-10-10 07:49:05 +10:00
axel
194167da32 New version of the xdg fix. Unlike the previous version, this one should actually work.
darcs-hash:20061009212440-ac50b-10d1cdd7441335d033171f5b71a8a97f8a1d1dfb.gz
2006-10-10 07:24:40 +10:00
axel
dafeac5c40 Fix compilation issues in xdg library caused missing headers. Thanks to Jamessan for the report.
darcs-hash:20061009201230-ac50b-4b5c183fbd88ef45a0ededdc3eea79191951fb5f.gz
2006-10-10 06:12:30 +10:00
axel
effea85984 Apdate address of fish homepage
darcs-hash:20061009152007-ac50b-403f605d46849a3b83192d872c4f6322bf97bb7e.gz
2006-10-10 01:20:07 +10:00
axel
0b34836c79 Update dependency list
darcs-hash:20061009151948-ac50b-89b0c12a9c8763517d85bf3e46f78b7c64846db6.gz
2006-10-10 01:19:48 +10:00
axel
f85ce201ee Do not use INTERNAL_SEPARATOR tokens to separate different parts of an unescaped string when unescape_special is false. This fixes a bug where weird characters would sometimes be printed in completion descriptions
darcs-hash:20061009151913-ac50b-47a9d3274b2399cef6fd0e12a908a606da2c4903.gz
2006-10-10 01:19:13 +10:00
axel
80ac4ddc2b Allow more than one argument to the commandline builtin. The arguments will be joined together using newlines
darcs-hash:20061009141608-ac50b-546c0f5897670bb7e628d6e7c63d687eac261ee1.gz
2006-10-10 00:16:08 +10:00
axel
9a0f712e29 Make the screen repainting code slightly more robust by keeping track of whether clr_eol may be needed to clear 'debris' from e.g. resizes
darcs-hash:20061009132642-ac50b-6162ed86a97771a8da4be2adff3ad6a4f1851616.gz
2006-10-09 23:26:42 +10:00
axel
286e110fb1 Various minor cleanups
darcs-hash:20061009103408-ac50b-a54797b9f89f51a8fc8f13674e8fd2329e989d4c.gz
2006-10-09 20:34:08 +10:00
axel
988a7fddf3 Indent empty lines after a block command correctly. Thanks to Philip Ganchev for the suggestion.
darcs-hash:20061009095931-ac50b-c958a6ec7a130019527e8e06d94af010d55ac3d5.gz
2006-10-09 19:59:31 +10:00
axel
a321505351 Allow escaped newlines within qoutes, expand them to themselves
darcs-hash:20061009012248-ac50b-a403705cfe166c7686a168bc017c50c316c28161.gz
2006-10-09 11:22:48 +10:00
axel
a074cd62bc Be more rigorous with the exit codes set by the parser and builtins
darcs-hash:20061009012102-ac50b-4f28c43dd1ccdcc04d1620a6da05218a99fd7337.gz
2006-10-09 11:21:02 +10:00
axel
7a8b468165 Allow Meta-newline to always insert a newline character
darcs-hash:20061009011529-ac50b-c8e3d77b569bc445e586c95aca01e4433fbff598.gz
2006-10-09 11:15:29 +10:00
axel
770fa771b6 Unknown commands should set the status flag to 127, as in bash and friends
darcs-hash:20061008234650-ac50b-d41e6ec3d0a6088b0addf5721aecf8d98ed866cd.gz
2006-10-09 09:46:50 +10:00
axel
414fa591b8 Make sure that if a syntax error occurs, the parser does not try to evaluate command substitutions in the command
darcs-hash:20061008234458-ac50b-96f9be42b12a9d2d2b61f6700b25c1242e1c385b.gz
2006-10-09 09:44:58 +10:00
axel
941b472b37 Make sure indentation works even if a line begins with whitespace
darcs-hash:20061008232351-ac50b-122ff623a2e428352477aa52afee9a71b40e569e.gz
2006-10-09 09:23:51 +10:00
axel
179f575593 Update history loading/saving to handle multiline editing
darcs-hash:20061008135046-ac50b-e830fe313e23f632b9c645227f41c49c8ce600f4.gz
2006-10-08 23:50:46 +10:00
axel
6400b60bdd Fix a few places where uncasted 0 was used as a null pointer in vararg functions, causing potential crashes on 64-bit platforms
darcs-hash:20061008132759-ac50b-23fe4f70a5143b8b187780403d8d21fb69c3e83f.gz
2006-10-08 23:27:59 +10:00
axel
0e03e872be Fis minor memory leak in screen handling code
darcs-hash:20061008004704-ac50b-3f40073c00f1ebd8e851c49e2df873c423637d0c.gz
2006-10-08 10:47:04 +10:00
axel
e51322ac81 Make it possible to use backslash to stay in multiline mode even when not at the end of the command
darcs-hash:20061007210631-ac50b-cc8513802c247d92c8d4d5f7bcf7a146aab67a1e.gz
2006-10-08 07:06:31 +10:00
axel
1e739166b3 Fix tokenizer bug causing bad highlighting in multiline mode
darcs-hash:20061007210521-ac50b-5cdfc808389c928b932b0e41ef14abd71b537633.gz
2006-10-08 07:05:21 +10:00
axel
560e53fd5f Add autoindentation support
darcs-hash:20061007005625-ac50b-11873654797eb1e98fd17893022bdf995be3e2aa.gz
2006-10-07 10:56:25 +10:00
axel
184d58cd36 Buffer calls to read() in the universal variable code
darcs-hash:20061006184539-ac50b-d8ecc4c45d0caae12cd60e32515a1218b37831d3.gz
2006-10-07 04:45:39 +10:00
axel
bcf3024cf0 Update todo list
darcs-hash:20061005201141-ac50b-5441cefd081ede3d7b02c5955c828ac7c3f132c3.gz
2006-10-06 06:11:41 +10:00
axel
9611a3b205 Color the ellipsis used by line wrapping as comments. Thanks to Philip Ganchev for the suggestion.
darcs-hash:20061005194026-ac50b-2708cfe79f28dbae9febc3fc5fcddb48c1fc8822.gz
2006-10-06 05:40:26 +10:00
axel
8ace1739f5 Add missing newline in error message for popd function. Thanks to Phipip Ganchev.
darcs-hash:20061005064419-ac50b-4770f393ea02761a5f4b4044b456d1b618d6da23.gz
2006-10-05 16:44:19 +10:00
axel
302516a747 Fix bug causing ls function to never color or classify files
darcs-hash:20061004235530-ac50b-815b8576b4d845c4d5929e034177c917fc050cae.gz
2006-10-05 09:55:30 +10:00
axel
ad5a6e0552 Move the code keeping track of file descriptor modification from reader.c to screen.c
darcs-hash:20061004233312-ac50b-9a10ff758375885ae78a5e5c04279c1976a037ea.gz
2006-10-05 09:33:12 +10:00
axel
873fd83307 Drop the optional checking of block type for the end builtin
darcs-hash:20061004233206-ac50b-cf72c879b4b58c8e5ba4e1dff5c2746ca2e8844f.gz
2006-10-05 09:32:06 +10:00
axel
d1078f8582 Detect and handle terminals size changes
darcs-hash:20061004214502-ac50b-aaf5b76a6281c0ba8757e794b0a802793ce92916.gz
2006-10-05 07:45:02 +10:00
axel
0ea668b260 Minor code cleanup
darcs-hash:20061004214204-ac50b-e1529fcedb1665f9871a95eba293a4a3c1150464.gz
2006-10-05 07:42:04 +10:00
axel
91c745e4b5 Add the possibility to set the cursor position using the commandline builtin
darcs-hash:20061004213948-ac50b-3f673edeb01390bb3f280812d90bc8469f2f8ba8.gz
2006-10-05 07:39:48 +10:00
axel
7d73349889 Add the possibility to set the input that the commandline builtin operates on
darcs-hash:20061004184939-ac50b-f2c3e2161a5bf77834a566462ac9942571c9d6ea.gz
2006-10-05 04:49:39 +10:00
axel
53a2c017fe Mangle very long variable values when using the set builtin to print variables and their values
darcs-hash:20061004181901-ac50b-a043695fa8fffe877970a51dd042c4bf623a770c.gz
2006-10-05 04:19:01 +10:00
axel
80ff583400 Use universal variables for fish_function_path and fish_complete_path
darcs-hash:20061004175519-ac50b-2e9dabc9ce1c21ebfcba020db8a8d84ef48433e9.gz
2006-10-05 03:55:19 +10:00
axel
0c7f74c78d Repain prompt after showing completion pager
darcs-hash:20061004102706-ac50b-51d0603c81f3125c01bad0901f8d2b745fc18e4a.gz
2006-10-04 20:27:06 +10:00
axel
13b1ea3f50 Various fixes to make double-wide characters (e.g. asian characters) work with the new multiline editing code
darcs-hash:20061001232136-ac50b-9bd771b382c00b71c5e2ee75df77ba2594b2a738.gz
2006-10-02 09:21:36 +10:00
axel
44ff9956b9 Second cleanup of multiline editing patch. Add code comments, use better variable names, etc..
darcs-hash:20061001212243-ac50b-6cd5abfcf6b7013fd23b27734ca29af27d945ca3.gz
2006-10-02 07:22:43 +10:00
axel
add1fa9208 First cleanup of multiline patch - add support for commands longer than one line and do minor cleanups, including removal of a few unused functions
darcs-hash:20061001205423-ac50b-2819a086fecb1bcd0ab1bc63bae76956f0181f54.gz
2006-10-02 06:54:23 +10:00
axel
8b2059c628 Add function to insert a range of new elements into the middle of an array_list
darcs-hash:20061001201728-ac50b-db2f7bccee53224f50347c8995b2f6496940243d.gz
2006-10-02 06:17:28 +10:00
axel
15724d0798 First stab at multiline editing
darcs-hash:20061001160258-ac50b-1a760913e64b96e30ff321d7fbe4069ca161cdfe.gz
2006-10-02 02:02:58 +10:00
axel
2839f5e567 Minor comment and documentation edits
darcs-hash:20061001155918-ac50b-8b5b4f5dbd8334bac1c0dc77fa18c8f3cfb4a878.gz
2006-10-02 01:59:18 +10:00
axel
67c820cee8 Minor tweaks to code validation for the for builtin (again)
darcs-hash:20061001155734-ac50b-6009b98dfccaf8f8292859f25c4d564c6b622f47.gz
2006-10-02 01:57:34 +10:00
axel
bce4c78d49 Further reduction of malloc calls in the history
darcs-hash:20061001152040-ac50b-085f4b8ce20c4793d5e592f7a213df04208630cb.gz
2006-10-02 01:20:40 +10:00
axel
421ebcc2d7 Be a bit more careful with memory alignemnt in halloc
darcs-hash:20060930121917-ac50b-6292696663684a38844b4c21360274b365e52969.gz
2006-09-30 22:19:17 +10:00
axel
92df4a6d91 Make sure M-d erases last character of word. Thanks to DynWind for the report
darcs-hash:20060929214804-ac50b-ffb19242fcbd594fb72016427704cb51cf9d0a22.gz
2006-09-30 07:48:04 +10:00
axel
22fe8e6a17 Fix bug in the setenv function (values wheren't exported!), thanks to Matrin Bähr for the report.
darcs-hash:20060928165405-ac50b-5ada00cfc08805677e1932c800ee79d68e35a68b.gz
2006-09-29 02:54:05 +10:00
axel
d0f1870735 Add syntax check to see that the for builtin is not given an insufficient number of arguments
darcs-hash:20060926124109-ac50b-b088397933fa7ea539e48fa9fcd461de8295f7ce.gz
2006-09-26 22:41:09 +10:00
axel
b71f5d09b0 Fix occasional off-by-one bug in syntax highlighting causing the character next to the cursor to be unhighlighted instead of the cursor itself
darcs-hash:20060924175723-ac50b-35757e87eb7076c2ecdecaed11c1bb673c571035.gz
2006-09-25 03:57:23 +10:00
axel
eb00ad77fb Make sure isatty docs are built into the main doc file
darcs-hash:20060919175509-ac50b-0174257f46e15d6e931bd8664e8a83ac498707b2.gz
2006-09-20 03:55:09 +10:00
axel
be886bc6df Unly use classifications in ls if stdout is a tty
darcs-hash:20060919165317-ac50b-c7923c7f5900ecc9814756743e6b0345efa382c5.gz
2006-09-20 02:53:17 +10:00
axel
7a5823fd60 Documentation updates from Beni Cherniavsky
darcs-hash:20060919145203-ac50b-bc87b8f5e6a18395e4bc3e364da4a40ad97850e7.gz
2006-09-20 00:52:03 +10:00
axel
81d61c467b Fix bug in for that causes crash on syntax error
darcs-hash:20060919142140-ac50b-48cbbdfd109e2b420d8e36acd5b13696445c0850.gz
2006-09-20 00:21:40 +10:00
axel
e91e3b6593 Minor bugfix in the switch parsing for the status builitn
darcs-hash:20060919142042-ac50b-b532e0308407d101d1f8b328a575a54e8bc46799.gz
2006-09-20 00:20:42 +10:00
axel
1db67a5105 Add completions for the wpa_cli command
darcs-hash:20060918222913-ac50b-9aeac9d1a5ecb4b6915625b07133b66ebab0b2bd.gz
2006-09-19 08:29:13 +10:00
axel
810faacd72 Make sure that syntax validator allows use of 'break' and 'continue' with --help even outside of loops, and make sure 'return' is only used in function definitions.
darcs-hash:20060918001518-ac50b-78977cbd17e4edce8d1b7d4c5426f478d42392af.gz
2006-09-18 10:15:18 +10:00
axel
6be3807cae Fix issue with ^W and other shortcurs sometimes not deleting anything
darcs-hash:20060916230532-ac50b-395d34e2c67d2be3d634638265a98239442fd6cd.gz
2006-09-17 09:05:32 +10:00
axel
4399503f4e Fix a bug in completion insertion code on string with escaped quotes. This bug was reported by David Benbennick.
darcs-hash:20060914151821-ac50b-c6628fc01a90865e0aec6e93b39b77c3877606fc.gz
2006-09-15 01:18:21 +10:00
axel
06b5fdc6e8 Update todo-list. Thanks to MArtin Bähr for the additions.
darcs-hash:20060913212744-ac50b-cb446bcebc04a89c7b065e2d3879b474740a005e.gz
2006-09-14 07:27:44 +10:00
axel
4037219dc0 Make sude completions include /sbin and /usr/sbin in PATH. Thanks to Xavier Douville for the suggestion.
darcs-hash:20060913171310-ac50b-a9e30533bc634f194f73fdee1e042d407f55fcac.gz
2006-09-14 03:13:10 +10:00
axel
1612ec50fb Fix bug in __fish_complete_subcommand, reported by Xavier Douville
darcs-hash:20060912231409-ac50b-c573d798d9d1abc197fcf50f3b52df2e44e1f70e.gz
2006-09-13 09:14:09 +10:00
axel
3bb0163598 Update todo-list again
darcs-hash:20060912221050-ac50b-1c16582591642beba13f83224dc7ef47cb9c5a0a.gz
2006-09-13 08:10:50 +10:00
axel
4d19aa7698 Update todo-list
darcs-hash:20060912215025-ac50b-448068ea065db5d2db4bb68b7e41ef4e986ecc83.gz
2006-09-13 07:50:25 +10:00
axel
f72de8e141 Ugly kludge to fix ugly header output from Doxygen in man-pages
darcs-hash:20060912155058-ac50b-50487271adc31d20a0e07e742a1cbe724068be6d.gz
2006-09-13 01:50:58 +10:00
axel
02eb856e44 Don't syntax highlight the character under the cursor, since that may hide the cursor. Thanks to Matin Bähr and Philip Ganchev for the reports
darcs-hash:20060911143935-ac50b-e1502365aeba0f4d97976f688329cbfc4b9871a4.gz
2006-09-12 00:39:35 +10:00
axel
c550f4eb21 Add completions for xpdf and xmms, written by Vikas Gorur
darcs-hash:20060911141848-ac50b-a541eafba3f0155b207963633262229330c01bea.gz
2006-09-12 00:18:48 +10:00
axel
00c25436d7 Make it possible to save a function when defining it using the -S switch
darcs-hash:20060908141241-ac50b-69a055a1e791e04e2b1208a5c36b9bb22c854c12.gz
2006-09-09 00:12:41 +10:00
axel
6107d63995 Add wmkdir function
darcs-hash:20060908141128-ac50b-9b67d1c5af9f746be18509bad3a0e8988efce29a.gz
2006-09-09 00:11:28 +10:00
axel
eafa0a7169 Bugfix in the wdirname function
darcs-hash:20060908141041-ac50b-8650eea2d071606654cad94553344ed12b4bf609.gz
2006-09-09 00:10:41 +10:00
axel
45d2b89780 Use halloc in history as well as other minor cleanups in history.c
darcs-hash:20060908123455-ac50b-9a3aa6a186fc883621c120cd0964a05ed595f2a4.gz
2006-09-08 22:34:55 +10:00
axel
72d73b7fdd Fix crash bug in cyntax validator when using an illegal command name. Thanks to Martin Bähr for the report.
darcs-hash:20060907201559-ac50b-34fa01bbc40eafddcc64a5111bebd88aab75a8d4.gz
2006-09-08 06:15:59 +10:00
axel
227a5da02c Fix syntax bug caused by new cmdsubs slicing feature. Thanks to Martin Bähr for the report.
darcs-hash:20060907201145-ac50b-8315f1c207883bfbe56db2ec8b3a8b3635e8dc84.gz
2006-09-08 06:11:45 +10:00
axel
e356bdaa8e Optionally add type of block to the end builtin to verify block nesting correctness
darcs-hash:20060905204347-ac50b-d0f87a700e38cdff9787be827b0df90b7f7baba5.gz
2006-09-06 06:43:47 +10:00
axel
697d524687 Clear error buffer before creating new error message to avoid bug causing all previous errors to accumulate
darcs-hash:20060905204020-ac50b-6ecc9e4c57a6b387431cef32c734ca525f05c26c.gz
2006-09-06 06:40:20 +10:00
axel
73f0d0bb48 Fix warning when help function is called with no arguments
darcs-hash:20060904201612-ac50b-63b83a589735021a6afd6be193500b549e3b25dd.gz
2006-09-05 06:16:12 +10:00
axel
200ebe43dc Add math shellscript function, which is a thin wrapper around bc
darcs-hash:20060904160023-ac50b-0d784182ca3930b0987d4338655b8717237e842c.gz
2006-09-05 02:00:23 +10:00
axel
ff2d354ef8 Bump version number
darcs-hash:20060904002509-ac50b-098c9c879257d689a975abd102f9b4d9fc00f592.gz
2006-09-04 10:25:09 +10:00
axel
3bef568955 Fix nagging warning message
darcs-hash:20060903234751-ac50b-c5d7f026323b5cab450e1770be572dcdf3ecc904.gz
2006-09-04 09:47:51 +10:00
axel
9a7be6db08 New status message for fish_pager
darcs-hash:20060903231209-ac50b-b8bad71cb9194a905918534fafec619118d61e21.gz
2006-09-04 09:12:09 +10:00
axel
40e2025327 Minor polish
darcs-hash:20060903230006-ac50b-c55a9272bb1cdb10312b8580c4c2a85654329e30.gz
2006-09-04 09:00:06 +10:00
axel
a819c863eb Skip bug causing autoloader to sometimes use the wrong version of a function. Thanks to Martin Bähr and Mystilleef for the bug reports.
darcs-hash:20060903225839-ac50b-5b1f3d5f0b8c54b999836c3384c22c2a31c31bd0.gz
2006-09-04 08:58:39 +10:00
axel
827c88e4a1 Fix bug where using the return builtin inside an if-block could cause the else-block to get executed
darcs-hash:20060831205320-ac50b-64ecbaa3ed5e32c1a815ba384a6831a8fd5e1b47.gz
2006-09-01 06:53:20 +10:00
axel
e2b7a078f4 Make "$foo\[1]" not be an array slicing. Notice the extra backslash
darcs-hash:20060831155932-ac50b-746462d2147f349f9a799cb4786a0abacd1d3d4a.gz
2006-09-01 01:59:32 +10:00
axel
6de0c4103b Add support for \cx backslash escapes for control sequences, syntax is borrowed from bash
darcs-hash:20060831155813-ac50b-cc93412afc87c1c391c3dbc5e7b8c9175efe01d8.gz
2006-09-01 01:58:13 +10:00
axel
b6e8171f01 Fix minor null pointer bug in the set builtin, fix bug causing the -n switch to be ignored, add missing completions for the -n switch to functions and set builtins, and touch up the documentation for said builtin a bit
darcs-hash:20060831154400-ac50b-dddbee79481e0e0a8da9fc025e8a15c466460a2f.gz
2006-09-01 01:44:00 +10:00
axel
b1439075c6 Updated definiton of move_word, more intuitive behaviour when a token consists only of non-alphanumerics
darcs-hash:20060831004525-ac50b-aa6675809f0f17fa266982374700a8a4ce6b2f5a.gz
2006-08-31 10:45:25 +10:00
axel
7df536023b Fix concurrency bug in autoloader causing memory leak
darcs-hash:20060828162734-ac50b-76c88ba8cc164646dcff16cb899633f1e10392e2.gz
2006-08-29 02:27:34 +10:00
axel
f5f15f9de2 Use dynamically sized buffer for reporting error messages in the parser
darcs-hash:20060828151913-ac50b-02453c13d107f88023b2331bf40daf6d329ac597.gz
2006-08-29 01:19:13 +10:00
axel
0e0a61119f Update english transliteration
darcs-hash:20060828130147-ac50b-2b07adaa3fd63cf0cd2b0122fef45b9aee365e37.gz
2006-08-28 23:01:47 +10:00
axel
6f058c687d Add fallback if SIGWINCH is unavailable
darcs-hash:20060828122515-ac50b-f2b8f1519bbbd62908a6648255bfb20bdce83212.gz
2006-08-28 22:25:15 +10:00
axel
53ea5d60b7 Minor code tweaks, mostly things like indentation, but also a ferw code reorderings
darcs-hash:20060828120244-ac50b-ad4be149ff245b6f799452f9eeff7bcc60af1526.gz
2006-08-28 22:02:44 +10:00
axel
9525f429c6 Dont let fallback implementation of killpg kill group 1
darcs-hash:20060828120122-ac50b-c5e3eb7392654feb378cdfcf11ab102418aa1386.gz
2006-08-28 22:01:22 +10:00
axel
548e379d6a Provide fallback version of getopt_long instead of checking for it's presense every time it is used
darcs-hash:20060828114305-ac50b-f4aad19e936fa42bbe84e51e72aa32445a469527.gz
2006-08-28 21:43:05 +10:00
axel
202d29de88 Restructure the autoloader. This fixes a very weird and rare Heissenbug, probably caused by a compiler bug, but also makes the structure of the code a bit more logical.
darcs-hash:20060828110019-ac50b-7be19eda18eb358163a9a5b7180c6c7d028e546d.gz
2006-08-28 21:00:19 +10:00
axel
23152ae8a6 Remove checks for gettext presense in mimedb.c and set_color.c. If gettext is unavailable, a fallback is provided.
darcs-hash:20060828105806-ac50b-47f092813ed70a03477d66c377edbe24f2aedf40.gz
2006-08-28 20:58:06 +10:00
axel
7310596dab Much more reliable getopt_long test. Idea from Netocrat.
darcs-hash:20060828102949-ac50b-bb55face2f3127018b6c79a72ee71e38f075232a.gz
2006-08-28 20:29:49 +10:00
axel
4afe49d7c6 Redo the -POSIX_C_SOURCE test to only add macros if they are found to fix things. Also add -stdÉ9 to CPPFLAGS if it is added to CFLAGS. Also add more comments, redo indentation and general file cleanup. Written cooperatively by Liljencrantz and Netocrat.
darcs-hash:20060828100334-ac50b-73eed298fdf5a853243413f0f12c235ffa9e787a.gz
2006-08-28 20:03:34 +10:00
axel
d7c3d2acbf Use OK as return value for del_curterm fallback
darcs-hash:20060828100046-ac50b-e52e7181ffb6fa5b1b3162ac3ae0aacc9bf7f5a3.gz
2006-08-28 20:00:46 +10:00
axel
f771fce892 Add a $version variable. Suggested by Martin Bähr
darcs-hash:20060828095840-ac50b-db561647eee1d06785448a4bfc6826eef5aec2b7.gz
2006-08-28 19:58:40 +10:00
axel
6522000bf0 Don't turn of file completion in svn completions if given an unknown subcommand
darcs-hash:20060827144853-ac50b-d09576fd6984eb18b06e0e7b1d8a88aa7b9d1df4.gz
2006-08-28 00:48:53 +10:00
axel
285abcc9bc Do not use the non-standard -i switch for sed
darcs-hash:20060827131554-ac50b-b969c2a56607ff46d028f5c44faabf2842814f0e.gz
2006-08-27 23:15:54 +10:00
axel
b15e8123ca If no completions have been found, use file completion even if command specific completions have disabled file completions. Suggested by MArtin Bähr.
darcs-hash:20060827005740-ac50b-41c3bf2bb91bcfc0122c317bcc2aca2061cd019e.gz
2006-08-27 10:57:40 +10:00
axel
1c86395ed8 Fix bug reportad by Martin Bähr that causes fish fail when using blocks in pipelines in interactive mode.
darcs-hash:20060827005252-ac50b-09c98537b9de72f0d4a2e5a28490b2e38fe321c8.gz
2006-08-27 10:52:52 +10:00
axel
3c8d2a1126 Don't use carriage return on initial painting of the prompt
darcs-hash:20060826022416-ac50b-16746f45142589e7fa83e95b6ee6a2fad98432c4.gz
2006-08-26 12:24:16 +10:00
axel
ed8cd08984 Fix minor memory leak in completion code
darcs-hash:20060826021948-ac50b-6fecba2056e47cb7c4e8499f2a51e1c0c23d0757.gz
2006-08-26 12:19:48 +10:00
axel
69537430ea Fix bug in completion code reported by Martin Bähr, as well as other bug evident in his bug report.
darcs-hash:20060826013722-ac50b-08de084a40af8ba5d708a7cd162087b7afbb7648.gz
2006-08-26 11:37:22 +10:00
axel
0a603a56c6 Minor bugfix for the completions for the complete builtin
darcs-hash:20060825154545-ac50b-eaa8b210ddc6fb6a089deb5c2b19723bd92228f3.gz
2006-08-26 01:45:45 +10:00
axel
046dd82995 Add minor new completion for make command
darcs-hash:20060825154516-ac50b-80284df4f7dd6cd332f2b21f5c9bdc359cc00eca.gz
2006-08-26 01:45:16 +10:00
axel
97c3e231f4 Allow slicing of command substitution output
darcs-hash:20060824133904-ac50b-fbc43cf30d8eb15e50343b786af77f85fb0b8d4e.gz
2006-08-24 23:39:04 +10:00
axel
76b782d576 Do not mix wide and narrow printf calls on stderr in set_color.c
darcs-hash:20060824133828-ac50b-399d9c8d4f6cd7c36ceb2991011d9dae23851d6f.gz
2006-08-24 23:38:28 +10:00
axel
ed5c1db392 Bump version number
darcs-hash:20060824105129-ac50b-999429675a936c246665940ee9154a524eae4be2.gz
2006-08-24 20:51:29 +10:00
axel
37f5db2bf9 Use terminfo to look up tab width instead of assuming 8 character tabs when calculating prompt width
darcs-hash:20060824104354-ac50b-bfb6428411a9c3f6e7a8df980b1005fdd1842a10.gz
2006-08-24 20:43:54 +10:00
axel
8a97bffd02 Spelling correction in documentation
darcs-hash:20060824103055-ac50b-8a81c73571b76dd2800787ca6e5bd29787eb9501.gz
2006-08-24 20:30:55 +10:00
axel
2fd48bce11 Fix use og uncasted 0 as null pointer in vararg function. Potential crash bug on 64 bit systems.
darcs-hash:20060824103014-ac50b-3fb830f548d383b8cef7a37b737c90f3ad30c4bd.gz
2006-08-24 20:30:14 +10:00
axel
d1a3e6abf5 Complete --do-complete argument should be optional
darcs-hash:20060824005315-ac50b-fa4fb8177bc11cf20f2f95fff43cd674a439bae0.gz
2006-08-24 10:53:15 +10:00
axel
1a29979bbd Ignore return code of exec_subshell when doing command substitution
darcs-hash:20060824005217-ac50b-9de976e1fe2d396b08b59619e46669bad6598ec2.gz
2006-08-24 10:52:17 +10:00
axel
69814e5066 Add documentation about new backslash escapes, and correct a broken link in the docs
darcs-hash:20060824005117-ac50b-39a1f56891c92e6a9b64b20fdd4bfd7d60090949.gz
2006-08-24 10:51:17 +10:00
axel
4dbac8f941 Add support for \a \f \v escape sequences, and make supåport for \e standards compliant
darcs-hash:20060824002609-ac50b-a1a9150d096647d9ab4c39d3245b528d7e75cd57.gz
2006-08-24 10:26:09 +10:00
axel
303473f20c Fix incorrect usage of the term subshell when command substitution was meant
darcs-hash:20060822143831-ac50b-cb5267a6434adcbd5bafb452d688bee06c23d4d6.gz
2006-08-23 00:38:31 +10:00
axel
480a29594e Minor tweaks to previous fish_pager patch to fix two bugs
darcs-hash:20060822135815-ac50b-35d9f643385ec29f9d8f93ca83d01e060de93cc7.gz
2006-08-22 23:58:15 +10:00
stew
dfe3dc1429 fish_pager_via_stdin
darcs-hash:20060822012451-2edb7-d8939fab708d8c605d2c7d0683c71f11db659bc9.gz
2006-08-22 11:24:51 +10:00
axel
2ea00ce444 help --help should be same as help help
darcs-hash:20060822005230-ac50b-b82c0665cae7427c09992f51e128e33cea44b41e.gz
2006-08-22 10:52:30 +10:00
axel
ac13bdeaa7 Work around Doxygen bug in man-file generation
darcs-hash:20060822004853-ac50b-3c5036484961825304059567670eea0ccb3cd643.gz
2006-08-22 10:48:53 +10:00
axel
22cb7dd2d7 Add horizontal ruler between documentation for builtins and commands
darcs-hash:20060822004810-ac50b-aa75e233685ce4e0c22cde27411550a13efbeff6.gz
2006-08-22 10:48:10 +10:00
axel
20698cc813 Remove duplicate include
darcs-hash:20060817155050-ac50b-bbbd5130688d1f3f5f4e4d48c4319faf4413995a.gz
2006-08-18 01:50:50 +10:00
axel
1ebf571da5 Update french translation, thanks to Xavier Douville
darcs-hash:20060814181448-ac50b-08e5a5e8eff3316411469730d03d756170e4b01a.gz
2006-08-15 04:14:48 +10:00
axel
7c822cbf30 Add a message to stdout in the help function describing where the help went if help opens an external browser window
darcs-hash:20060814181135-ac50b-6d9b05b714bc9576c260e87b5706e7d94dd73e39.gz
2006-08-15 04:11:35 +10:00
axel
90302d9232 Documentation correction
darcs-hash:20060814120540-ac50b-25daddbd1130d1b57837affa6c58542fd91ff59e.gz
2006-08-14 22:05:40 +10:00
axel
bee6805ff9 Check return value of del_curterm
darcs-hash:20060813230502-ac50b-2b7e30d3560097725789bf6aa659835e30c7a81b.gz
2006-08-14 09:05:02 +10:00
netocrat
65035c4dc7 Change null function to #define for del_curterm() - solves build problem on some BSDs.
darcs-hash:20060813030853-344c5-7aa2cc3c70044214d90263999f2312f8f10296a4.gz
2006-08-13 13:08:53 +10:00
netocrat
2b0d64184a Switch back to using -D for _POSIX_C_SOURCE and _XOPEN_SOURCE - solves build problem on Solaris 10
darcs-hash:20060813030806-344c5-ad0eec62d3ce93d98adcad4b93318b06538eef95.gz
2006-08-13 13:08:06 +10:00
axel
51d7159ba7 Update fish_pager interface, first try - this is the second patch to redo the fish_pager interface. Both this one and the previous one breaks the display of completions
darcs-hash:20060813014602-ac50b-3d30e3486021b1ffddf3f1a69e86ee51a6aac611.gz
2006-08-13 11:46:02 +10:00
axel
0a4819be27 Add support for buffering of input to a command, the first step to piping data to fish_pager instead of using the argument list
darcs-hash:20060813013803-ac50b-f8000d4c96162023411f84643f47221860b350b2.gz
2006-08-13 11:38:03 +10:00
axel
72ad4e0d3b Make fish pager use non-universal variables as well for getting it's colors
darcs-hash:20060811145528-ac50b-26be05f363f353d87ebceccf73385cd1af1c88f2.gz
2006-08-12 00:55:28 +10:00
axel
21de293a44 Fix missing quote in configure.ac
darcs-hash:20060811142930-ac50b-52d1bb6faf07b6a0ddac754cee16e899dd196679.gz
2006-08-12 00:29:30 +10:00
axel
8b395d05ef Switch to using AC_DEFINE instead of using -D switces in CFLAGS for a few macros that don't need to be passed through the Makefile
darcs-hash:20060811134859-ac50b-6efc59b9214909aa6804bed9c5919ed0e29ddf81.gz
2006-08-11 23:48:59 +10:00
axel
8392902cec Remove unneded include in Autoconf test. Thanks to Netocrat.
darcs-hash:20060811101005-ac50b-275a1240e7802f70eb763be42683b4d1f816a9b0.gz
2006-08-11 20:10:05 +10:00
axel
a5abdd2792 Always redefine del_curterm to be a no-op under bsd, seeme the double free bug can surface under ncurses as well. Thanks to Netocrat.
darcs-hash:20060811100756-ac50b-1b1010b696fdd9acf45ef85ab19e75f574e5198b.gz
2006-08-11 20:07:56 +10:00
axel
e784683b8a Comment away currently unused function to avoid warning. Thanks to Netocrat.
darcs-hash:20060811093051-ac50b-d025c406234bb31e36c0b0b7951b54c6fc62ed07.gz
2006-08-11 19:30:51 +10:00
axel
7fadf6c083 Do not call closedir on directories that failed to open. Avoids crash bug. Thanks to Netocrat.
darcs-hash:20060811092639-ac50b-6615f51aad8c2a81917db08e2dc8f4da3d7db2ef.gz
2006-08-11 19:26:39 +10:00
axel
7ff76476ed Remove non-unicode character in documentation file. Thanks to Netocrat.
darcs-hash:20060811092603-ac50b-59a68550fa3279662113ec080b18e7930bb02fe2.gz
2006-08-11 19:26:03 +10:00
axel
cd9102214b Rearrange includes so that config.h is always the first file to be included
darcs-hash:20060811011835-ac50b-847fc790288e3bb3f3a0ee7734ff278d2dc65bef.gz
2006-08-11 11:18:35 +10:00
axel
8da54a1955 Add two BSD-specific preprocessor macros to get additional prototypes. Thanks to Netocrat.
darcs-hash:20060810203756-ac50b-21259e610fc738c6ad990d88b0af74d56d6a38f8.gz
2006-08-11 06:37:56 +10:00
axel
6899e4e734 Do not use ! to negate shellscript results, this is unsupported on Solaris. Thanks to Netocrat.
darcs-hash:20060810194951-ac50b-7baee5f1ab962fac6fbb37f13e0a8ba134e910e2.gz
2006-08-11 05:49:51 +10:00
axel
486e0dbe84 Remove Solaris circular dependency in init file. Thanks to Netocrat.
darcs-hash:20060810193338-ac50b-2f1f68170610e1669fc20298fcce50a920c3f38f.gz
2006-08-11 05:33:38 +10:00
axel
441c109afb Remove unneded includes in autoconf tesst and add possibly needed one. Thanks to Netocrat.
darcs-hash:20060810192359-ac50b-8e38e24ada59928cf6f37e7ed625fe40a34fd5d7.gz
2006-08-11 05:23:59 +10:00
axel
4b0810d7e9 Added missing include in input_common.c, needed under FreeBSD. Thanks to Netocrat.
darcs-hash:20060810190246-ac50b-190b0b2e1fbcab0bd742f5b98f7e1e173b793800.gz
2006-08-11 05:02:46 +10:00
axel
51d58a6a7c Added missing line continuation. Thanks to Netocrat.
darcs-hash:20060810185244-ac50b-944f18d3bed557061e0625b805e51a6a743835ae.gz
2006-08-11 04:52:44 +10:00
axel
7a884e11a6 Avoid circular dependency in ls autoload. Second try.
darcs-hash:20060809231155-ac50b-52b1b1609307fb05d3d8f32c972b0a22476a1da8.gz
2006-08-10 09:11:55 +10:00
axel
c4acfdd87c Add missing files to make uninstall
darcs-hash:20060809230749-ac50b-2948357bb000b47b49b6310dabd84410fde3b461.gz
2006-08-10 09:07:49 +10:00
axel
41f8007a03 More header/autoconf fixes, improve winsize checking
darcs-hash:20060809225338-ac50b-7162a690e44e2272f4760723f5bf8cc135dc5952.gz
2006-08-10 08:53:38 +10:00
axel
8207030b21 Fix typo in seq.in
darcs-hash:20060809225230-ac50b-8371f5fd1a22526325d46f5a0565e3a38d51bb78.gz
2006-08-10 08:52:30 +10:00
axel
a2c70f495e Use string.h not strings.h in all cases
darcs-hash:20060809223452-ac50b-67c4b5af37ebd17ff6d7c1403ff3231272f35465.gz
2006-08-10 08:34:52 +10:00
axel
b11f366bb0 Add SIGUSR1 as fallback if SIGIO doesn't exist
darcs-hash:20060809222656-ac50b-9a1f5a202f012c836570041acb6064849e7b0de5.gz
2006-08-10 08:26:56 +10:00
axel
0e1a3c7c4a Add missing sys/select.h header needed on FreeBSD
darcs-hash:20060809222605-ac50b-7914c1eb0509a01bfb6d07a04e29e126218f89dc.gz
2006-08-10 08:26:05 +10:00
axel
d3a75a354a A new faq question and some minor documentation edits
darcs-hash:20060809114048-ac50b-0fe667bfe9cdcade6480137f2cf5982cc743288c.gz
2006-08-09 21:40:48 +10:00
axel
afc49dded2 Minor edits to the spec file
darcs-hash:20060809113614-ac50b-ab6ca380a48586ef95256ab8acb77da42854829b.gz
2006-08-09 21:36:14 +10:00
axel
49b232df84 Add a few missing dependencies for the spec file
darcs-hash:20060809113554-ac50b-cbc408698f102c3e3170a119acfafe7569c56592.gz
2006-08-09 21:35:54 +10:00
axel
248d11c462 Only write out titlebar message if it is of non-zero length
darcs-hash:20060809113424-ac50b-59988efa4dd788d6623023b642fd96989c4c9ada.gz
2006-08-09 21:34:24 +10:00
axel
6b1570b745 Tweak spec file as per suggestions from Michael Schwendt
darcs-hash:20060801135709-ac50b-07c6191b7464ba90dd64c78ae18df8b59e8e18ad.gz
2006-08-01 23:57:09 +10:00
axel
dc3634dc94 Add posix macros in configure.ac, not in Makefile, so that they will be honored by the configure tests
darcs-hash:20060801013123-ac50b-0c561ad5afd6e71230e29a25d467ed63c47b9f17.gz
2006-08-01 11:31:23 +10:00
axel
696b4df1c6 Add __EXTENSIONS__ macro when under Solaris
darcs-hash:20060801013018-ac50b-08925f5e5239e48ca3024717d5fec2e82138ca5a.gz
2006-08-01 11:30:18 +10:00
axel
65f4d6e866 The xpg4-path was mistyped. Fix it.
darcs-hash:20060801005736-ac50b-ef8389777e012f9f0b6edcb3df3d638158f87373.gz
2006-08-01 10:57:36 +10:00
axel
8833e8f4ea Fix minor nit in comment
darcs-hash:20060801005246-ac50b-56cb6d2245ce81d16807028749495b8e5a86cc3c.gz
2006-08-01 10:52:46 +10:00
axel
f29026b767 Fix another typo in common.c
darcs-hash:20060801004648-ac50b-4177620e4ee37ab1ad6f942faa3023cedeee9055.gz
2006-08-01 10:46:48 +10:00
axel
7ecf7c1fac Fix typo in common.c
darcs-hash:20060801003556-ac50b-fb20d6405d2d8fc8d343d040afbf3863bac07b2f.gz
2006-08-01 10:35:56 +10:00
axel
4a2fa5ea34 Fix typo in signal.c
darcs-hash:20060801002550-ac50b-3412377a694aac72d04e6eae3173ac0980724e60.gz
2006-08-01 10:25:50 +10:00
axel
03f6656af6 Use S_IS* macros instead of S_IF*, which are non-posix
darcs-hash:20060801002411-ac50b-e5afcbfe4adfc54333c982b43309091c1cbcc1c9.gz
2006-08-01 10:24:11 +10:00
axel
8e6dbe245c Changes to the fish spec file, written by Paul Howarth. Fixes spelling and broken dependencies.
darcs-hash:20060731212954-ac50b-630beb87b4563118c132dbf1c525d492b30df3eb.gz
2006-08-01 07:29:54 +10:00
axel
daf171aa86 Make grep call in seq fallback implementation Posix compliant
darcs-hash:20060731165626-ac50b-5560aebc877f49f4942b2c730273d8c2424bec24.gz
2006-08-01 02:56:26 +10:00
axel
d1bbb89389 Move over a few more objects to the new array_list functions
darcs-hash:20060731165511-ac50b-7858829e6a612e0c737d82d3d71d6833dc97f078.gz
2006-08-01 02:55:11 +10:00
axel
bd0c1573df Fix bug when using same array index more than once in a single array expansion, e.g. $PATH[1 1 1]
darcs-hash:20060731164816-ac50b-d3fc56b425035a4cbcf93a91435f9df9ca5997ac.gz
2006-08-01 02:48:16 +10:00
axel
2700a9b697 Use the new array_list functions in exec.c
darcs-hash:20060731163548-ac50b-3b503e0457b33c6bb2eda0040a9fa7f15e6afe32.gz
2006-08-01 02:35:48 +10:00
axel
474f6e90ff Use maxi not max in test suite when comaparing ints
darcs-hash:20060731163119-ac50b-94134f758d9cd7e87746fb93f187aa100c1b820d.gz
2006-08-01 02:31:19 +10:00
axel
7cbc11f1c3 Minor documentation additions
darcs-hash:20060731163027-ac50b-8532ecadc755400fc1be1f029fcec49412764da2.gz
2006-08-01 02:30:27 +10:00
axel
09f9d43be3 Drup minf/maxf from util.h, they are unused
darcs-hash:20060731162550-ac50b-6b4d29d73ef7d672c3c0f9070b528b96b9ec0c16.gz
2006-08-01 02:25:50 +10:00
axel
109e7455a8 Use the new array_list functions in builtin.c
darcs-hash:20060731162339-ac50b-e8a6bd2c327b8fa5527b739fba544994e1a809e3.gz
2006-08-01 02:23:39 +10:00
axel
9b95332aa9 Use the new array_list functions in builtin_set.c
darcs-hash:20060731161719-ac50b-28a669e7a83f966dba3527a148ff0fa0813fbd6b.gz
2006-08-01 02:17:19 +10:00
axel
cccd13db92 Add long and function pointer versions of all array_list_t calls
darcs-hash:20060731161641-ac50b-1850b9c2464ce1aa7ff2f1aa74140b526a6825f2.gz
2006-08-01 02:16:41 +10:00
axel
2c8a2c9f61 Add _POSIX_C_SOURCE macro, to enable Posix mode of various headers. Should help under Solaris. Thanks to Netocrat for the suggestion.
darcs-hash:20060731153213-ac50b-14f8402a743dd67f34e3699e993cef329fdd9427.gz
2006-08-01 01:32:13 +10:00
axel
f05e1f6e48 Always check strings sent to tparm
darcs-hash:20060731004804-ac50b-ddede984cbc114b5e79745aef768f85a587d3dc6.gz
2006-07-31 10:48:04 +10:00
axel
f439c4a484 Make calls to grep Posix compliant
darcs-hash:20060731003354-ac50b-5916d6d862fe8b4f31b64840296d24615b52d175.gz
2006-07-31 10:33:54 +10:00
axel
2fba53b113 Make PATH validation only run for interactive shells to avoid infinite loop
darcs-hash:20060731003311-ac50b-da0b49830e5a9042fbe7952a63ced2c86b8978fe.gz
2006-07-31 10:33:11 +10:00
axel
8a2846ed44 Add Solaris xpg4 PATH test
darcs-hash:20060731003111-ac50b-d8945adca50bbe9e86041835ed52a88e09f65701.gz
2006-07-31 10:31:11 +10:00
axel
91b63e4989 Make sure install-sh is executable in the Makefile
darcs-hash:20060730210506-ac50b-9869e637a768aefd6ec7db33cec5f2defb29eb36.gz
2006-07-31 07:05:06 +10:00
axel
89d876d0f7 Provide fallback of killpg function
darcs-hash:20060730205941-ac50b-ddcec32cc5ab74770b743fed3d131460ee576191.gz
2006-07-31 06:59:41 +10:00
axel
e79fdcb194 Provide fallback is struct winsize is not defined
darcs-hash:20060730205544-ac50b-26f34eb04b56924baa34f560fd274cf38413b5f5.gz
2006-07-31 06:55:44 +10:00
axel
60f0533821 Include siginfo.h in all signal-using files to make Solaris happy. Thanks to Netocrat for the report and a description of the solution.
darcs-hash:20060730202659-ac50b-1840aff40ec2467242bd107676c7426cdb14f643.gz
2006-07-31 06:26:59 +10:00
axel
0768cf7e53 Bump version number
darcs-hash:20060729173243-ac50b-641e89defc78e0660cac6601acfb22c73c1cd32e.gz
2006-07-30 03:32:43 +10:00
axel
bdd83d338c Minor edit of comments
darcs-hash:20060729173159-ac50b-f126469f9a6f221d94696d6292ca9a6c79a7a6e6.gz
2006-07-30 03:31:59 +10:00
axel
db369a9ad7 Minor documentation edits
darcs-hash:20060729173123-ac50b-9b895afc355cf5dc342fca3c276cfbf10c286bc2.gz
2006-07-30 03:31:23 +10:00
axel
aa895c6740 Fix minor bug causing spurious warnings on commandline. Thanks to Netocrat for the bugreport.
darcs-hash:20060728135203-ac50b-07471a032a389a26789ee871bf0dc25c6a91bd7a.gz
2006-07-28 23:52:03 +10:00
axel
8e06805f2d Fix for recursive autoload loop on ls
darcs-hash:20060728131756-ac50b-034430a6a44bec83419438fc1be0c0e603eaad2d.gz
2006-07-28 23:17:56 +10:00
axel
00360d8fbc Reorder switches to msgfmt in makefile to make Solaris msgfmt happy. Thansk to Netocrat for the report.
darcs-hash:20060728130715-ac50b-84c09814f3c2cb859d3efc8593161186dff6fcc3.gz
2006-07-28 23:07:15 +10:00
axel
3b365d9f8d Use unsigned long instead of uint in string hashing algorithm. Portability fix, suggested by Netocrat.
darcs-hash:20060728125421-ac50b-f3cfc12852739fdc1d3c43c46ed91a57e119964a.gz
2006-07-28 22:54:21 +10:00
axel
3835000e9d Include unistd.h and stropts.h in common.c to fix Solaris problems reported by Netocrat
darcs-hash:20060728125057-ac50b-455d5a9a1671ad3bfee61a46266b420aff1adb49.gz
2006-07-28 22:50:57 +10:00
axel
9bbe19bfb8 Minor fix to code for detecting help switches to builtins
darcs-hash:20060724124845-ac50b-546662123d4d30c314acb1fb74d3c9503332172b.gz
2006-07-24 22:48:45 +10:00
axel
787e99d901 Fix rare crash bug in highlighting code
darcs-hash:20060724124629-ac50b-114944bc776f9451feeb967f4af68919d3ac404c.gz
2006-07-24 22:46:29 +10:00
axel
713748c782 Some minor steps towards making vi-mode work
darcs-hash:20060723205203-ac50b-8125e733ed92689ba847ccbb9076d05910e701ac.gz
2006-07-24 06:52:03 +10:00
axel
c9eb74fa4b Add missing Substitutions of prefix and optbindirs variables in share/fish.in
darcs-hash:20060723170402-ac50b-551cff33ca0e831505b5891fada0a017c3ea1370.gz
2006-07-24 03:04:02 +10:00
axel
b2d940c25a Drop the init and shutdown function for the completion code
darcs-hash:20060722101651-ac50b-45f840a5b2f7461d976a8f5b859aa99bfa472274.gz
2006-07-22 20:16:51 +10:00
axel
2a7bc8c04b Plug very small memory leak
darcs-hash:20060722101549-ac50b-244f449244272fc1fea9b7d019d7c259f4746533.gz
2006-07-22 20:15:49 +10:00
axel
013d3dbb89 Make sure that the builtin source command is used when reading the init files, and not an overloaded function
darcs-hash:20060722095507-ac50b-4c7c51bec3f2d7224178cdacd2c9ec4ea3b073c3.gz
2006-07-22 19:55:07 +10:00
axel
0aff94dd4c Automatically sort manuals for builtins and commands when generating manual
darcs-hash:20060722095326-ac50b-6d1cdefa7fb3e6f71368be2a205e9ed9e84a1624.gz
2006-07-22 19:53:26 +10:00
axel
431850b4ec Add PACKAGE_TARNAME variable to makefile to make Debian packages happy
darcs-hash:20060721223909-ac50b-d970c0e6104e9be4eb082030193dbc4a667d10c3.gz
2006-07-22 08:39:09 +10:00
axel
e280d10033 Minor code edits. Use CHECK instead of a few error messages, add a few comments, etc.
darcs-hash:20060721010831-ac50b-e9ad82a3885969f9a43e6219523e2bd1867e26ed.gz
2006-07-21 11:08:31 +10:00
axel
8c4708b51e Make error message for ${foo}-type errors nicer
darcs-hash:20060720233319-ac50b-a5ffbe91b3c7dceba9f0f5e67a6e044fc5508f47.gz
2006-07-21 09:33:19 +10:00
axel
4ba9ac28bb Minor documentation tweaks and additions
darcs-hash:20060720133319-ac50b-ea71dc172f0c60de0d6f1effa2092ebb8d8ca2d9.gz
2006-07-20 23:33:19 +10:00
axel
4664d65af7 Add a few casts to avoid warnings in fallback gettext and friends
darcs-hash:20060720133125-ac50b-f357c1e8dc9c8dfbafa3baa51fcfb47525d337ba.gz
2006-07-20 23:31:25 +10:00
axel
1b7157a03f Update dependencies - This is needed to make fish build, since old dependencies include removed files. Thansk to Netocreat for the notice.
darcs-hash:20060720133045-ac50b-a5f84ded2003a5cd9c8fe5d32b9773d5498763b0.gz
2006-07-20 23:30:45 +10:00
axel
e1dd17a7dd Move over fish_interactive.fish to be created by the Makefile, not by Autoconf
darcs-hash:20060720132850-ac50b-2f1a4815a2a67541d3461768d00e185168727b92.gz
2006-07-20 23:28:50 +10:00
axel
5c8d9bd13c Minor duplicate code removal
darcs-hash:20060720130246-ac50b-b41daebb302e1cbadf2a4cf812d936edbda85926.gz
2006-07-20 23:02:46 +10:00
axel
1c9a173b3d Make sure autoconf tells the Makefile whether gettext is installed
darcs-hash:20060720130148-ac50b-9aef2d0e708a1253187a215d0407764510ba0ff0.gz
2006-07-20 23:01:48 +10:00
axel
a0c40fcf8d Print help message when the case builtin is misused
darcs-hash:20060719232226-ac50b-c61b4b6d498dbfbe83ee1bc4c37766e1a9662630.gz
2006-07-20 09:22:26 +10:00
axel
f36811b7be Improve error message for attempts to use Posix variable assignments
darcs-hash:20060719232020-ac50b-1564ffffc2e119e90d711605247637e7aac9da96.gz
2006-07-20 09:20:20 +10:00
axel
40ed01f6f2 Move a few pieces of implementation-specific kludges related to different gettext implementations out of env.c and into fallback.c
darcs-hash:20060719231149-ac50b-c930a77ae76249b27f800f1d61146482c8f005c9.gz
2006-07-20 09:11:49 +10:00
axel
b2e2743195 Remove translate.c. The gettext fallback functionality is moved to fallback.c, the wide wrapper is moved to wutil.c
darcs-hash:20060719225549-ac50b-0a55e805b04f4fe0afa99ea580901d62f39cdef5.gz
2006-07-20 08:55:49 +10:00
axel
1dc033f71c Fix temporarily broken fish_function_path during startup
darcs-hash:20060719224433-ac50b-d7b4480d694cb8f71ecee75e21c7530700d3c609.gz
2006-07-20 08:44:33 +10:00
axel
ba4166d17d Fix for the autoconf-changes in the porevious patch. The LOCALEDIR macro should be a regular string, not a wide string
darcs-hash:20060719165803-ac50b-1b76c45b77469c0a7dbf47b866ab127bd48780e5.gz
2006-07-20 02:58:03 +10:00
axel
46c6f7880b Set value of install path macros like DATADIR from the Makefile, not automatically by Autoconf using AC_DEFINE. That way we get correct expansion of ${prefix} and friends to their install-time value. This fixes a bug reported by James Vega.
darcs-hash:20060719144104-ac50b-05001b151a54bf893ff4c5a82c5f040529e27f57.gz
2006-07-20 00:41:04 +10:00
axel
bef7fff383 Do not test universal variable functionality since it relies on fish to be installed
darcs-hash:20060718173711-ac50b-1feae98c4c283bfa5bbc8dfedec3eb4641316a8d.gz
2006-07-19 03:37:11 +10:00
axel
0811613fe9 Make sure no error message is printed when failing to start fishd
darcs-hash:20060718173547-ac50b-cf1edeb25838b2df6120efa68855316939fb3f0f.gz
2006-07-19 03:35:47 +10:00
axel
a09abea737 Make sure to only close fishd socket if it is open on shutdown
darcs-hash:20060718172756-ac50b-3f36ee03489427823a36161b920b280b3494c1fa.gz
2006-07-19 03:27:56 +10:00
axel
fd4e5e6777 Fix crash bug in fish_tests when fishd is unavailable
darcs-hash:20060718172702-ac50b-72805efd3c9c7927a9fe37b6c80ef0dd276cde5f.gz
2006-07-19 03:27:02 +10:00
axel
57b3965518 Initialize etc/fish and share/fish from the Makefile, not automatically by Autoconf. That way we get correct expansion of ${prefix} and friends to their install-time value. This fixes a bug reported by James Vega.
darcs-hash:20060718164155-ac50b-8ec6c63d9c4e52db2c1884fcffeab78333367773.gz
2006-07-19 02:41:55 +10:00
axel
3e843f8219 Two minor build fixes, thanks to Hiroshi Sakurai
darcs-hash:20060717134217-ac50b-e7ec4f4ef1a4267486e746dacee79749048e3afe.gz
2006-07-17 23:42:17 +10:00
axel
2343ce5a0c Don't check for presence of Doxygen in the configure script, since it's no longer needed to build fish
darcs-hash:20060716225329-ac50b-7e48abb063dd717adfd00c571c5550978790d2bc.gz
2006-07-17 08:53:29 +10:00
397 changed files with 37661 additions and 13925 deletions

View File

@@ -30,7 +30,7 @@ PROJECT_NUMBER = @PACKAGE_VERSION@
# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.
OUTPUT_DIRECTORY = builtin_doc
OUTPUT_DIRECTORY = help_doc
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
# 4096 sub-directories (in 2 levels) under the output directory of each output
@@ -423,7 +423,7 @@ WARN_LOGFILE =
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT =
INPUT = doc_src
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp

23
INSTALL
View File

@@ -32,17 +32,22 @@ separate build directories or any other fancy configure options.
Simple install procedure
========================
If you have downloaded the darcs repository of fish, you need to run
the autoconf command first. Then use the following commands to compile
fish:
Always begin by uninstalling any previous fish versions. This is done
by running the command 'make uninstall' in the source directory of
your previous fish installation.
% ./configure
% make # Compile fish
% make install # Install fish
% echo /usr/local/bin/fish >>/etc/shells # Add fish to list of shells
Next, if you have downloaded a fresh copy of the darcs repository of
fish, you need to run the 'autoconf' command.
If you wish to use fish as your default shell, use the following
command:
Then, use following commands to compile fish:
./configure
make # Compile fish
make install # Install fish
echo /usr/local/bin/fish >>/etc/shells # Add fish to list of shells
Finally, if you wish to use fish as your default shell, use the
following command:
% chsh -s /usr/local/bin/fish

File diff suppressed because it is too large Load Diff

719
builtin.c

File diff suppressed because it is too large Load Diff

View File

@@ -35,12 +35,12 @@ enum
/**
Error message on multiple scope levels for variables
*/
#define BUILTIN_ERR_GLOCAL _( L"%ls: Variable scope can only be one of universal, global and local\n%ls\n" )
#define BUILTIN_ERR_GLOCAL _( L"%ls: Variable scope can only be one of universal, global and local\n" )
/**
Error message for specifying both export and unexport to set/read
*/
#define BUILTIN_ERR_EXPUNEXP _( L"%ls: Variable can't be both exported and unexported\n%ls\n" )
#define BUILTIN_ERR_EXPUNEXP _( L"%ls: Variable can't be both exported and unexported\n" )
/**
Error message for unknown switch
@@ -62,11 +62,29 @@ enum
*/
#define BUILTIN_FOR_ERR_IN _( L"%ls: Second argument must be 'in'\n" )
/**
Error message for insufficient number of arguments
*/
#define BUILTIN_FOR_ERR_COUNT _( L"%ls: Expected at least two arguments, got %d\n")
#define BUILTIN_FOR_ERR_NAME _( L"%ls: '%ls' is not a valid variable name\n" )
/**
Error message when too many arguments are supplied to a builtin
*/
#define BUILTIN_ERR_TOO_MANY_ARGUMENTS _( L"%ls: Too many arguments\n" )
/**
Error message when block types mismatch in the end builtin, e.g. 'begin; end for'
*/
#define BUILTIN_END_BLOCK_MISMATCH _( L"%ls: Block mismatch: '%ls' vs. '%ls'\n" )
/**
Error message for unknown block type in the end builtin, e.g. 'begin; end beggin'
*/
#define BUILTIN_END_BLOCK_UNKNOWN _( L"%ls: Unknown block type '%ls'\n" )
#define BUILTIN_ERR_NOT_NUMBER _( L"%ls: Argument '%ls' is not a number\n" )
/**
Stringbuffer used to represent standard output
*/
@@ -146,12 +164,10 @@ const wchar_t *builtin_complete_get_temporary_buffer();
/**
Return the help text for the specified builtin command. Use
non-wide characters since wide characters have some issues with
string formating escape sequences sometimes.
Return the help text for the specified builtin command.
\param cmd The command for which to obtain help text
*/
char *builtin_help_get( const wchar_t *cmd );
wchar_t *builtin_help_get( const wchar_t *cmd );
#endif

View File

@@ -3,6 +3,8 @@
Functions used for implementing the commandline builtin.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -11,8 +13,6 @@ Functions used for implementing the commandline builtin.
#include <termios.h>
#include <signal.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
@@ -26,7 +26,7 @@ Functions used for implementing the commandline builtin.
#include "tokenizer.h"
#include "input_common.h"
#include "input.h"
#include "translate.h"
#include "parse_util.h"
/**
@@ -52,15 +52,15 @@ enum
}
;
static wchar_t *current_buffer=0;
static int current_cursor_pos = -1;
/**
Returns the current commandline buffer.
*/
static const wchar_t *get_buffer()
static wchar_t *get_buffer()
{
const wchar_t *buff = builtin_complete_get_temporary_buffer();
if( !buff )
buff = reader_get_buffer();
return buff;
return current_buffer;
}
/**
@@ -68,11 +68,7 @@ static const wchar_t *get_buffer()
*/
static int get_cursor_pos()
{
const wchar_t *buff = builtin_complete_get_temporary_buffer();
if( buff )
return wcslen( buff );
else
return reader_get_cursor_pos();
return current_cursor_pos;
}
@@ -150,7 +146,6 @@ static void write_part( const wchar_t *begin,
if( tokenize )
{
buff = wcsndup( begin, end-begin );
// fwprintf( stderr, L"Subshell: %ls, end char %lc\n", buff, *end );
sb_init( &out );
@@ -163,20 +158,21 @@ static void write_part( const wchar_t *begin,
(tok_get_pos( &tok)+wcslen(tok_last( &tok)) >= pos) )
break;
// fwprintf( stderr, L"Next token %ls\n", tok_last( &tok ) );
switch( tok_last_type( &tok ) )
{
case TOK_STRING:
sb_append2( &out, tok_last( &tok), L"\n", (void *)0 );
{
wchar_t *tmp = unescape( tok_last( &tok ), UNESCAPE_INCOMPLETE );
sb_append2( &out, tmp, L"\n", (void *)0 );
free( tmp );
break;
}
}
}
if( out.buff )
sb_append( sb_out,
(wchar_t *)out.buff );
sb_append( sb_out,
(wchar_t *)out.buff );
free( buff );
tok_destroy( &tok );
@@ -184,12 +180,24 @@ static void write_part( const wchar_t *begin,
}
else
{
wchar_t *buff, *esc;
if( cut_at_cursor )
{
end = begin+pos;
}
sb_append_substring( sb_out, begin, end-begin );
sb_append( sb_out, L"\n" );
buff = wcsndup( begin, end-begin );
esc = unescape( buff, UNESCAPE_INCOMPLETE );
// debug( 0, L"woot2 %ls -> %ls", buff, esc );
sb_append( sb_out, esc );
sb_append( sb_out, L"\n" );
free( esc );
free( buff );
}
}
@@ -210,6 +218,20 @@ static int builtin_commandline( wchar_t **argv )
int function_mode = 0;
int tokenize = 0;
int cursor_mode = 0;
wchar_t *begin, *end;
current_buffer = (wchar_t *)builtin_complete_get_temporary_buffer();
if( current_buffer )
{
current_cursor_pos = wcslen( current_buffer );
}
else
{
current_buffer = reader_get_buffer();
current_cursor_pos = reader_get_cursor_pos();
}
if( !get_buffer() )
{
@@ -272,6 +294,14 @@ static int builtin_commandline( wchar_t **argv )
L"help", no_argument, 0, 'h'
}
,
{
L"input", required_argument, 0, 'I'
}
,
{
L"cursor", no_argument, 0, 'C'
}
,
{
0, 0, 0, 0
}
@@ -282,7 +312,7 @@ static int builtin_commandline( wchar_t **argv )
int opt = wgetopt_long( argc,
argv,
L"aijpctwforh",
L"aijpctwforhI:C",
long_options,
&opt_index );
if( opt == -1 )
@@ -337,12 +367,21 @@ static int builtin_commandline( wchar_t **argv )
tokenize=1;
break;
case 'I':
current_buffer = woptarg;
current_cursor_pos = wcslen( woptarg );
break;
case 'C':
cursor_mode = 1;
break;
case 'h':
builtin_print_help( argv[0], sb_out );
return 0;
case L'?':
builtin_print_help( argv[0], sb_err );
builtin_unknown_option( argv[0], argv[woptind-1] );
return 1;
}
}
@@ -354,16 +393,13 @@ static int builtin_commandline( wchar_t **argv )
/*
Check for invalid switch combinations
*/
if( buffer_part || cut_at_cursor || append_mode || tokenize )
if( buffer_part || cut_at_cursor || append_mode || tokenize || cursor_mode )
{
sb_printf(sb_err,
BUILTIN_ERR_COMBO,
argv[0] );
sb_append2(sb_err,
parser_current_line(),
L"\n",
(void *)0);
builtin_print_help( argv[0], sb_err );
return 1;
}
@@ -374,10 +410,6 @@ static int builtin_commandline( wchar_t **argv )
BUILTIN_ERR_MISSING,
argv[0] );
sb_append2( sb_err,
parser_current_line(),
L"\n",
(void *)0 );
builtin_print_help( argv[0], sb_err );
return 1;
}
@@ -386,7 +418,6 @@ static int builtin_commandline( wchar_t **argv )
wint_t c = input_get_code( argv[i] );
if( c != -1 )
{
// fwprintf( stderr, L"Add function %ls (%d)\n", argv[i], c );
/*
input_unreadch inserts the specified keypress or
readline function at the top of the stack of unused
@@ -396,15 +427,10 @@ static int builtin_commandline( wchar_t **argv )
}
else
{
// fwprintf( stderr, L"BLUR %ls %d\n", argv[i], c );
sb_append2( sb_err,
argv[0],
L": Unknown readline function '",
argv[i],
L"'\n",
parser_current_line(),
L"\n",
(void *)0 );
sb_printf( sb_err,
_(L"%ls: Unknown readline function '%ls'\n"),
argv[0],
argv[i] );
builtin_print_help( argv[0], sb_err );
return 1;
}
@@ -416,7 +442,7 @@ static int builtin_commandline( wchar_t **argv )
/*
Check for invalid switch combinations
*/
if( argc-woptind > 1 )
if( cursor_mode && (argc-woptind > 1) )
{
sb_append2( sb_err,
@@ -427,9 +453,19 @@ static int builtin_commandline( wchar_t **argv )
return 1;
}
if( (buffer_part || tokenize || cut_at_cursor) && cursor_mode )
{
sb_printf( sb_err,
BUILTIN_ERR_COMBO,
argv[0] );
builtin_print_help( argv[0], sb_err );
return 1;
}
if( (tokenize || cut_at_cursor) && (argc-woptind) )
{
sb_printf( sb_err,
BUILTIN_ERR_COMBO2,
argv[0],
@@ -463,14 +499,44 @@ static int builtin_commandline( wchar_t **argv )
{
buffer_part = STRING_MODE;
}
if( cursor_mode )
{
if( argc-woptind )
{
wchar_t *endptr;
int new_pos;
errno = 0;
new_pos = wcstol( argv[woptind], &endptr, 10 );
if( *endptr || errno )
{
sb_printf( sb_err,
BUILTIN_ERR_NOT_NUMBER,
argv[0],
argv[woptind] );
builtin_print_help( argv[0], sb_err );
}
current_buffer = reader_get_buffer();
new_pos = maxi( 0, mini( new_pos, wcslen( current_buffer ) ) );
reader_set_buffer( current_buffer, new_pos );
return 0;
}
else
{
sb_printf( sb_out, L"%d\n", reader_get_cursor_pos() );
return 0;
}
wchar_t *begin, *end;
}
switch( buffer_part )
{
case STRING_MODE:
{
begin = (wchar_t *)get_buffer();
begin = get_buffer();
end = begin+wcslen(begin);
break;
}
@@ -516,7 +582,28 @@ static int builtin_commandline( wchar_t **argv )
case 1:
{
replace_part( begin, end, argv[woptind], append_mode );
break;
break;
}
default:
{
string_buffer_t sb;
int i;
sb_init( &sb );
sb_append( &sb, argv[woptind] );
for( i=woptind+1; i<argc; i++ )
{
sb_append( &sb, L"\n" );
sb_append( &sb, argv[i] );
}
replace_part( begin, end, (wchar_t *)sb.buff, append_mode );
sb_destroy( &sb );
break;
}
}

View File

@@ -3,6 +3,8 @@
Functions used for implementing the complete builtin.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -11,8 +13,6 @@ Functions used for implementing the complete builtin.
#include <termios.h>
#include <signal.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
@@ -23,7 +23,7 @@ Functions used for implementing the complete builtin.
#include "wgetopt.h"
#include "parser.h"
#include "reader.h"
#include "translate.h"
/**
Internal storage for the builtin_get_temporary_buffer() function.
@@ -48,7 +48,6 @@ static void builtin_complete_add2( const wchar_t *cmd,
array_list_t *gnu_opt,
array_list_t *old_opt,
int result_mode,
int authorative,
const wchar_t *condition,
const wchar_t *comp,
const wchar_t *desc )
@@ -64,7 +63,6 @@ static void builtin_complete_add2( const wchar_t *cmd,
0,
0,
result_mode,
authorative,
condition,
comp,
desc );
@@ -78,7 +76,6 @@ static void builtin_complete_add2( const wchar_t *cmd,
(wchar_t *)al_get(gnu_opt, i ),
0,
result_mode,
authorative,
condition,
comp,
desc );
@@ -92,7 +89,6 @@ static void builtin_complete_add2( const wchar_t *cmd,
(wchar_t *)al_get(old_opt, i ),
1,
result_mode,
authorative,
condition,
comp,
desc );
@@ -106,7 +102,6 @@ static void builtin_complete_add2( const wchar_t *cmd,
0,
0,
result_mode,
authorative,
condition,
comp,
desc );
@@ -137,10 +132,17 @@ static void builtin_complete_add( array_list_t *cmd,
gnu_opt,
old_opt,
result_mode,
authorative,
condition,
comp,
desc );
if( authorative != -1 )
{
complete_set_authorative( al_get( cmd, i ),
COMMAND,
authorative );
}
}
for( i=0; i<al_get_count( path ); i++ )
@@ -151,12 +153,18 @@ static void builtin_complete_add( array_list_t *cmd,
gnu_opt,
old_opt,
result_mode,
authorative,
condition,
comp,
desc );
}
if( authorative != -1 )
{
complete_set_authorative( al_get( path, i ),
PATH,
authorative );
}
}
}
/**
@@ -278,7 +286,7 @@ static int builtin_complete( wchar_t **argv )
int argc=0;
int result_mode=SHARED;
int remove = 0;
int authorative = 1;
int authorative = -1;
string_buffer_t short_opt;
array_list_t gnu_opt, old_opt;
@@ -359,12 +367,16 @@ static int builtin_complete( wchar_t **argv )
L"unauthorative", no_argument, 0, 'u'
}
,
{
L"authorative", no_argument, 0, 'A'
}
,
{
L"condition", required_argument, 0, 'n'
}
,
{
L"do-complete", required_argument, 0, 'C'
L"do-complete", optional_argument, 0, 'C'
}
,
{
@@ -381,7 +393,7 @@ static int builtin_complete( wchar_t **argv )
int opt = wgetopt_long( argc,
argv,
L"a:c:p:s:l:o:d:frxeun:C::h",
L"a:c:p:s:l:o:d:frxeuAn:C::h",
long_options,
&opt_index );
if( opt == -1 )
@@ -396,9 +408,6 @@ static int builtin_complete( wchar_t **argv )
BUILTIN_ERR_UNKNOWN,
argv[0],
long_options[opt_index].name );
sb_append( sb_err,
parser_current_line() );
builtin_print_help( argv[0], sb_err );
@@ -441,6 +450,10 @@ static int builtin_complete( wchar_t **argv )
authorative=0;
break;
case 'A':
authorative=1;
break;
case 's':
sb_append( &short_opt, woptarg );
break;
@@ -474,10 +487,7 @@ static int builtin_complete( wchar_t **argv )
return 0;
case '?':
sb_append( sb_err,
parser_current_line() );
builtin_print_help( argv[0], sb_err );
builtin_unknown_option( argv[0], argv[woptind-1] );
res = 1;
break;
@@ -489,14 +499,14 @@ static int builtin_complete( wchar_t **argv )
{
if( condition && wcslen( condition ) )
{
if( parser_test( condition, 0, 0 ) )
if( parser_test( condition, 0, 0, 0 ) )
{
sb_printf( sb_err,
L"%ls: Condition '%ls' contained a syntax error\n",
argv[0],
condition );
parser_test( condition, sb_err, argv[0] );
parser_test( condition, 0, sb_err, argv[0] );
res = 1;
}
@@ -561,8 +571,6 @@ static int builtin_complete( wchar_t **argv )
sb_printf( sb_err,
_( L"%ls: Too many arguments\n" ),
argv[0] );
sb_append( sb_err,
parser_current_line() );
builtin_print_help( argv[0], sb_err );
res = 1;

View File

@@ -1,44 +0,0 @@
/** \file builtin_help.c
Functions for printing usage information of builtin commands. This
file is automatically generated from the file builtin_help.hdr and
various help files in the doc_src directory.
*/
#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <wchar.h>
#include <sys/types.h>
#include "config.h"
#include "util.h"
#include "common.h"
#include "halloc_util.h"
/**
Hashtable storing the help text
*/
static hash_table_t tbl;
static void builtin_help_init();
char *builtin_help_get( const wchar_t *cmd )
{
builtin_help_init();
return (char *)hash_get( &tbl, (void *)cmd );
}
/**
Initialize help hash table. Don't invoke it manually,
it is called by builtin_help_get automatically.
*/
static void builtin_help_init()
{
static int is_help_init = 0;
if( is_help_init )
return;
is_help_init=1;
halloc_register_function( global_context, (void (*)(void *))&hash_destroy, &tbl );
hash_init( &tbl, &hash_wcs_func, &hash_wcs_cmp );

View File

@@ -1,6 +1,7 @@
/** \file builtin_jobs.c
Functions for executing the jobs builtin.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
@@ -13,8 +14,6 @@
#include <string.h>
#include <wctype.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
@@ -24,7 +23,7 @@
#include "parser.h"
#include "common.h"
#include "wgetopt.h"
#include "translate.h"
/**
Print modes for the jobs builtin
@@ -223,8 +222,6 @@ static int builtin_jobs( wchar_t **argv )
argv[0],
long_options[opt_index].name );
sb_append( sb_err,
parser_current_line() );
builtin_print_help( argv[0], sb_err );
@@ -254,8 +251,7 @@ static int builtin_jobs( wchar_t **argv )
return 0;
case '?':
builtin_print_help( argv[0], sb_err );
builtin_unknown_option( argv[0], argv[woptind-1] );
return 1;
}
@@ -277,7 +273,7 @@ static int builtin_jobs( wchar_t **argv )
*/
for( j=first_job; j; j=j->next )
{
if( j->constructed && !job_is_completed(j) )
if( (j->flags & JOB_CONSTRUCTED) && !job_is_completed(j) )
{
builtin_jobs_print( j, mode, !found );
return 0;
@@ -331,7 +327,7 @@ static int builtin_jobs( wchar_t **argv )
/*
Ignore unconstructed jobs, i.e. ourself.
*/
if( j->constructed && !job_is_completed(j) )
if( (j->flags & JOB_CONSTRUCTED) && !job_is_completed(j) )
{
builtin_jobs_print( j, mode, !found );
found = 1;

View File

@@ -3,6 +3,8 @@
Functions used for implementing the set builtin.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -11,8 +13,6 @@ Functions used for implementing the set builtin.
#include <termios.h>
#include <signal.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
@@ -24,7 +24,7 @@ Functions used for implementing the set builtin.
#include "wgetopt.h"
#include "proc.h"
#include "parser.h"
#include "translate.h"
/**
Error message for invalid path operations
@@ -81,7 +81,7 @@ static int my_env_set( const wchar_t *key, array_list_t *val, int scope )
show_perror = 1;
}
if( !( S_IFDIR & buff.st_mode ) )
if( !( S_ISDIR(buff.st_mode) ) )
{
error = 1;
@@ -141,7 +141,8 @@ static int my_env_set( const wchar_t *key, array_list_t *val, int scope )
{
for( i=0; i<al_get_count( val ); i++ )
{
sb_append( &sb, (wchar_t *)al_get( val, i ) );
wchar_t *next =(wchar_t *)al_get( val, i );
sb_append( &sb, next?next:L"" );
if( i<al_get_count( val )-1 )
{
sb_append( &sb, ARRAY_SEP_STR );
@@ -232,10 +233,14 @@ static int parse_index( array_list_t *indexes,
while (*src != L']')
{
wchar_t *end;
long l_ind = wcstol(src, &end, 10);
int *ind;
if (end == src)
long l_ind;
errno = 0;
l_ind = wcstol(src, &end, 10);
if( end==src || errno )
{
sb_printf(sb_err, _(L"%ls: Invalid index starting at '%ls'\n"), L"set", src);
return 0;
@@ -246,9 +251,7 @@ static int parse_index( array_list_t *indexes,
l_ind = var_count+l_ind+1;
}
ind = (int *) calloc(1, sizeof(int));
*ind = (int) l_ind;
al_push(indexes, ind);
al_push_long(indexes, l_ind);
src = end;
count++;
while (iswspace(*src)) src++;
@@ -275,9 +278,13 @@ static int update_values( array_list_t *list,
/* Replace values where needed */
for( i = 0; i < al_get_count(indexes); i++ )
{
int ind = *(int *) al_get(indexes, i) - 1;
/*
The '- 1' below is because the indices in fish are
one-based, but the array_list_t uses zero-based indices
*/
long ind = al_get_long(indexes, i) - 1;
void *new = (void *) al_get(values, i);
if( ind <= 0 )
if( ind < 0 )
{
return 1;
}
@@ -291,18 +298,18 @@ static int update_values( array_list_t *list,
/**
Return 1 if an array list of int* pointers contains the specified
Return 1 if an array list of longs contains the specified
value, 0 otherwise
*/
static int al_contains_int( array_list_t *list,
int val)
static int al_contains_long( array_list_t *list,
long val)
{
int i;
for (i = 0; i < al_get_count(list); i++)
{
int *current = (int *) al_get(list, i);
if( current != 0 && *current == val )
long current = al_get_long(list, i);
if( current != 0 && current == val )
{
return 1;
}
@@ -317,20 +324,20 @@ static int al_contains_int( array_list_t *list,
*/
static void erase_values(array_list_t *list, array_list_t *indexes)
{
int i;
long i;
array_list_t result;
al_init(&result);
for (i = 0; i < al_get_count(list); i++)
{
if (!al_contains_int(indexes, i + 1))
if (!al_contains_long(indexes, i + 1))
{
al_push(&result, al_get(list, i));
}
else
{
free((void *) al_get(list, i));
free( (void *)al_get(list, i));
}
}
@@ -357,7 +364,7 @@ static void print_variables(int include_values, int esc, int scope)
for( i = 0; i < al_get_count(&names); i++ )
{
wchar_t *key = (wchar_t *)al_get( &names, i );
wchar_t *e_key = esc ? escape(key, 1) : wcsdup(key);
wchar_t *e_key = esc ? escape(key, 0) : wcsdup(key);
sb_append(sb_out, e_key);
@@ -365,9 +372,32 @@ static void print_variables(int include_values, int esc, int scope)
{
wchar_t *value = env_get(key);
wchar_t *e_value;
e_value = esc ? expand_escape_variable(value) : wcsdup(value);
sb_append2(sb_out, L" ", e_value, (void *)0);
free(e_value);
if( value )
{
int shorten = 0;
if( wcslen( value ) > 64 )
{
shorten = 1;
value = wcsndup( value, 60 );
if( !value )
{
DIE_MEM();
}
}
e_value = esc ? expand_escape_variable(value) : wcsdup(value);
sb_append2(sb_out, L" ", e_value, (void *)0);
free(e_value);
if( shorten )
{
sb_append(sb_out, L"\u2026");
free( value );
}
}
}
sb_append(sb_out, L"\n");
@@ -454,6 +484,8 @@ static int builtin_set( wchar_t **argv )
int slice=0;
int i;
wchar_t *bad_char;
/* Parse options to obtain the requested operation and the modifiers */
woptind = 0;
@@ -508,7 +540,7 @@ static int builtin_set( wchar_t **argv )
return 0;
case '?':
builtin_print_help( argv[0], sb_err );
builtin_unknown_option( argv[0], argv[woptind-1] );
return 1;
default:
@@ -528,9 +560,8 @@ static int builtin_set( wchar_t **argv )
if( query && (erase || list || global || local || universal || export || unexport ) )
{
sb_printf(sb_err,
BUILTIN_ERR_COMBO2,
argv[0],
parser_current_line() );
BUILTIN_ERR_COMBO,
argv[0] );
builtin_print_help( argv[0], sb_err );
return 1;
@@ -541,9 +572,8 @@ static int builtin_set( wchar_t **argv )
if( erase && list )
{
sb_printf(sb_err,
BUILTIN_ERR_COMBO2,
argv[0],
parser_current_line() );
BUILTIN_ERR_COMBO,
argv[0] );
builtin_print_help( argv[0], sb_err );
return 1;
@@ -556,8 +586,7 @@ static int builtin_set( wchar_t **argv )
{
sb_printf( sb_err,
BUILTIN_ERR_GLOCAL,
argv[0],
parser_current_line() );
argv[0] );
builtin_print_help( argv[0], sb_err );
return 1;
}
@@ -569,8 +598,7 @@ static int builtin_set( wchar_t **argv )
{
sb_printf( sb_err,
BUILTIN_ERR_EXPUNEXP,
argv[0],
parser_current_line() );
argv[0] );
builtin_print_help( argv[0], sb_err );
return 1;
}
@@ -589,15 +617,67 @@ static int builtin_set( wchar_t **argv )
int i;
for( i=woptind; i<argc; i++ )
{
if( !env_exist( argv[i], scope ) )
wchar_t *arg = argv[i];
int slice=0;
if( !(dest = wcsdup(arg)))
{
retcode++;
DIE_MEM();
}
if( wcschr( dest, L'[' ) )
{
slice = 1;
*wcschr( dest, L'[' )=0;
}
if( slice )
{
array_list_t indexes;
array_list_t result;
int j;
al_init( &result );
al_init( &indexes );
tokenize_variable_array( env_get( dest ), &result );
if( !parse_index( &indexes, arg, dest, al_get_count( &result ) ) )
{
builtin_print_help( argv[0], sb_err );
retcode = 1;
break;
}
for( j=0; j<al_get_count( &indexes ); j++ )
{
long idx = al_get_long( &indexes, j );
if( idx < 1 || idx > al_get_count( &result ) )
{
retcode++;
}
}
}
else
{
if( !env_exist( arg, scope ) )
{
retcode++;
}
}
free( dest );
}
return retcode;
}
if( list )
{
/* Maybe we should issue an error if there are any other arguments? */
print_variables(0, 0, scope);
return 0;
}
if( woptind == argc )
{
/*
@@ -608,8 +688,7 @@ static int builtin_set( wchar_t **argv )
{
sb_printf( sb_err,
_(L"%ls: Erase needs a variable name\n%ls\n"),
argv[0],
parser_current_line() );
argv[0] );
builtin_print_help( argv[0], sb_err );
retcode = 1;
@@ -622,13 +701,6 @@ static int builtin_set( wchar_t **argv )
return retcode;
}
if( list )
{
/* Maybe we should issue an error if there are any other arguments? */
print_variables(0, 0, scope);
return 0;
}
if( !(dest = wcsdup(argv[woptind])))
{
DIE_MEM();
@@ -647,7 +719,15 @@ static int builtin_set( wchar_t **argv )
builtin_print_help( argv[0], sb_err );
return 1;
}
if( (bad_char = wcsvarname( dest ) ) )
{
sb_printf( sb_err, BUILTIN_ERR_VARCHAR, argv[0], *bad_char );
builtin_print_help( argv[0], sb_err );
free( dest );
return 1;
}
if( slice && erase && (scope != ENV_USER) )
{
free( dest );
@@ -675,9 +755,9 @@ static int builtin_set( wchar_t **argv )
al_init(&values);
al_init(&indexes);
al_init(&result);
tokenize_variable_array( env_get(dest), &result );
for( ; woptind<argc; woptind++ )
{
if( !parse_index( &indexes, argv[woptind], dest, al_get_count( &result ) ) )
@@ -749,7 +829,6 @@ static int builtin_set( wchar_t **argv )
al_foreach( &result, &free );
al_destroy( &result );
al_foreach( &indexes, &free );
al_destroy(&indexes);
al_destroy(&values);
@@ -766,9 +845,8 @@ static int builtin_set( wchar_t **argv )
if( woptind != argc )
{
sb_printf( sb_err,
_(L"%ls: Values cannot be specfied with erase\n%ls\n"),
argv[0],
parser_current_line() );
_(L"%ls: Values cannot be specfied with erase\n"),
argv[0] );
builtin_print_help( argv[0], sb_err );
retcode=1;
}

View File

@@ -20,7 +20,7 @@ Functions used for implementing the ulimit builtin.
#include "builtin.h"
#include "common.h"
#include "wgetopt.h"
#include "translate.h"
/**
Struct describing a resource limit
@@ -123,7 +123,9 @@ static int get_multiplier( int what )
}
/**
Return the value for the specified resource limit
Return the value for the specified resource limit. This function
does _not_ multiply the limit value by the multiplier constant used
by the commandline ulimit.
*/
static rlim_t get( int resource, int hard )
{
@@ -144,7 +146,7 @@ static void print( int resource, int hard )
if( l == RLIM_INFINITY )
sb_append( sb_out, L"unlimited\n" );
else
sb_printf( sb_out, L"%d\n", l );
sb_printf( sb_out, L"%d\n", l / get_multiplier( resource ) );
}
@@ -178,10 +180,15 @@ static void print_all( int hard )
resource_arr[i].switch_char);
if( l == RLIM_INFINITY )
{
sb_append( sb_out, L"unlimited\n" );
}
else
sb_printf( sb_out, L"%d\n", l );
{
sb_printf( sb_out, L"%d\n", l/get_multiplier(resource_arr[i].resource) );
}
}
}
/**
@@ -202,14 +209,14 @@ static const wchar_t *get_desc( int what )
}
/**
Set the new value of the specified resource limit
Set the new value of the specified resource limit. This function
does _not_ multiply the limit value by the multiplier constant used
by the commandline ulimit.
*/
static int set( int resource, int hard, int soft, rlim_t value )
{
struct rlimit ls;
getrlimit( resource, &ls );
if( value != RLIM_INFINITY )
value *= get_multiplier( resource );
if( hard )
{
@@ -241,22 +248,6 @@ static int set( int resource, int hard, int soft, rlim_t value )
return 0;
}
/**
Set all resource limits
*/
static int set_all( int hard, int soft, rlim_t value )
{
int i;
int res=0;
for( i=0; resource_arr[i].desc; i++ )
{
if( set( resource_arr[i].resource, hard, soft, value ) )
res = 1;
}
return res;
}
/**
The ulimit builtin, used for setting resource limits. Defined in
builtin_ulimit.c.
@@ -315,7 +306,7 @@ static int builtin_ulimit( wchar_t ** argv )
}
,
{
L"pipe-size", no_argument, 0, 'p'
L"stack-size", no_argument, 0, 's'
}
,
{
@@ -345,7 +336,7 @@ static int builtin_ulimit( wchar_t ** argv )
int opt = wgetopt_long( argc,
argv,
L"aHScdflmnptuvh",
L"aHScdflmnstuvh",
long_options,
&opt_index );
if( opt == -1 )
@@ -428,28 +419,41 @@ static int builtin_ulimit( wchar_t ** argv )
return 0;
case L'?':
builtin_print_help( argv[0], sb_err );
builtin_unknown_option( argv[0], argv[woptind-1] );
return 1;
}
}
if( report_all )
{
if( argc - woptind == 0 )
{
print_all( hard );
}
else
{
sb_append2( sb_err,
argv[0],
L": Too many arguments\n",
(void *)0 );
builtin_print_help( argv[0], sb_err );
return 1;
}
return 0;
}
switch( argc - woptind )
{
case 0:
{
/*
Show current limit value
*/
if( report_all )
{
print_all( hard );
}
else
{
print( what, hard );
}
print( what, hard );
break;
}
case 1:
{
/*
@@ -457,7 +461,7 @@ static int builtin_ulimit( wchar_t ** argv )
*/
rlim_t new_limit;
wchar_t *end;
/*
Set both hard and soft limits if nothing else was specified
*/
@@ -466,7 +470,6 @@ static int builtin_ulimit( wchar_t ** argv )
hard=soft=1;
}
if( wcscasecmp( argv[woptind], L"unlimited" )==0)
{
new_limit = RLIM_INFINITY;
@@ -492,30 +495,22 @@ static int builtin_ulimit( wchar_t ** argv )
builtin_print_help( argv[0], sb_err );
return 1;
}
new_limit *= get_multiplier( what );
}
if( report_all )
{
return set_all( hard, soft, new_limit );
}
else
{
return set( what, hard, soft, new_limit );
}
break;
return set( what, hard, soft, new_limit );
}
default:
{
sb_append2( sb_err,
argv[0],
L": Too many arguments\n",
(void *)0 );
builtin_print_help( argv[0], sb_err );
return 1;
break;
}
}
return 0;
}

349
common.c
View File

@@ -7,6 +7,16 @@ parts of fish.
#include "config.h"
#include <unistd.h>
#ifdef HAVE_STROPTS_H
#include <stropts.h>
#endif
#ifdef HAVE_SIGINFO_H
#include <siginfo.h>
#endif
#include <stdlib.h>
#include <termios.h>
#include <wchar.h>
@@ -14,7 +24,15 @@ parts of fish.
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#ifdef HAVE_SYS_TERMIOS_H
#include <sys/termios.h>
#endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
#include <sys/stat.h>
#include <unistd.h>
#include <wctype.h>
@@ -26,6 +44,10 @@ parts of fish.
#include <sys/time.h>
#include <fcntl.h>
#ifdef HAVE_EXECINFO_H
#include <execinfo.h>
#endif
#ifndef HOST_NAME_MAX
/**
Maximum length of hostname return. It is ok if this is too short,
@@ -92,6 +114,28 @@ static struct winsize termsize;
*/
static string_buffer_t *setlocale_buff=0;
void show_stackframe()
{
void *trace[32];
char **messages = (char **)NULL;
int i, trace_size = 0;
trace_size = backtrace(trace, 32);
messages = backtrace_symbols(trace, trace_size);
if( messages )
{
debug( 0, L"Backtrace:" );
for( i=0; i<trace_size; i++ )
{
fwprintf( stderr, L"%s\n", messages[i]);
}
free( messages );
}
}
wchar_t **list_to_char_arr( array_list_t *l )
{
wchar_t ** res = malloc( sizeof(wchar_t *)*(al_get_count( l )+1) );
@@ -139,8 +183,6 @@ int fgetws2( wchar_t **b, int *len, FILE *f )
if( errno == EILSEQ )
{
getc( f );
continue;
}
@@ -278,7 +320,10 @@ char *wcs2str_internal( const wchar_t *in, char *out )
while( in[in_pos] )
{
if( ( in[in_pos] >= ENCODE_DIRECT_BASE) &&
if( in[in_pos] == INTERNAL_SEPARATOR )
{
}
else if( ( in[in_pos] >= ENCODE_DIRECT_BASE) &&
( in[in_pos] < ENCODE_DIRECT_BASE+256) )
{
out[out_pos++] = in[in_pos]- ENCODE_DIRECT_BASE;
@@ -289,7 +334,7 @@ char *wcs2str_internal( const wchar_t *in, char *out )
if( res == (size_t)(-1) )
{
debug( 1, L"Wide character has no narrow representation" );
debug( 1, L"Wide character %d has no narrow representation", in[in_pos] );
memset( &state, 0, sizeof(state) );
}
else
@@ -387,19 +432,25 @@ wchar_t **strv2wcsv( const char **in )
}
wchar_t *wcsvarname( wchar_t *str )
wchar_t *wcsvarname( const wchar_t *str )
{
while( *str )
{
if( (!iswalnum(*str)) && (*str != L'_' ) )
{
return str;
return (wchar_t *)str;
}
str++;
}
return 0;
}
wchar_t *wcsfuncname( const wchar_t *str )
{
return wcschr( str, L'/' );
}
int wcsvarchr( wchar_t chr )
{
return ( (iswalnum(chr)) || (chr == L'_' ));
@@ -521,14 +572,17 @@ int read_blocked(int fd, void *buf, size_t count)
void debug( int level, const wchar_t *msg, ... )
{
va_list va;
string_buffer_t sb;
string_buffer_t sb2;
int errno_old = errno;
CHECK( msg, );
if( level > debug_level )
return;
CHECK( msg, );
sb_init( &sb );
sb_init( &sb2 );
@@ -543,6 +597,8 @@ void debug( int level, const wchar_t *msg, ... )
sb_destroy( &sb );
sb_destroy( &sb2 );
errno = errno_old;
}
void write_screen( const wchar_t *msg, string_buffer_t *buff )
@@ -646,7 +702,7 @@ wchar_t *escape( const wchar_t *in,
if( !in )
{
debug( 0, L"%s called with null input", __func__ );
exit(1);
FATAL_EXIT();
}
out = malloc( sizeof(wchar_t)*(wcslen(in)*4 + 1));
@@ -722,7 +778,6 @@ wchar_t *escape( const wchar_t *in,
case L'*':
case L'|':
case L';':
case L':':
case L'\'':
case L'"':
case L'%':
@@ -760,7 +815,7 @@ wchar_t *escape( const wchar_t *in,
}
wchar_t *unescape( const wchar_t * orig, int unescape_special )
wchar_t *unescape( const wchar_t * orig, int flags )
{
int mode = 0;
@@ -769,7 +824,9 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
int bracket_count=0;
wchar_t prev=0;
wchar_t *in;
int unescape_special = flags & UNESCAPE_SPECIAL;
int allow_incomplete = flags & UNESCAPE_INCOMPLETE;
CHECK( orig, 0 );
len = wcslen( orig );
@@ -795,46 +852,25 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
{
switch( in[++in_pos] )
{
/*
A null character after a backslash is an
error, return null
*/
case L'\0':
{
free(in);
return 0;
if( !allow_incomplete )
{
free(in);
return 0;
}
}
/*
Numeric escape sequences. No prefix means
octal escape, otherwise hexadecimal.
*/
case L'n':
{
in[out_pos]=L'\n';
break;
}
case L'r':
{
in[out_pos]=L'\r';
break;
}
case L't':
{
in[out_pos]=L'\t';
break;
}
case L'b':
{
in[out_pos]=L'\b';
break;
}
case L'e':
{
in[out_pos]=L'\e';
break;
}
case L'u':
case L'U':
case L'x':
case L'X':
case L'0':
case L'1':
case L'2':
@@ -843,6 +879,10 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
case L'5':
case L'6':
case L'7':
case L'u':
case L'U':
case L'x':
case L'X':
{
int i;
long long res=0;
@@ -915,8 +955,107 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
break;
}
/*
\a means bell (alert)
*/
case L'a':
{
in[out_pos]=L'\a';
break;
}
/*
\b means backspace
*/
case L'b':
{
in[out_pos]=L'\b';
break;
}
/*
\cX means control sequence X
*/
case L'c':
{
in_pos++;
if( in[in_pos] >= L'a' &&
in[in_pos] <= (L'a'+32) )
{
in[out_pos]=in[in_pos]-L'a'+1;
}
else if( in[in_pos] >= L'A' &&
in[in_pos] <= (L'A'+32) )
{
in[out_pos]=in[in_pos]-L'A'+1;
}
else
{
free(in);
return 0;
}
break;
}
/*
\e means escape
*/
case L'e':
{
in[out_pos]=L'\x1b';
break;
}
/*
\f means form feed
*/
case L'f':
{
in[out_pos]=L'\f';
break;
}
/*
\n means newline
*/
case L'n':
{
in[out_pos]=L'\n';
break;
}
/*
\r means carriage return
*/
case L'r':
{
in[out_pos]=L'\r';
break;
}
/*
\t means tab
*/
case L't':
{
in[out_pos]=L'\t';
break;
}
/*
\v means vetrical tab
*/
case L'v':
{
in[out_pos]=L'\v';
break;
}
default:
{
if( unescape_special )
in[out_pos++] = INTERNAL_SEPARATOR;
in[out_pos]=in[in_pos];
break;
}
@@ -924,7 +1063,8 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
}
else
{
switch( in[in_pos]){
switch( in[in_pos])
{
case L'~':
{
if( unescape_special && (in_pos == 0) )
@@ -1040,14 +1180,20 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
case L'\'':
{
mode = 1;
in[out_pos] = INTERNAL_SEPARATOR;
if( unescape_special )
in[out_pos] = INTERNAL_SEPARATOR;
else
out_pos--;
break;
}
case L'\"':
{
mode = 2;
in[out_pos] = INTERNAL_SEPARATOR;
if( unescape_special )
in[out_pos] = INTERNAL_SEPARATOR;
else
out_pos--;
break;
}
@@ -1072,6 +1218,7 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
{
case '\\':
case L'\'':
case L'\n':
{
in[out_pos]=in[in_pos];
break;
@@ -1079,8 +1226,13 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
case 0:
{
free(in);
return 0;
if( !allow_incomplete )
{
free(in);
return 0;
}
else
out_pos--;
}
default:
@@ -1093,7 +1245,10 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
}
if( c == L'\'' )
{
in[out_pos] = INTERNAL_SEPARATOR;
if( unescape_special )
in[out_pos] = INTERNAL_SEPARATOR;
else
out_pos--;
mode = 0;
}
else
@@ -1114,7 +1269,10 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
case '"':
{
mode = 0;
in[out_pos] = INTERNAL_SEPARATOR;
if( unescape_special )
in[out_pos] = INTERNAL_SEPARATOR;
else
out_pos--;
break;
}
@@ -1124,13 +1282,19 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
{
case L'\0':
{
free(in);
return 0;
if( !allow_incomplete )
{
free(in);
return 0;
}
else
out_pos--;
}
case '\\':
case L'$':
case '"':
case '\n':
{
in[out_pos]=in[in_pos];
break;
@@ -1170,6 +1334,13 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
}
}
}
if( !allow_incomplete && mode )
{
free( in );
return 0;
}
in[out_pos]=L'\0';
return in;
}
@@ -1402,10 +1573,15 @@ int acquire_lock_file( const char *lockfile, const int timeout, int force )
void common_handle_winch( int signal )
{
#ifdef HAVE_WINSIZE
if (ioctl(1,TIOCGWINSZ,&termsize)!=0)
{
return;
}
#else
termsize.ws_col = 80;
termsize.ws_row = 24;
#endif
}
int common_get_width()
@@ -1425,6 +1601,7 @@ void tokenize_variable_array( const wchar_t *val, array_list_t *out )
{
wchar_t *cpy = wcsdup( val );
wchar_t *pos, *start;
wchar_t *next;
if( !cpy )
{
@@ -1435,13 +1612,67 @@ void tokenize_variable_array( const wchar_t *val, array_list_t *out )
{
if( *pos == ARRAY_SEP )
{
*pos=0;
al_push( out, start==cpy?cpy:wcsdup(start) );
next = start==cpy?cpy:wcsdup(start);
if( !next )
DIE_MEM();
al_push( out, next );
start=pos+1;
}
}
al_push( out, start==cpy?cpy:wcsdup(start) );
next = start==cpy?cpy:wcsdup(start);
if( !next )
DIE_MEM();
al_push( out, next );
}
}
int create_directory( wchar_t *d )
{
int ok = 0;
struct stat buf;
int stat_res = 0;
while( (stat_res = wstat(d, &buf ) ) != 0 )
{
if( errno != EAGAIN )
break;
}
if( stat_res == 0 )
{
if( S_ISDIR( buf.st_mode ) )
{
ok = 1;
}
}
else
{
if( errno == ENOENT )
{
wchar_t *dir = wcsdup( d );
dir = wdirname( dir );
if( !create_directory( dir ) )
{
if( !wmkdir( d, 0700 ) )
{
ok = 1;
}
}
free(dir);
}
}
return ok?0:-1;
}
void bugreport()
{
debug( 1,
_( L"This is a bug. "
L"If you can reproduce it, please send a bug report to %s." ),
PACKAGE_BUGREPORT );
}

114
common.h
View File

@@ -40,6 +40,10 @@
*/
#define BYTE_MAX 0xffu
#define UNESCAPE_SPECIAL 1
#define UNESCAPE_INCOMPLETE 2
/**
Save the shell mode on startup so we can restore them on exit
*/
@@ -52,7 +56,8 @@ extern struct termios shell_modes;
extern wchar_t ellipsis_char;
/**
The verbosity of fish
The verbosity level of fish. If a call to debug has a severity
level higher than \c debug_level, it will not be printed.
*/
extern int debug_level;
@@ -71,37 +76,79 @@ extern wchar_t *program_name;
This macro is used to check that an input argument is not null. It
is a bit lika a non-fatal form of assert. Instead of exit-ing on
failiure, the current function is ended at once. The second
parameter is the exit status of the current function on failiure.
parameter is the return value of the current function on failiure.
*/
#define CHECK( arg, retval ) \
#define CHECK( arg, retval ) \
if( !(arg) ) \
{ \
debug( 1, \
L"function %s called with null value for argument %s. " \
L"This is a bug. " \
L"If you can reproduce it, please send a bug report to %s.", \
debug( 0, \
_( L"function %s called with null value for argument %s. " ), \
__func__, \
#arg, \
PACKAGE_BUGREPORT ); \
#arg ); \
bugreport(); \
show_stackframe(); \
return retval; \
} \
}
/**
Pause for input, then exit the program. If supported, print a backtrace first.
*/
#define FATAL_EXIT() \
{ \
char c; \
show_stackframe(); \
read( 0, &c, 1 ); \
exit( 1 ); \
} \
/**
Exit program at once, leaving an error message about running out of memory
Exit program at once, leaving an error message about running out of memory.
*/
#define DIE_MEM() \
#define DIE_MEM() \
{ \
fwprintf( stderr, L"fish: Out of memory on line %d of file %s, shutting down fish\n", __LINE__, __FILE__ ); \
exit(1); \
} \
fwprintf( stderr, \
L"fish: Out of memory on line %d of file %s, shutting down fish\n", \
__LINE__, \
__FILE__ ); \
FATAL_EXIT(); \
}
/**
Check if signals are blocked. If so, print an error message and
return from the function performing this check.
*/
#define CHECK_BLOCK( retval ) \
if( signal_is_blocked() ) \
{ \
debug( 0, \
_( L"function %s called while blocking signals. " ), \
__func__); \
bugreport(); \
show_stackframe(); \
return retval; \
}
/**
Shorthand for wgettext call
*/
#define _(wstr) wgettext(wstr)
/**
Noop, used to tell xgettext that a string should be translated,
even though it is not directly sent to wgettext.
*/
#define N_(wstr) wstr
/*
Print a stack trace to stderr
*/
void show_stackframe();
/**
Take an array_list_t containing wide strings and converts them to a
single null-terminated wchar_t **. The array is allocated using
halloc, and uses the \c context parameter as context. If \c context
is not noll, all elements of the \c array_list_t are also
registered to \c context using \c halloc_register().
malloc, and needs to be fred's by the caller.
*/
wchar_t **list_to_char_arr( array_list_t *l );
@@ -183,7 +230,7 @@ wchar_t *wcsdupcat( const wchar_t *a, const wchar_t *b );
Returns a newly allocated concatenation of the specified wide
character strings. The last argument must be a null pointer.
*/
wchar_t *wcsdupcat2( const wchar_t *a, ... );
__sentinel wchar_t *wcsdupcat2( const wchar_t *a, ... );
/**
Test if the given string is a valid variable name
@@ -196,7 +243,16 @@ wchar_t *wcsdupcat2( const wchar_t *a, ... );
\return null if this is a valid name, and a pointer to the first invalid character otherwise
*/
wchar_t *wcsvarname( wchar_t *str );
wchar_t *wcsvarname( const wchar_t *str );
/**
Test if the given string is a valid function name.
\return null if this is a valid name, and a pointer to the first invalid character otherwise
*/
wchar_t *wcsfuncname( const wchar_t *str );
/**
Test if the given string is valid in a variable name
@@ -246,7 +302,7 @@ const wchar_t *wsetlocale( int category, const wchar_t *locale );
\return zero is needle is not found, of if needle is null, non-zero otherwise
*/
int contains_str( const wchar_t *needle, ... );
__sentinel int contains_str( const wchar_t *needle, ... );
/**
Call read while blocking the SIGCHLD signal. Should only be called
@@ -259,6 +315,10 @@ int read_blocked(int fd, void *buf, size_t count);
Issue a debug message with printf-style string formating and
automatic line breaking. The string will begin with the string \c
program_name, followed by a colon and a whitespace.
Because debug is often called to tell the user about an error,
before using wperror to give a specific error message, debug will
never ever modify the value of errno.
\param level the priority of the message. Lower number means higher priority. Messages with a priority_number higher than \c debug_level will be ignored..
\param msg the message format string.
@@ -348,5 +408,17 @@ void write_screen( const wchar_t *msg, string_buffer_t *buff );
void tokenize_variable_array( const wchar_t *val, array_list_t *out );
/**
Make sure the specified direcotry exists. If no, try to create it.
\return 0 if the directory exists, -1 otherwise.
*/
int create_directory( wchar_t *d );
/**
Print a short message about how to file a bug report to stderr
*/
void bugreport();
#endif

1321
complete.c

File diff suppressed because it is too large Load Diff

View File

@@ -66,21 +66,12 @@
*/
#define PROG_COMPLETE_SEP L'\t'
/**
Initializes various structures used for tab-completion.
*/
void complete_init();
/**
Destroys various structures used for tab-completion and free()s the memory used by them.
*/
void complete_destroy();
/**
Add a completion.
Values are copied and should be freed by the caller.
All supplied values are copied, they should be freed by or otherwise
disposed by the caller.
Examples:
@@ -114,7 +105,6 @@ void complete_destroy();
file completion is not performed.
\param comp A space separated list of completions which may contain subshells.
\param desc A description of the completion.
\param authorative Whether there list of completions for this command is complete. If true, any options not matching one of the provided options will be flagged as an error by syntax highlighting.
\param condition a command to be run to check it this completion should be used. If \c condition is empty, the completion is always used.
*/
@@ -124,10 +114,17 @@ void complete_add( const wchar_t *cmd,
const wchar_t *long_opt,
int long_mode,
int result_mode,
int authorative,
const wchar_t *condition,
const wchar_t *comp,
const wchar_t *desc );
/**
Sets whether the completion list for this command is complete. If
true, any options not matching one of the provided options will be
flagged as an error by syntax highlighting.
*/
void complete_set_authorative( const wchar_t *cmd,
int cmd_type,
int authorative );
/**
Remove a previously defined completion

View File

@@ -1,7 +1,25 @@
# Process this file with autoconf to produce a configure script.
AC_INIT(fish,1.21.9,fish-users@lists.sf.net)
#
# This file is the main build configuration file for fish. It is used
# to determine your systems capabilities, and tries to adapt fish to
# take maximum advantage of the services your system offers.
#
# Process this file using the 'autoconf' command to produce a working
# configure script, which should in turn be executed in order to
# configure the build process.
#
AC_INIT(fish,1.22.3,fish-users@lists.sf.net)
#
# If needed, run autoconf to regenerate the configure file
#
# This makes sure that after running autoconf once to create the first
# version of configure, we never again need to worry about manually
# running autoconf to handle an updates configure.ac.
#
AC_MSG_CHECKING([if autoconf needs to be run])
if test configure -ot configure.ac; then
AC_MSG_RESULT([yes])
@@ -11,38 +29,55 @@ if test configure -ot configure.ac; then
AC_MSG_NOTICE([running autoconf])
if autoconf; then
./configure "$@"
exit
fi
exit
exit 1
else
AC_MSG_ERROR( [cannot find the autoconf program in your path.
AC_MSG_ERROR(
[cannot find the autoconf program in your path.
This program needs to be run whenever the configure.ac file is modified.
Please install it and try again.])
Please install it and try again.]
)
fi
else
AC_MSG_RESULT([no])
fi
#
# If needed, run autoheader to regenerate config.h.in
#
# This makes sure we never ever have to run autoheader manually. It
# will be run whenever needed automatically.
#
AC_MSG_CHECKING([if autoheader needs to be run])
if test ! -f ./config.h.in -o config.h.in -ot configure.ac; then
AC_MSG_RESULT([yes])
if which autoheader >/dev/null; then
AC_MSG_NOTICE([running autoheader])
autoheader
autoheader || exit 1
else
AC_MSG_ERROR( [cannot find the autoheader program in your path.
AC_MSG_ERROR(
[cannot find the autoheader program in your path.
This program needs to be run whenever the configure.ac file is modified.
Please install it and try again.])
Please install it and try again.]
)
fi
else
AC_MSG_RESULT([no])
fi
#
# Detect directories which may contain additional headers, libraries
# and commands. This needs to be done early - before Autoconf starts
# to mess with CFLAGS and all the other environemnt variables.
#
# This mostly helps OS X users, since fink usually installs out of
# tree and doesn't update CFLAGS.
#
for i in /usr/pkg /sw /opt /opt/local; do
AC_MSG_CHECKING([for $i/include include directory])
@@ -51,7 +86,7 @@ for i in /usr/pkg /sw /opt /opt/local; do
CPPFLAGS="$CPPFLAGS -I$i/include/"
CFLAGS="$CFLAGS -I$i/include/"
else
AC_MSG_RESULT(no)
AC_MSG_RESULT(no)
fi
AC_MSG_CHECKING([for $i/lib library directory])
@@ -59,7 +94,7 @@ for i in /usr/pkg /sw /opt /opt/local; do
AC_MSG_RESULT(yes)
LDFLAGS="$LDFLAGS -L$i/lib/ -R$i/lib/"
else
AC_MSG_RESULT(no)
AC_MSG_RESULT(no)
fi
AC_MSG_CHECKING([for $i/bin command directory])
@@ -67,76 +102,165 @@ for i in /usr/pkg /sw /opt /opt/local; do
AC_MSG_RESULT(yes)
optbindirs="$optbindirs $i/bin"
else
AC_MSG_RESULT(no)
AC_MSG_RESULT(no)
fi
done
AC_SUBST( optbindirs, $optbindirs )
#
# Tell autoconf to create config.h header
#
AC_CONFIG_HEADERS(config.h)
#
# This adds markup to the code that results in a few extra compile
# time checks on recent GCC versions. It helps stop a few common bugs.
#
AH_BOTTOM([#if __GNUC__ >= 3
#define __warn_unused __attribute__ ((warn_unused_result))
#define __sentinel __attribute__ ((sentinel))
#else
#define __warn_unused
#define __sentinel
#endif])
#
# Set up various programs needed for install
#
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
# Check for doxygen, which is needed to build
AC_CHECK_PROG( has_doxygen, [doxygen], "true")
if ! test "$has_doxygen" = "true"; then
AC_MSG_ERROR( [cannot find the Doxygen program in your path.
This program is needed to build fish.
Please install it and try again.])
fi
#
# Check for seq command. If missing, make sure fallback shellscript
# implementation is installed
# implementation is installed.
#
AC_CHECK_PROG( SEQ_FALLBACK, seq, [ ], [seq])
if test "$SEQ_FALLBACK"; then
#
# We already have seq. Check if the seq version is installed by an
# earlier fish version. If it is, we'll replace it.
#
file=`which seq`
if test -f "$file"; then
AC_MSG_CHECKING([if seq comes from a previous fish version])
shebang=`grep "\(^#!/.*/fish\|^#!/usr/bin/env fish\)" $file`
if test "$shebang"; then
AC_SUBST( SEQ_FALLBACK, seq )
AC_MSG_RESULT(yes, replace it)
else
AC_MSG_RESULT(no, keep it)
fi
fi
fi
#
# Optionally drop xsel command
AC_ARG_WITH( xsel,
AC_HELP_STRING([--without-xsel],
[do not build the xsel program needed for X clipboard integration]),
[xsel=$withval],
[xsel=with_xsel] )
#
AC_ARG_WITH(
xsel,
AC_HELP_STRING(
[--without-xsel],
[do not build the xsel program needed for X clipboard integration]
),
[xsel=$withval],
[xsel=with_xsel]
)
if [[ "$xsel" = "with_xsel" ]]; then
AC_SUBST( XSEL,[xsel-0.9.6/xsel])
AC_SUBST( XSEL_MAN,[xsel.1x])
AC_SUBST( XSEL_MAN_PATH,[xsel-0.9.6/xsel.1x])
AC_SUBST( XSEL,[xsel-0.9.6/xsel])
AC_SUBST( XSEL_MAN,[xsel.1x])
AC_SUBST( XSEL_MAN_PATH,[xsel-0.9.6/xsel.1x])
else
AC_SUBST( XSEL,[ ])
AC_SUBST( XSEL_MAN,[ ])
AC_SUBST( XSEL_MAN_PATH,[ ])
AC_SUBST( XSEL,[ ])
AC_SUBST( XSEL_MAN,[ ])
AC_SUBST( XSEL_MAN_PATH,[ ])
fi
#
# Optionally drop gettext support
#
AC_ARG_WITH(
gettext,
AC_HELP_STRING(
[--without-gettext],
[do not translate messages, even if gettext is available]
),
[local_gettext=$withval],
[local_gettext=yes]
)
if test x$local_gettext != xno; then
AC_DEFINE([USE_GETTEXT],[1],[Perform string translations with gettext])
fi
#
# Test if the compiler accepts the -std=c99 flag. If so, using it
# increases the odds of correct compilation, since we want to use the
# *wprintf functions, which where defined in C99.
# *wprintf functions, which where defined in C99.
#
XCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -std=c99"
XCPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS -std=c99"
AC_MSG_CHECKING(if -std=c99 works)
AC_CACHE_VAL(local_cv_has__std_c99,[
AC_TRY_RUN([
#include <stdlib.h>
#include <stdio.h>
int main() {
return 0;
}],
local_cv_has__std_c99=yes,
local_cv_has__std_c99=no,
)])
AC_CACHE_VAL(
local_cv_has__std_c99,
[
AC_TRY_RUN(
[
#include <stdlib.h>
#include <stdio.h>
int main()
{
return 0;
}
],
local_cv_has__std_c99=yes,
local_cv_has__std_c99=no,
)
]
)
#
# Try to enale large file support. This will make sure that on systems
# where off_t can be either 32 or 64 bit, the latter size is used. On
# other systems, this should do nothing. (Hopefully)
#
CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64"
AC_MSG_RESULT($local_cv_has__std_c99)
case x$local_cv_has__std_c99 in
xno) CFLAGS="$XCFLAGS" ;;
xno)
CFLAGS="$XCFLAGS"
CPPFLAGS="$XCPPFLAGS" ;;
esac
#
# If we are using gcc, set some flags that increase the odds of the
# compiler producing a working binary...
@@ -146,7 +270,7 @@ if test "$CC" = gcc; then
#
# -fno-optimize-sibling-calls seems to work around a bug where
# sending a SIGWINCH to fish on NetBSD causes fish to exit when
# sending a SIGWINCH to fish on NetBSD 3.0 causes fish to exit when
# compiled with GCC 3.3.3. This is probably either a compiler bug
# or a libc bug, but adding this flag seems to fix things for
# now. Long term, the real problem should be tracked down and
@@ -163,8 +287,15 @@ if test "$CC" = gcc; then
CFLAGS="$CFLAGS -Wall"
#
# This is needed in order to get the really cool backtraces
#
LDFLAGS="$LDFLAGS -rdynamic"
fi
#
# If we are compiling against glibc, set some flags to work around
# some rather stupid attempts to hide prototypes for *wprintf
@@ -173,16 +304,24 @@ fi
AC_MSG_CHECKING([if we are compiling against glibc])
AC_RUN_IFELSE(
[AC_LANG_PROGRAM([
#include <stdlib.h>
#ifdef __GLIBC__
#define STATUS 0
#else
#define STATUS 1
#endif],
[return STATUS;])],
[
AC_LANG_PROGRAM(
[
#include <stdlib.h>
#ifdef __GLIBC__
#define STATUS 0
#else
#define STATUS 1
#endif
],
[
return STATUS;
]
)
],
[glibc=yes],
[glibc=no] )
[glibc=no]
)
if test "$glibc" = yes; then
AC_MSG_RESULT(yes)
@@ -194,12 +333,13 @@ if test "$glibc" = yes; then
# fallback.h, in order to keep fish working on non-gnu platforms.
#
CFLAGS="$CFLAGS -D _GNU_SOURCE -D _ISOC99_SOURCE"
CFLAGS="$CFLAGS -D_GNU_SOURCE=1 -D_ISO99_SOURCE=1"
else
AC_MSG_RESULT(no)
fi
#
# Test cpu for special handling of ppc
#
# This is used to skip use of tputs on ppc systems, since it seemed to
@@ -209,147 +349,489 @@ fi
# hardware available to narrow this problem down, and in practice, it
# seems that tputs is never really needed.
#
AC_CANONICAL_TARGET
if test $target_cpu = powerpc; then
AC_DEFINE([TPUTS_KLUDGE],[1],[Evil kludge to get Power based machines to work])
AC_DEFINE([TPUTS_KLUDGE],[1],[Evil kludge to get Power based machines to work])
fi
#
# Solaris-specific flags go here
#
AC_MSG_CHECKING([if we are under Solaris])
case $target_os in
solaris*)
AC_DEFINE( __EXTENSIONS__, 1, [Macro to enable additional prototypes under Solaris])
AC_MSG_RESULT(yes)
;;
*)
AC_MSG_RESULT(no)
;;
esac
#
# BSD-specific flags go here
#
AC_MSG_CHECKING([if we are under BSD])
case $target_os in
*bsd*)
AC_DEFINE( __BSD_VISIBLE, 1, [Macro to enable additional prototypes under BSD])
AC_DEFINE( _NETBSD_SOURCE, 1, [Macro to enable additional prototypes under BSD])
AC_MSG_RESULT(yes)
;;
*)
AC_MSG_RESULT(no)
;;
esac
#
# Set up PREFIX and related preprocessor symbols. Fish needs to know
# where it will be installed. One of the reasons for this is so that
# it can make sure the fish installation directory is in the path
# during startup.
#
if [[ "$prefix" = NONE ]]; then
AC_DEFINE_UNQUOTED( [PREFIX], L"/usr/local", [Installation directory])
AC_SUBST( PREFIX, /usr/local)
export prefix=/usr/local
AC_SUBST( prefix, /usr/local)
else
AC_DEFINE_UNQUOTED( [PREFIX], L"$prefix", [Installation directory])
AC_SUBST( PREFIX, [$prefix])
AC_SUBST( prefix, [$prefix])
fi
AC_DEFINE_UNQUOTED( SYSCONFDIR, [L"$(eval echo $sysconfdir)"], [System configuration directory] )
AC_DEFINE_UNQUOTED( DATADIR, [L"$(eval echo $datadir)"], [System configuration directory] )
AC_SUBST( SYSCONFDIR, ["$(eval echo $sysconfdir)"] )
AC_SUBST( DATADIR, ["$(eval echo $datadir)"] )
#
# Set up the directory where the documentation files should be
# installed
#
AC_ARG_VAR( [docdir], [Documentation direcotry] )
if test -z $docdir; then
AC_SUBST(docdir,[$datadir/doc/fish])
AC_SUBST(docdir, [$datadir/doc/fish] )
else
AC_SUBST(docdir, [$docdir])
fi
AC_DEFINE_UNQUOTED( DOCDIR, [L"$(eval echo $docdir)"], [Documentation directory] )
#
# Set up locale directory. This is where the .po files will be
# installed.
AC_DEFINE_UNQUOTED( [LOCALEDIR], "$(eval echo $datadir)/locale", [Locale directory])
AC_SUBST( [LOCALEDIR], [$datadir/locale])
#
AC_SUBST( [localedir], [$datadir/locale])
#
# See if Linux procfs is present. This is used to get extra
# information about running processes.
#
AC_CHECK_FILES([/proc/self/stat])
#
# This is ued to tell the wgetopt library to translate strings. This
# way wgetopt can be dropped into any project without requiring i18n.
#
AC_DEFINE([HAVE_TRANSLATE_H], [1],
[Define to 1 if the wgettext function should be used for translating strings.])
AC_DEFINE(
[HAVE_TRANSLATE_H],
[1],
[Define to 1 if the wgettext function should be used for translating strings.]
)
# Check for presense of various libraries
AC_SEARCH_LIBS( gettext, intl, AC_SUBST( HAVE_GETTEXT, [1] ), AC_SUBST( HAVE_GETTEXT, [0] ) )
#
# Check presense of various libraries
#
# Only link with gettext if we are using it
if test x$local_gettext != xno; then
AC_SEARCH_LIBS( gettext, intl,,)
fi
AC_SEARCH_LIBS( connect, socket, , [AC_MSG_ERROR([Cannot find the socket library, needed to build this package.] )] )
AC_SEARCH_LIBS( nanosleep, rt, , [AC_MSG_ERROR([Cannot find the rt library, needed to build this package.] )] )
AC_SEARCH_LIBS( setupterm, [ncurses curses], , [AC_MSG_ERROR([Could not find a curses implementation, needed to build fish])] )
AC_SEARCH_LIBS( iconv_open, iconv, , [AC_MSG_ERROR([Could not find an iconv implementation, needed to build fish])] )
# Check for presense of various header files
AC_CHECK_HEADERS([getopt.h termio.h sys/resource.h term.h ncurses/term.h libintl.h ncurses.h curses.h])
AC_CHECK_HEADER([regex.h],
[AC_DEFINE([HAVE_REGEX_H], [1], [Define to 1 if you have the <regex.h> header file.])],
[AC_MSG_ERROR([Could not find the header regex.h, needed to build fish])])
#
# Check presense of various header files
#
# Check for presense of various functions
AC_CHECK_FUNCS( wcsdup wcsndup wcslen wcscasecmp wcsncasecmp gettext fwprintf )
AC_CHECK_FUNCS( futimes wcwidth wcswidth getopt_long wcstok fputwc fgetwc )
AC_CHECK_FUNCS( wcstol dcgettext wcslcat wcslcpy lrand48_r)
AC_CHECK_HEADERS([getopt.h termio.h sys/resource.h term.h ncurses/term.h ncurses.h curses.h stropts.h siginfo.h sys/select.h sys/ioctl.h sys/termios.h libintl.h execinfo.h])
AC_CHECK_HEADER(
[regex.h],
[
AC_DEFINE(
[HAVE_REGEX_H],
[1],
[Define to 1 if you have the <regex.h> header file.]
)
],
[AC_MSG_ERROR([Could not find the header regex.h, needed to build fish])]
)
#
# On some platforms (Solaris 10) adding -std=c99 in turn requires that
# _POSIX_C_SOURCE be defined to 200112L otherwise several
# POSIX-specific, non-ISO-C99 types/prototypes are made unavailable
# e.g. siginfo_t. Defining _XOPEN_SOURCE to 600 is compatible with
# the _POSIX_C_SOURCE value and provides a little assurance that
# extension functions' prototypes are available, e.g. killpg().
#
# Some other platforms (OS X), will remove types/prototypes/macros
# e.g. SIGWINCH if either _POSIX_C_SOURCE or _XOPEN_SOURCE is defined.
#
# This test adds these macros only if they enable a program that uses
# both Posix and non-standard features to compile, and that program
# does not compile without these macros.
#
# We try to make everyone happy.
#
# The ordering of the various autoconf tests is very critical as well:
#
# * This test needs to be run _after_ header detection tests, so that
# the proper headers are included.
#
# * This test needs to be run _before_ testing for the presense of any
# prototypes or other language functinality.
#
# * This test should be (but does not need to be) run after the
# conditional definition of __EXTENSIONS__, to avoid redundant tests.
#
XCFLAGS="$CFLAGS"
echo Checking how to use -D_XOPEN_SOURCE=600 and -D_POSIX_C_SOURCE=200112L...
local_found_posix_switch=no
for i in "" "-D_POSIX_C_SOURCE=200112L" "-D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112L"; do
AC_MSG_CHECKING( if switches \"$i\" works)
CFLAGS="$XCFLAGS $i"
#
# Try to run this program, which should test various extensions
# and Posix functionality. If this program works, then everything
# should work. Hopefully.
#
AC_TRY_LINK(
[
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
/* POSIX, C89 and C99: POSIX extends this header.
* For: kill(), killpg(), siginfo_t, sigset_t,
* struct sigaction, sigemptyset(), sigaction(),
* SIGIO and SIGWINCH. */
#include <signal.h>
#ifdef HAVE_SIGINFO_H
/* Neither POSIX, C89 nor C99: Solaris-specific (others?).
* For: siginfo_t (also defined by signal.h when in
* POSIX/extensions mode). */
#include <siginfo.h>
#endif
#ifdef HAVE_SYS_TERMIOS_H
/* Neither POSIX, C89 nor C99: a common extension.
* For: TIOCGWINSZ and struct winsize (under at least
* Solaris, NetBSD and (dual-listed) FreeBSD). */
#include <sys/termios.h>
#endif
#ifdef HAVE_SYS_IOCTL_H
/* As above (under at least Linux and FreeBSD). */
#include <sys/ioctl.h>
#endif
],
[
/* Avert high-level optimisation, by making the program's
* return value depend on all tested identifiers. */
int ret = 0;
/* POSIX only: might be unhidden by _POSIX_C_SOURCE. */
struct sigaction sa;
sigset_t ss;
siginfo_t info;
ret += (int)(void *)&info + kill( 0, 0 ) +
sigaction( 0, &sa, 0 ) + sigemptyset( &ss );
/* Extended-POSIX: might be unhidden by _XOPEN_SOURCE. */
ret += killpg( 0, 0 );
/* Non-standard: might be hidden by the macros. */
{
struct winsize termsize;
ret += (int)(void *)&termsize;
ret += SIGWINCH + TIOCGWINSZ + SIGIO;
}
return ret;
],
local_cv_use__posix_c_source=yes,
local_cv_use__posix_c_source=no,
)
if test x$local_cv_use__posix_c_source = xyes; then
AC_MSG_RESULT( yes )
local_found_posix_switch=yes
break;
else
AC_MSG_RESULT( no )
fi
done
#
# We didn't find any combination of switches that worked - revert to
# no switches and hope that the fallbacks work. A warning will be
# printed at the end of the configure script.
#
if test ! x$local_found_posix_switch = xyes; then
CFLAGS="$XCFLAGS"
fi
#
# Check for presense of various functions used by fish
#
AC_CHECK_FUNCS( wcsdup wcsndup wcslen wcscasecmp wcsncasecmp fwprintf )
AC_CHECK_FUNCS( futimes wcwidth wcswidth wcstok fputwc fgetwc )
AC_CHECK_FUNCS( wcstol wcslcat wcslcpy lrand48_r killpg gettext )
AC_CHECK_FUNCS( dcgettext backtrace backtrace_symbols)
#
# The Makefile also needs to know if we have gettext, so it knows if
# the translations should be installed.
#
if test x$local_gettext != xno; then
AC_CHECK_FUNC( gettext, AC_SUBST( HAVE_GETTEXT, 1 ), AC_SUBST( HAVE_GETTEXT, 0 ) )
fi
#
# Here follows a list of small programs used to test for various
# features that Autoconf doesn't tell us about
#
#
# Check if realpath accepts null for its second argument
#
AC_MSG_CHECKING([if realpath accepts null for its second argument])
AC_RUN_IFELSE(
[AC_LANG_PROGRAM([
#include <limits.h>
#include <errno.h>
#include <stdlib.h>],
[int status; char *res; res = realpath( "somefile", 0 ); status = !(res != 0 || errno == ENOENT); exit( status );])],
[
AC_LANG_PROGRAM(
[
#include <limits.h>
#include <errno.h>
#include <stdlib.h>
],
[
int status;
char *res;
res = realpath( "somefile", 0 );
status = !(res != 0 || errno == ENOENT);
exit( status );
]
)
],
[have_realpath_null=yes],
[have_realpath_null=no] )
[have_realpath_null=no]
)
if test "$have_realpath_null" = yes; then
AC_MSG_RESULT(yes)
AC_DEFINE([HAVE_REALPATH_NULL], [1],
[Define to 1 if realpath accepts null for its second argument.])
AC_DEFINE(
[HAVE_REALPATH_NULL],
[1],
[Define to 1 if realpath accepts null for its second argument.]
)
else
AC_MSG_RESULT(no)
fi
#
# Check if struct winsize and TIOCGWINSZ exist
#
AC_MSG_CHECKING([if struct winsize and TIOCGWINSZ exist])
AC_LINK_IFELSE(
[
AC_LANG_PROGRAM(
[
#ifdef HAVE_SYS_TERMIOS_H
#include <sys/termios.h>
#endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
],
[
struct winsize termsize = {0};
TIOCGWINSZ;
]
)
],
[
AC_MSG_RESULT(yes);
AC_DEFINE([HAVE_WINSIZE], [1], [Define to 1 if the winsize struct and TIOCGWINSZ macro exist])
],
[
AC_MSG_RESULT(no)
]
)
#
# If we have a fwprintf in libc, test that it actually works. As of
# March 2006, it is broken under Dragonfly BSD.
#
if test "$ac_cv_func_fwprintf" = yes; then
AC_MSG_CHECKING([if fwprintf is broken])
AC_RUN_IFELSE(
[AC_LANG_PROGRAM([
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
],
[
setlocale( LC_ALL, "" );
fwprintf( stderr, L"%ls%ls", L"", L"fish:" );
])],
[
[
AC_LANG_PROGRAM(
[
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
],
[
setlocale( LC_ALL, "" );
fwprintf( stderr, L"%ls%ls", L"", L"fish:" );
]
)
],
[
AC_MSG_RESULT(no)
],
[
[
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_BROKEN_FWPRINTF], [1], [Define to 1 one if the implemented fwprintf is broken])
] )
]
)
fi
# Check for _nl_msg_cat_cntr symbol
AC_MSG_CHECKING([for _nl_msg_cat_cntr symbol])
AC_TRY_LINK([#if HAVE_LIBINTL_H]
[#include <libintl.h>]
[#endif],
[extern int _nl_msg_cat_cntr;]
[int tmp = _nl_msg_cat_cntr; exit(tmp);], have__nl_msg_cat_cntr=yes, have__nl_msg_cat_cntr=no)
AC_TRY_LINK(
[
#if HAVE_LIBINTL_H
#include <libintl.h>
#endif
],
[
extern int _nl_msg_cat_cntr;
int tmp = _nl_msg_cat_cntr;
exit(tmp);
],
have__nl_msg_cat_cntr=yes,
have__nl_msg_cat_cntr=no
)
if test "$have__nl_msg_cat_cntr" = yes; then
AC_MSG_RESULT(yes)
AC_DEFINE([HAVE__NL_MSG_CAT_CNTR], [1],
[Define to 1 if the _nl_msg_cat_cntr symbol is exported.])
AC_DEFINE(
[HAVE__NL_MSG_CAT_CNTR],
[1],
[Define to 1 if the _nl_msg_cat_cntr symbol is exported.]
)
else
AC_MSG_RESULT(no)
AC_MSG_RESULT(no)
fi
# Check if we are using basic BSD curses - in that case we redefine
# Check for __environ symbol
AC_MSG_CHECKING([for __environ symbol])
AC_TRY_LINK(
[
#include <unistd.h>
],
[
extern char **__environ;
char **tmp = __environ;
exit(tmp!=0);
],
have___environ=yes,
have___environ=no
)
if test "$have___environ" = yes; then
AC_MSG_RESULT(yes)
AC_DEFINE(
[HAVE___ENVIRON],
[1],
[Define to 1 if the __environ symbol is exported.]
)
else
AC_MSG_RESULT(no)
fi
# Check if getopt_long exists and works
AC_MSG_CHECKING([if getopt_long exists and works])
AC_TRY_LINK(
[
#if HAVE_GETOPT_H
#include <getopt.h>
#endif
],
[
static struct option
long_options[] =
{
0, 0, 0, 0
}
;
int opt = getopt_long( 0,
0,
0,
long_options,
0 );
],
have_working_getopt_long=yes,
have_working_getopt_long=no
)
if test "$have_working_getopt_long" = yes; then
AC_MSG_RESULT(yes)
AC_DEFINE(
[HAVE_WORKING_GETOPT_LONG],
[1],
[Define to 1 if getopt_long exists and works.]
)
else
AC_MSG_RESULT(no)
fi
# Check if del_curterm is broken - in that case we redefine
# del_curterm as a no-op, to avoid a double-free
AC_MSG_CHECKING([If we are using BSD curses])
AC_MSG_CHECKING([If del_curterm is broken])
case $target_os in
*bsd*)
AC_MSG_RESULT(yes)
AC_CHECK_LIB( ncurses, del_curterm, true, [AC_DEFINE([HAVE_BROKEN_DEL_CURTERM],[1],[We are using basic BSD curses, redefine del_curterm to a no-op to avoid a double-free bug])])
AC_DEFINE(
[HAVE_BROKEN_DEL_CURTERM],
[1],
[del_curterm is broken, redefine it to a no-op to avoid a double-free bug]
)
;;
*)
AC_MSG_RESULT(no)
@@ -357,8 +839,14 @@ case $target_os in
esac
# Tell the world what we know
AC_CONFIG_FILES([Makefile fish.spec doc_src/fish.1 doc_src/Doxyfile etc/fish etc/fish_interactive.fish share/fish seq])
AC_CONFIG_FILES([Makefile fish.spec Doxyfile.help seq])
AC_OUTPUT
if test ! x$local_found_posix_switch = xyes; then
echo "Can't find a combination of switches to enable common extensions like detecting window size."
echo "Some fish features may be disabled."
fi
echo "fish is now configured."
echo "Use 'make' and 'make install' to build and install fish."

View File

@@ -2,6 +2,8 @@
The length command, used for determining the number of items in an
environment variable array.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>

121
create_wajig_completions.py Executable file
View File

@@ -0,0 +1,121 @@
#!/usr/bin/env python
# -*- python -*-
# Program to generate fish completion function for wajig.
# It runs 'wajig command' and analyzes the output to build a
# completion file which it writes to stdout.
# To use the result, direct stdout to
# ~/.fish.d/completions/wajig.fish.
# Author Reuben Thomas, from Don Rozenberg's bash_completion.py and
# fish's apt-get.fish.
import os
import re
import pprint
pp = pprint.PrettyPrinter()
def escape_quotes(s):
return re.sub('\'', '\\\'', s)
# Run wajig command
f = os.popen('wajig commands', 'r')
lines = f.readlines()
option_patt = r'^-([a-z]*)\|--([a-z]*) +([^ ].*)'
option_patt_r = re.compile(option_patt)
command_patt = r'^([a-z-]*) +([^ ].*)'
command_patt_r = re.compile(command_patt)
os_str = []
os_str.append('')
ol_str = []
ol_str.append('')
oh_str = []
oh_str.append('')
o_i = 0
c_str = []
c_str.append('')
ch_str = []
ch_str.append('')
c_i = 0
for l in lines:
l = l.strip()
if l == '' or l.find(':') > -1 or l.find('Run') == 0:
continue
if l.find('-') == 0:
mo = option_patt_r.search(l)
if mo == None:
continue
os_str[o_i] = mo.group(1)
os_str.append('')
ol_str[o_i] = mo.group(2)
ol_str.append('')
oh_str[o_i] = escape_quotes(mo.group(3))
oh_str.append('')
o_i += 1
else:
mo = command_patt_r.search(l)
if mo == None:
continue
c_str[c_i] = mo.group(1)
c_str.append('')
ch_str[c_i] = escape_quotes(mo.group(2))
ch_str.append('')
c_i += 1
# For debugging, print the commands and options.
#print
#pp.pprint(c_str)
#print
#pp.pprint(os_str)
#print
#pp.pprint(ol_str)
part1 = '''function __fish_wajig_no_subcommand -d (N_ 'Test if wajig has yet to be given the subcommand')
for i in (commandline -opc)
if contains -- $i'''
part2 = '''
return 1
end
end
return 0
end
function __fish_wajig_use_package -d (N_ 'Test if wajig command should have packages as potential completion')
for i in (commandline -opc)
if contains -- $i contains bug build build-depend changelog dependents describe detail hold install installr installrs installs list list-files news package purge purge-depend readme recursive recommended reconfigure reinstall remove remove-depend repackage show showinstall showremove showupgrade size sizes source suggested unhold upgrade versions whatis
return 0
end
end
return 1
end
complete -c wajig -n '__fish_wajig_use_package' -a '(__fish_print_packages)' -d (N_ 'Package')'''
wajig = part1
#add the commands.
for i in range(0, len(c_str) - 1):
wajig = "%s %s" % (wajig, c_str[i])
#add part2
wajig = "%s%s" % (wajig, part2)
#add the options.
wajig = "%s%s" % (wajig, os_str[0].lstrip())
for i in range(1, len(os_str) - 1):
wajig = "%s\ncomplete -c apt-get -s %s -l %s -d (N_ '%s')" % (wajig, os_str[i], ol_str[i], oh_str[i])
#add the commands.
for i in range(0, len(c_str) - 1):
wajig = "%s\ncomplete -f -n '__fish_wajig_no_subcommand' -c wajig -a '%s' -d(N_ '%s')" % (wajig, c_str[i], ch_str[i])
#print it all
print wajig

18
doc_src/alias.txt Normal file
View File

@@ -0,0 +1,18 @@
\section alias alias - create a function
\subsection alias-synopsis Synopsis
<pre>alias NAME DEFINITION
alias NAME=DEFINITION</pre>
\subsection alias-description Description
Alias is a shellscript wrapper around the function builtin.
It exists for backwards compatibility with Posix
shells. For other uses, it is recommended to define a <a
href='#function'>function</a>.
Alias does not keep track of which functions have been defined using
alias, nor does it allow erasing of aliases.
- NAME is the name of the function to define
- DEFINITION is the body of the function. The string " $argv" will be appended to the body.

View File

@@ -1,5 +1,4 @@
\section and and - Conditionally execute a command
\section and and - conditionally execute a command
\subsection and-synopsis Synopsis
<tt>COMMAND1; and COMMAND2</tt>
@@ -7,10 +6,14 @@
\subsection and-description Description
The \c and builtin is used to execute a command if the current exit
status (as set by the last previous command) is zero
status (as set by the last previous command) is 0.
The and command does not change the current exit status.
The exit status of the last foreground command to exit can always be
accessed using the <a href="index.html#variables-status">$status</a>
variable.
\subsection and-example Example
The following code runs the \c make command to build a program, if the

View File

@@ -1,17 +1,17 @@
\section begin begin - Start a new block of code
\section begin begin - start a new block of code
\subsection begin-synopsis Synopsis
<tt>begin; [COMMAND;...] end </tt>
<tt>begin; [COMMANDS...;] end</tt>
\subsection begin-description Description
The \c begin builtin is used to create a new block of code. The block
is unconditionally executed. Begin is equivalent to <tt>if
true</tt>. The begin command is used to group any number of commands
into a block. The reason for this is usually either to introduce a new
variable scope or to redirect the input to output of this set of
commands as a group.
is unconditionally executed. <code>begin; ...; end</tt> is equivalent
to <tt>if true; ...; end</tt>. The begin command is used to group any
number of commands into a block. The reason for doing so is usually
either to introduce a new variable scope, to redirect the input or
output of a set of commands as a group, or to specify precedence when
using the conditional commands like \c and.
The \c begin command does not change the current exit status.
@@ -23,10 +23,24 @@ scope, they will be automatically deleted when the block ends.
<pre>
begin
set -x PIRATE Yarrr
set -l PIRATE Yarrr
...
end
# This will not output anything, since PIRATE went out of scope at the end of
# the block and was killed
# This will not output anything, since the PIRATE variable went out
# of scope at the end of the block
echo $PIRATE
</pre>
In the following code, all output is redirected to the file out.html.
<pre>
begin
echo $xml_header
echo $html_header
if test -e $file
...
end
...
end &gt; out.html
</pre>

View File

@@ -1,14 +1,21 @@
\section bind bind - Handle key bindings.
\section bind bind - handle key bindings
\subsection bind-synopsis Synopsis
<tt>bind [OPTIONS] [BINDINGS...] </tt>
<tt>bind [OPTIONS] [BINDINGS...]</tt>
The <tt>bind</tt> builtin causes fish to add the readline style bindings specified by <tt>BINDINGS</tt> to the list of key bindings. For more information on specifying keyboard bindings, use <tt>man readline</tt> to access the readline documentation.
The <tt>bind</tt> builtin causes fish to add the readline style bindings specified by BINDINGS to the list of key bindings, as if they appeared in your <tt>~/.fish_inputrc</tt> file.
For more information on the syntax keyboard bindings, use <tt>man
readline</tt> to access the readline documentation. The availiable commands
are listed in the <a href="index.html#editor">Command Line Editor</a> section
of the fish manual - but you may also use any fish command! To write such
commands, see the <a href="#commandline">commandline</a> builtin. It's good
practice to put the code into a <tt><a href="#function">function</a> -b</tt>
and bind to the function name.
\subsection bind-description Description
- <tt>-M MODE</tt> or <tt>--set-mode=MODE</tt> sets the current input mode to MODE.
\subsection bind-example Example
<tt>bind -M vi</tt> changes to the vi input mode

View File

@@ -1,5 +1,4 @@
\section block block - Temporarily block delivery of events
\section block block - temporarily block delivery of events
\subsection block-synopsis Synopsis
<tt>block [OPTIONS...]</tt>
@@ -12,7 +11,8 @@
\subsection block-example Example
<pre>block -g
<pre>
block -g
\#Do something that should not be interrupted
block -e
</pre>

View File

@@ -1,4 +1,3 @@
\section break break - stop the innermost currently evaluated loop
\subsection break-synopsis Synopsis
@@ -9,13 +8,12 @@ The \c break builtin is used to halt a currently running loop, such as a <a href
\subsection break-example Example
The following code searches all .c files for smurfs, and halts at the first occurrence.
<p>
<tt>for i in *.c;
<br>&nbsp;&nbsp;&nbsp;&nbsp;if grep smurf $i;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo Smurfs are present in $i;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
<br>&nbsp;&nbsp;&nbsp;&nbsp;end;
<br>end;
</tt>
</p>
<pre>
for i in *.c
if grep smurf $i
echo Smurfs are present in $i
break
end
end
</pre>

View File

@@ -1,4 +1,3 @@
\section builtin builtin - run a builtin command
\subsection builtin-synopsis Synopsis
@@ -8,7 +7,7 @@
- <tt>-n</tt> or <tt>--names</tt> List the names of all defined builtins
Prefixing a command with the word 'builtin' forces fish to ignore any aliases with the same name.
Prefixing a command with the word 'builtin' forces fish to ignore any functions with the same name.
\subsection builtin-example Example

View File

@@ -1,7 +1,7 @@
\section case case - conditionally execute a block of commands
\subsection case-synopsis Synopsis
<tt>switch VALUE; [case [WILDCARD...]; [COMMANDS...];...] end</tt>
<tt>switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end</tt>
\subsection case-description Description
@@ -32,7 +32,6 @@ forms of parameter expansion have been performed for the case command.
If the variable \$animal contains the name of an animal, the following
code would attempt to classify it:
<p>
<pre>
switch $animal
case cat
@@ -47,7 +46,7 @@ switch $animal
echo I have no idea what a $animal is
end
</pre>
</p>
<p>
If the above code was run with \c \$animal set to \c whale, the output would be \c mammal.
</p>
If the above code was run with \c \$animal set to \c whale, the output
would be \c mammal.

View File

@@ -4,11 +4,11 @@
<tt>command COMMANDNAME [OPTIONS...]</tt>
\subsection command-description Description
prefixing a command with the word 'command' forces fish to ignore any aliases or builtins with the same name.
prefixing a command with the word 'command' forces fish to ignore any functions or builtins with the same name.
\subsection command-example Example
<tt>command ls</tt>
causes fish to execute the ls program, even if there exists a 'ls' alias.
causes fish to execute the ls program, even if there exists a 'ls' function.

View File

@@ -1,4 +1,4 @@
\section commandline commandline - Set or get the current commandline buffer
\section commandline commandline - set or get the current commandline buffer
\subsection commandline-synopsis Synopsis
<tt>commandline [OPTIONS] [CMD]</tt>
@@ -9,8 +9,22 @@
- \c CMD is the new value of the commandline. If unspecified, the
current value of the commandline is written to standard output.
The following switches change what the commandline builtin does
- \c -C or \c --cursor set or get the current cursor position, not
the contents of the buffer. If no argument is given, the current
cursor position is printed, otherwise the argument is interpreted
as the new cursor position.
- \c -f or \c --function inject readline functions into the
reader. This option can not be combined with any other option. It
will cause any additional arguments to be interpreted as readline
functions, and these functions will be injected into the reader, so
that they will be returned to the reader before any additional
actual key presses are read.
The following switches change the way \c commandline updates the
commandline
commandline buffer
- \c -a or \c --append do not remove the current commandline, append
the specified string at the end of it
@@ -25,23 +39,15 @@ or updated
- \c -b or \c --current-buffer select the entire buffer (default)
- \c -j or \c --current-job select the current job
- \c -p or \c --current-process select the current process
- \c -t or \c --current_token select the current token.
- \c -t or \c --current-token select the current token.
The following switch changes the way \c commandline prints the current
commandline
commandline buffer
- \c -c or \c --cut-at-cursor only print selection up until the
current cursor position
- \c -o or \c --tokenize tokenize the selection and print one string-type token per line
Other switches
- \c -f or \c --function inject readline functions into the
reader. This option can not be combined with any other option. It
will cause any additional arguments to be interpreted as readline
functions, and these functions will be injected into the reader, so
that they will be returned to the reader before any additional
actual keypresses are read.
If commandline is called during a call to complete a given string
using <code>complete -C STRING</code>, commandline will consider the

6
doc_src/commands.hdr.in Normal file
View File

@@ -0,0 +1,6 @@
/** \page commands Commands, functions and builtins bundled with fish
Fish ships with a large number of builtin commands, shellscript functions and external commands. These are all described below.
@command_list@
*/

View File

@@ -22,6 +22,7 @@ the fish manual.
- <tt>-p</tt> or <tt>--path</tt> implies that the string COMMAND is the full path of the command
- <tt>-r</tt> or <tt>--require-parameter</tt> specifies that the option specified by this completion always must have an option argument, i.e. may not be followed by another option
- <tt>-u</tt> or <tt>--unauthorative</tt> implies that there may be more options than the ones specified, and that fish should not assume that options not listed are spelling errors
- <tt>-A</tt> or <tt>--authorative</tt> implies that there may be no more options than the ones specified, and that fish should assume that options not listed are spelling errors
- <tt>-x</tt> or <tt>--exclusive</tt> implies both <tt>-r</tt> and <tt>-f</tt>
Command specific tab-completions in \c fish are based on the notion

View File

@@ -1,5 +1,4 @@
\section contains contains - Test if a word is present in a list
\section contains contains - test if a word is present in a list
\subsection contains-synopsis Synopsis
<code>contains [OPTIONS] KEY [VALUES...]</code>

View File

@@ -1,20 +1,19 @@
\section continue continue - skip the rest of the current lap of the innermost currently evaluated loop
\subsection continue-synopsis Synopsis
<tt>LOOP_CONSTRUCT; [COMMANDS...] continue; [COMMANDS...] end</tt>
<tt>LOOP_CONSTRUCT; [COMMANDS...;] continue; [COMMANDS...;] end</tt>
\subsection continue-description Description
The \c continue builtin is used to skip the current lap of the innermost currently running loop, such as a <a href="#for">for</a> loop or a <a href="#while">while</a> loop. It is usually added inside of a conditional block such as an <a href="#if">if</a> statement or a <a href="#switch">switch</a> statement.
\subsection continue-example Example
The following code removes all tmp files without smurfs.
<p>
<tt>for i in *.tmp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;if grep smurf $i;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
<br>&nbsp;&nbsp;&nbsp;&nbsp;end;
<br>&nbsp;&nbsp;&nbsp;&nbsp;rm $i;
<br>end;
</tt>
</p>
<pre>
for i in *.tmp
if grep smurf $i
continue
end
rm $i
end
</pre>

View File

@@ -1,5 +1,4 @@
\section count count - Count the number of elements of an array
\section count count - count the number of elements of an array
\subsection count-synopsis Synopsis
<tt>count $VARIABLE</tt>

155
doc_src/design.hdr Normal file
View File

@@ -0,0 +1,155 @@
/** \page design Design document
\section design-overview Overview
This is a description of the design principles that have been used to
design fish. The fish design has three high level goals. These are:
-# Everything that can be done in other shell languages should be
possible to do in fish, though fish may rely on external commands in
doing so.
-# Fish should be user friendly, but not at the expense of expressiveness.
Most tradeoffs between power and ease of use can be avoided with careful design.
-# Whenever possible without breaking the above goals, fish should
follow the Posix syntax.
To achive these high-level goals, the fish design relies on a number
of more specific design principles. These are presented below,
together with a rationale and a few examples for each.
\section ortho The law of orthogonality
The shell language should have a small set of orthogonal features. Any
situation where two features are related but not identical, one of them
should be removed, and the other should be made powerful and general
enough to handle all common use cases of either feature.
Rationale:
Related features make the language larger, which makes it harder to
learn. It also increases the size of the sourcecode, making the
program harder to maintain and update.
Examples:
- Here documents are too similar to using echo inside of a pipeline.
- Subshells, command substitution and process substitution are strongly related. \c fish only supports command substitution, the others can be achived either using a block or the psub shellscript function.
- Having both aliases and functions is confusing, especially since both of them have limitations and problems. \c fish functions have none of the drawbacks of either syntax.
- The many Posix quoting styles are silly, especially \$''.
\section sep The law of minimalism
The shell should only contain features that cannot be implemented in
a reasonable way outside of the shell. A large performance decrease,
as well as some program complexity increase is acceptable in order to
improve separation.
Rationale:
A modular project is easier to maintain since smaller programs are far
easier to understand than larger ones. A modular project is also more
future proof since the modules can be individually
replaced. Modularity also decreases the severity of bugs, since there
is good hope that a bug, even a serious one, in one module, does not
take the whole system down.
Examples:
- Builtin commands should only be created when it cannot be
avoided. \c echo, \c kill, \c printf and \c time are among the commands
that fish does not implement internally since they can be provided as
external commands. Several other commands that are commonly implemented
as builtins and can not be implemented as external commands,
including \c type, \c vared, \c pushd and \c popd are implemented as shellscript
functions in fish.
- Mathematical calculations, regex matching, generating lists of numbers
and many other funtions can easily be done in external programs. They
should not be supported internally by the shell.
The law of minimalism does not imply that a large feature set is
bad. So long as a feature is not part of the shell itself, but a
separate command or at least a shellscript function, bloat is fine.
\section conf Configurability is the root of all evil
Every configuration option in a program is a place where the program
is too stupid to figure out for itself what the user really wants, and
should be considered a failiure of both the program and the programmer
who implemented it.
Rationale:
Different configuration options are a nightmare to maintain, since the
number of potential bugs caused by specific configuration combinations
quickly becomes an issue. Configuration options often imply
assumptions about the code which change when reimplementing the code,
causing issues with backwards compatibility. But mostly, configuration
options should be avoided since they simply should not exist, as the
program should be smart enough to do what is best, or at least a good
enough approximation of it.
Examples:
- Fish allows the user to set various syntax highlighting colors. This is needed because fish does not know what colors the terminal uses by default, which might make some things unreadable. The proper solution would be for text color preferences to be defined centrally by the user for all programs, and for the terminal emulator to send these color properties to fish.
- Fish does not allow you to set the history filename, the number of history entries, different language substyles or any number of other common shell configuration options.
A special note on the evils of configurability is the long list of
very useful features found in some shells, that are not turned on by
default. Both zsh and bash support command specific completions, but
no such completions are shipped with bash by default, and they are
turned of by default in zsh. Other features that zsh support that are
disabled by default include tab-completion of strings containing
wildcards, a sane completion pager and a history file.
\section user The law of user focus
When designing a program, one should first think about how to make a
intuitive and powerful program. Implementation issues should only be
considered once a user interface has been designed.
Rationale:
This design rule is different than the others, since it describes how
one should go about designing new features, not what the features
should be. The problem with focusing on what can be done, and what is
easy to do, is that to much of the implementation is exposed. This
means that the user must know a great deal about the underlying system
to be able to guess how the shell works, it also means that the
language will often be rather low-level.
Examples:
- There should only be one type of input to the shell, lists of commands. Loops, conditionals and variable assignments are all performed through regular commands.
- The differences between builtin commands, shellscript functions and builtin commands should be made as small as possible. Builtins and shellscript functions should have exactly the same types of argument expansion as other commands, should be possible to use in any position in a pipeline, and should support any io redirection.
- Instead of forking when performing command substitution to provide a fake variable scope, all fish commands are performed from the same process, and fish instead supports true scoping
- All blocks end with the \c end builtin
\section disc The law of discoverability
A program should be designed to make its features as
easy as possible to discover for the user.
Rationale:
A program whose features are discoverable turns a new user into an
expert in a shorter span of time, since the user will become an expert
on the program simply by using it.
The main benefit of a graphical program over a command line-based
program is discoverability. In a graphical program, one can discover
all the common features by simply looking at the user interface and
guessing what the different buttons, menus and other widgets do. The
traditional way to discover features in commandline programs is
through manual pages. This requires both that the user starts to use a
different program, and the she/he then remembers the new information
until the next time she/he uses the same program.
Examples:
- Everything should be tab-completable, and every tab completion should have a description
- Every syntax error and error in a builtin command should contain an error message describing what went wrong and a relevant help page. Whenever possible, errors should be flagged red by the syntax highlighter.
- The help manual should be easy to read, easily available from the shell, complete and contain many examples
- The language should be uniform, so that once the user understands the command/argument syntax, he will know the whole language, and be able to use tab-completion to discover new featues.
*/

View File

@@ -1,4 +1,4 @@
\section dirh dirh
\section dirh dirh - print directory history
\subsection dirh-synopsis Synopsis
<tt>dirh</tt>

View File

@@ -1,4 +1,4 @@
\section dirs dirs
\section dirs dirs - print directory stack
\subsection dirs-synopsis Synopsis
<tt>dirs</tt>

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,13 @@
\section else else - execute command if a condition is not met.
\section else else - execute command if a condition is not met
\subsection else-synopsis Synopsis
<tt>if CONDITION; COMMAND_TRUE [else; COMMAND_FALSE] end;</tt>
<tt>if CONDITION; COMMANDS_TRUE...; [else; COMMANDS_FALSE...;] end</tt>
\subsection else-description Description
<tt>if</tt> will execute the command CONDITION. If the commands exit
status is zero, the command COMMAND_TRUE will execute. If it is
not zero and COMMAND_FALSE is specified, COMMAND_FALSE will be
executed.
<tt>if</tt> will execute the command CONDITION. If the condition's exit
status is 0, the commands COMMANDS_TRUE will execute. If it is not 0 and
<tt>else</tt> is given, COMMANDS_FALSE will be executed. Hint: use
<a href="#begin"><tt>begin; ...; end</tt></a> for complex conditions.
\subsection else-example Example

View File

@@ -1,16 +1,17 @@
\section end end - end a block of commands.
\subsection end-synopsis Synopsis
<pre>for VARNAME in [VALUES...]; COMMANDS; end
if CONDITION; COMMAND_TRUE [else; COMMAND_FALSE] end
while CONDITION; COMMANDS; end
switch VALUE; [case [WILDCARD...]; [COMMANDS...];...] end
<pre>
begin; [COMMANDS...] end
if CONDITION; COMMANDS_TRUE...; [else; COMMANDS_FALSE...;] end
while CONDITION; COMMANDS...; end
for VARNAME in [VALUES...]; COMMANDS...; end
switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end
</pre>
\subsection end-description Description
<tt>end</tt> ends a block of commands. For more information, read the
documentation for the block constructs, such as \c if, \c for and \
documentation for the block constructs, such as \c if, \c for and \c
while.
The \c end command does not change the current exit status.

View File

@@ -1,5 +1,4 @@
\section exec exec - Execute command in current process
\section exec exec - execute command in current process
\subsection exec-synopsis Synopsis
<tt>exec COMMAND [OPTIONS...]</tt>

140
doc_src/faq.hdr Normal file
View File

@@ -0,0 +1,140 @@
/** \page faq Frequently asked questions
- <a href='#faq-cwd-symlink'>Why does cd, pwd and other fish commands always resolve symlinked directories to their canonical path?</a>
- <a href='#faq-cd-autocomplete'>Why does the cd command autocompletion list the subdirectories of my home directory as completions?</a>
- <a href='#faq-cd-implicit'>I accidentally entered a directory path and fish changed directory. What happened?</a>
- <a href='#faq-open'>The open command doesn't work.</a>
- <a href='#faq-default'>How do I make fish my default shell?</a>
- <a href='#faq-titlebar'>I'm seeing weird output before each prompt when using screen. What's wrong?</a>
- <a href='#faq-greeting'>How do I change the greeting message?</a>
<hr>
\section faq-cwd-symlink Why does cd, $PWD and and various fish commands always resolve symlinked directories to their canonical path?
<i>
For example if ~/images is a symlink to ~/Documents/Images, if I write
'cd images', my prompt will say ~/D/Images, not ~/images.
</i>
Because it is impossible to consistently keep symlinked directories
unresolved. It is indeed possible to do this partially, and many other
shells do so. But it was felt there are enough serious corner cases
that this is a bad idea. Most such issues have to do with how '..' is
handled, and are varitations of the following example:
Writing <code>cd images; ls ..</code> given the above directory
structure would list the contents of ~/Documents, not of ~, even
though using <code>cd ..</code> changes the current direcotry to ~,
and the prompt, the pwd builtin and many other directory information
sources suggest that the the current directory is ~/images and it's
parent is ~. This issue is not possible to fix without either making
every single command into a builtin, breaking Unix semantics or
implementing kludges in every single command.
This issue can also be seen when doing IO redirection.
Another related issue is that many programs that operate on recursive
directory trees, like the find command, silently ignore symlinked
directories. For example, <code>find $PWD -name '*.txt'</code>
silently fails in shells that don't resolve symlinked paths.
<hr>
\section faq-cd-autocomplete Why does the cd command autocompletion list the subdirectories of my home directory as completions?
Because they are completions. In fish, if you specify a relative
directory to the cd command, i.e. any path that does not start with
either './' or '/', the environment variable CDPATH will be examined, and any
directories in this path is used as a base direcotry. To disable this
feature, write <code>set CDPATH .</code> on the commandline.
<hr>
\section faq-cd-implicit I accidentally entered a directory path and fish changed directory. What happened?
If fish is unable to locate a command with a given name, fish will
test if a directory of that name exists. If it does, it is implicitly
assumed that you want to change working directory. For example, the
fastest way to switch to your home directory is to simply type
<code>~</code>.
<hr>
\section faq-open The open command doesn't work.
The open command uses the mimetype database and the .desktop files
used by Gnome and KDE to identify filetypes and default actions. If
at least one of these two desktops are installed, but the open command is
not working, this probably means that the relevant files are installed
in a nonstandard location. Please contact the <a
href='mailto:fish-users@lists.sf.net'>fish mailing list</a>, and
hopefully this can be resolved.
<hr>
\section faq-default How do I make fish my default shell?
If you installed fish manually (e.g. by compiling it, not by using a
package manager), you first need to add fish to the list of shells by
executing the following command (assuming you installed fish in
/usr/local) as root:
<code>echo /usr/local/bin/fish >>/etc/shells</code>
If you installed a prepackaged version of fish, the package manager
should have already done this for you.
In order to change your default shell, type:
<code>chsh -s /usr/local/bin/fish</code>
You may need to adjust the above path to e.g. /usr/bin/fish. Use the command <code>which fish</code> if you are unsure of where fish is installed.
You will need to log out and back in again for the change to take
effect.
<hr>
\section faq-titlebar I'm seeing weird output before each prompt when using screen. What's wrong?
Quick answer:
Run the following command in fish:
<pre>
echo function fish_title;end ~/.config/fish/config.fish
</pre>
Problem solved!
The long answer:
Fish is trying to set the titlebar message of your terminal. While
screen itself supports this feature, your terminal does
not. Unfortuntaly, when the underlying terminal doesn't support
setting the titlebar, screen simply passes through the escape codes
and text to the underlying terminal instead of ignoring them. It is
impossible detect and resolve this problem from inside fish since fish
has no way of knowing what the underlying terminal type is. For now,
the only way to fix this is to unset the titlebar message, as
suggested above.
Note that fish has a default titlebar message, which will be used if
the fish_title function is undefined. So simply unsetting the
fish_title function will not work.
<hr>
\section faq-greeting How do I change the greeting message?
Change the value of the variable fish_greeting. For example, to remove
the greeting use:
<pre>
set fish_greeting
</pre>
*/

View File

@@ -1,27 +0,0 @@
.TH fish 1 "February 25, 2005" "version @PACKAGE_VERSION@" "USER COMMANDS"
.SH NAME
fish - friendly interactive shell
.SH SYNOPSIS
.B fish
[\-h] [\-v] [\-c command] [FILE [ARGUMENTS...]]
.SH DESCRIPTION
A shell written mainly with interactive use in mind. The complete fish manuals are written in HTML format. You can find them by using the
.I
help
command from inside the fish shell.
.SH OPTIONS
.TP
\-h
display help and exit
.TP
\-c
Evaluate the specified commands instead of reading from the commandline
.TP
\-i
Specify that fish is to run in interactive mode
.TP
\-v
display version and exit
.SH AUTHOR
Axel Liljencrantz ( @PACKAGE_BUGREPORT@ )

23
doc_src/fish.txt Normal file
View File

@@ -0,0 +1,23 @@
\section fish fish - the friendly interactive shell
\subsection fish-synopsis Synopsis
fish [-h] [-v] [-c command] [FILE [ARGUMENTS...]]
\subsection fish-description Description
A commandline shell written mainly with interactive use in mind. The
full manual is available <a href='index.html'>in html</a> by using the
<a href='#help'>help</a> command from inside fish.
- <code>-c</code> or <code>--command=COMMANDS</code> evaluate the specified commands instead of reading from the commandline
- <code>-d</code> or <code>--debug-level=DEBUG_LEVEL</code> specify the verbosity level of fish. A higher number means higher verbosity. The default level is 1.
- <code>-h</code> or <code>--help</code> display help and exit
- <code>-i</code> or <code>--interactive</code> specify that fish is to run in interactive mode
- <code>-l</code> or <code>--login</code> specify that fish is to run as a login shell
- <code>-n</code> or <code>--no-execute</code> do not execute any commands, only perform syntax checking
- <code>-p</code> or <code>--profile=PROFILE_FILE</code> when fish exits, output timing information on all executed commands to the specified file
- <code>-v</code> or <code>--version</code> display version and exit
The fish exit status is generally the exit status of the last
foreground command. If fish is exiting because of a parse error, the
exit status is 127.

View File

@@ -1,5 +1,4 @@
\section fish_pager fish_pager - Internal command used by fish
\section fish_pager fish_pager - internal command used by fish
\subsection fish_pager-description Description

View File

@@ -1,5 +1,4 @@
\section fishd fishd - Universal variable daemon
\section fishd fishd - universal variable daemon
\subsection fishd-synopsis Synopsis
<tt>fishd [(-h|--help|-v|--version)]</tt>
@@ -18,13 +17,14 @@ When no clients are connected, fishd will automatically shut down.
\subsection fishd-files Files
~/.fishd.HOSTNAME permanent storage location for universal variable
data. The data is stored as a set of \c set and \c set_export commands
such as would be parsed by fishd. If an instance of fishd is running
(which is generally the case), manual modifications to ~/.fishd.HOSTNAME
will be lost. Do NOT edit this file manually!
\c ~/.config/fish/fishd.HOSTNAME permanent storage location for universal
variable data. The data is stored as a set of \c set and \c set_export
commands such as would be parsed by fishd. The file must always be
stored in ASCII format. If an instance of fishd is running (which is
generally the case), manual modifications to ~/.fishd.HOSTNAME will be
lost. Do NOT edit this file manually!
/tmp/fishd.socket.USERNAME the socket which fishd uses to communicate
\c /tmp/fishd.socket.USERNAME the socket which fishd uses to communicate
with all clients.
/tmp/fishd.log.USERNAME the fishd log file

View File

@@ -1,13 +1,13 @@
\section for for - perform a set of commands multiple times.
\subsection for-synopsis Synopsis
<tt>for VARNAME in [VALUES...]; [COMMANDS...]; end</tt>
<tt>for VARNAME in [VALUES...]; COMMANDS...; end</tt>
\subsection for-description Description
<tt>for</tt> is a loop construct. It will perform the commands specified
by <tt>COMMANDS</tt> multiple times. Each time the environment variable
specified by <tt>VARNAME</tt> is assigned a new value from <tt>VALUES</tt>.
<tt>for</tt> is a loop construct. It will perform the commands specified by
COMMANDS multiple times. Each time the environment variable specified by
VARNAME is assigned a new value from VALUES. If VALUES is empty, COMMANDS will
not be executed at all.
\subsection for-example Example
@@ -17,7 +17,9 @@ The command
would output:
<pre>foo
<pre>
foo
bar
baz</pre>
baz
</pre>

View File

@@ -5,14 +5,13 @@
\subsection function-description Description
- \c -b or \c --key-binding specifies that the function is a key biding. Key binding functions work exactly like regular functions except that they can not be tab-completed, and may contain the '-' character.
- <code>-d DESCRIPTION</code> or \c --description=DESCRIPTION is a description of what the function does, suitable as a completion description
- <code>-j PID</code> or <code> --on-job-exit PID</code> tells fish to run this function when the job with group id PID exits. Instead of PID, the string 'caller' can be specified. This is only legal when in a command substitution, and will result in the handler being triggered by the exit of the job which created this command substitution.
- <code>-p PID</code> or <code> --on-process-exit PID</code> tells fish to run this function when the fish child process with process id PID exits
- <code>-s</code> or <code>--on-signal SIGSPEC</code> tells fish to run this function when the signal SIGSPEC is delivered. SIGSPEC can be a signal number, or the signal name, such as SIGHUP (or just HUP)
- <code>-v</code> or <code>--on-variable VARIABLE_NAME</code> tells fish to run this function when the variable VARIABLE_NAME changes value
This builtin command is used to create a new function. A Function is a
This builtin command is used to create a new function. A function is a
list of commands that will be executed when the name of the function
is entered. The function
@@ -25,11 +24,12 @@ end
will write <code>hello</code> whenever the user enters \c hi.
If the user enters any additional arguments after the function, they
are inserted into the environment variable <a href="index.html#variables-arrays">array</a> argv.
are inserted into the environment <a href="index.html#variables-arrays">variable array</a> argv.
\subsection function-example Example
<pre>function ll
<pre>
function ll
ls -l $argv
end
</pre>

View File

@@ -11,7 +11,7 @@ This builtin command is used to print or erase functions.
- <code>-d DESCRIPTION</code> or <code>--description=DESCRIPTION</code> change the description of this function
- <code>-e</code> or <code>--erase</code> causes the specified functions to be erased.
- <code>-h</code> or <code>--help</code> display a help message and exit
- <code>-n</code> or <code>--names</code> list only the names of all defined functions
- <code>-n</code> or <code>--names</code> list only the names of all defined functions, not their definition
- <code>-q</code> or <code>--query</code> test if the specified functions exist. Does not output anything, but the builtins exit status is the number of functions specified that were not defined.
The default behavior of \c functions when called with no arguments,

View File

@@ -1,5 +1,4 @@
\section help help - Display fish documentation
\section help help - display fish documentation
\subsection help-synopsis Synopsis
<tt>help [SECTION]</tt>
@@ -8,8 +7,11 @@
The \c help command is used to display a section of the fish help documentation.
If the BROWSER environment variable is set, it will be used to display
the documentation, otherwise fish will search for a suitable browser.
If the BROWSER environment variable is set, it will be used to display the
documentation, otherwise fish will search for a suitable browser.
Note also that most builtin commands display their help in the terminal when
given the <tt>--help</tt> option.
\subsection help-example Example

View File

@@ -1,13 +1,23 @@
\section if if - Conditionally execute a command
\section if if - conditionally execute a command
\subsection if-synopsis Synopsis
<tt>if CONDITION; COMMAND_TRUE [else; COMMAND_FALSE] end;</tt>
<tt>if CONDITION; COMMANDS_TRUE...; [else; COMMANDS_FALSE...;] end</tt>
\subsection if-description Description
<tt>if</tt> will execute the command CONDITION. If the commands exit
status is zero, the command COMMAND_TRUE will execute. If it is
not zero and COMMAND_FALSE is specified, COMMAND_FALSE will be
executed.
<tt>if</tt> will execute the command CONDITION. If the condition's
exit status is 0, the commands COMMANDS_TRUE will execute. If the
exit status is not 0 and <tt>else</tt> is given, COMMANDS_FALSE will
be executed.
In order to use the exit status of mutiple commands as the condition
of an if block, use <a href="#begin"><tt>begin; ...; end</tt></a> and
the short circut commands <a href="commands.html#and">and</a> and <a
href="commands.html#or">or</a>.
The exit status of the last foreground command to exit can always be
accessed using the <a href="index.html#variables-status">$status</a>
variable.
\subsection if-example Example

1446
doc_src/index.hdr.in Normal file

File diff suppressed because it is too large Load Diff

12
doc_src/isatty.txt Normal file
View File

@@ -0,0 +1,12 @@
\section isatty isatty - test if the specified file descriptor is a tty
\subsection isatty-synopsis Synopsis
<tt>isatty [FILE DESCRIPTOR]</tt>
where FILE DESCRIPTOR may be either the number of a file descriptor, or one
of the strings stdin, stdout and stderr.
If the specified file descriptor is a tty, the exit status of the
command is zero, otherwise, it is non-zero.

989
doc_src/license.hdr Normal file
View File

@@ -0,0 +1,989 @@
/** \page license Licenses
Fish Copyright (C) 2005-2006 Axel Liljencrantz. Fish is released under
the GNU General Public License, version 2. The license agreement is
included below.
Fish contains code under the BSD license, namely versions of the
two functions strlcat and strlcpy, modified for use with wide
character strings. This code is copyrighted by Todd C. Miller. The
license agreement is included below.
The XSel command, written and copyrighted by Conrad Parker, is
distributed together with, and used by fish. It is released under the MIT
license. The license agreement is included below.
The xdgmime library, written and copyrighted by Red Hat, Inc, is used
by the mimedb command, which is a part of fish. It is released under
the LGPL. The license agreement is included below.
Fish contains code from the glibc library, namely the wcstok
function. This code is licensed under the LGPL. The license agreement
is included below.
<HR>
<H2><A NAME="SEC1" HREF="gpl.html#TOC1">GNU GENERAL PUBLIC LICENSE</A></H2>
<P>
Version 2, June 1991
</P>
<PRE>
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
</PRE>
<H2><A NAME="SEC2" HREF="gpl.html#TOC2">Preamble</A></H2>
<P>
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
</P>
<P>
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
</P>
<P>
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
</P>
<P>
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
</P>
<P>
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
</P>
<P>
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
</P>
<P>
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
</P>
<P>
The precise terms and conditions for copying, distribution and
modification follow.
</P>
<H2><A NAME="SEC3" HREF="gpl.html#TOC3">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</A></H2>
<P>
<STRONG>0.</STRONG>
This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
<P>
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
<P>
<STRONG>1.</STRONG>
You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
<P>
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
<P>
<STRONG>2.</STRONG>
You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
<P>
<DL>
<DT>
<DD>
<STRONG>a)</STRONG>
You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
</DD>
</DT>
</DL>
<P>
<DL>
<DT>
<DD>
<STRONG>b)</STRONG>
You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
</DD>
</DT>
</DL>
<P>
<DL>
<DT>
<DD>
<STRONG>c)</STRONG>
If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
</DD>
</DT>
</DL>
<P>
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
<P>
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
<P>
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
<P>
<STRONG>3.</STRONG>
You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
<!-- we use this doubled UL to get the sub-sections indented, -->
<!-- while making the bullets as unobvious as possible. -->
<DL>
<DT>
<DD>
<STRONG>a)</STRONG>
Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
</DD>
</DT>
</DL>
<P>
<DL>
<DT>
<DD>
<STRONG>b)</STRONG>
Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
</DD>
</DT>
</DL>
<P>
<DL>
<DT>
<DD>
<STRONG>c)</STRONG>
Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
</DD>
</DT>
</DL>
<P>
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
<P>
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
<P>
<STRONG>4.</STRONG>
You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
<P>
<STRONG>5.</STRONG>
You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
<P>
<STRONG>6.</STRONG>
Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
<P>
<STRONG>7.</STRONG>
If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
<P>
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
<P>
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
<P>
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
<P>
<STRONG>8.</STRONG>
If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
<P>
<STRONG>9.</STRONG>
The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
<P>
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
<P>
<STRONG>10.</STRONG>
If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
<P><STRONG>NO WARRANTY</STRONG></P>
<P>
<STRONG>11.</STRONG>
BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
<P>
<STRONG>12.</STRONG>
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
<P>
<HR>
<h2>License for wcslcat and wcslcpy</h2>
\c fish also contains small amounts of code under the BSD
license, namely versions of the two functions strlcat and strlcpy,
modified for use with wide character strings. This code is copyrighted
by Todd C. Miller.
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
<HR>
<h2>License for XSel</h2>
The XSel command, written and copyrighted by Conrad Parker, is
distributed together with \c fish.
It is Copyright (C) 2001 Conrad Parker <conrad@vergenet.net>
Permission to use, copy, modify, distribute, and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation. No representations are made about the
suitability of this software for any purpose. It is provided "as is"
without express or implied warranty.
<HR>
<H2><A NAME="SEC1" HREF="#TOC1">GNU LESSER GENERAL PUBLIC LICENSE</A></H2>
<P>
Version 2.1, February 1999
<P>
<PRE>
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
</PRE>
<H2><A NAME="SEC2" HREF="#TOC2">Preamble</A></H2>
<P>
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
<P>
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
<P>
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
<P>
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
<P>
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
<P>
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
<P>
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
<P>
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
<P>
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
<P>
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
<P>
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
<P>
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
<P>
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
<P>
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
<P>
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
<P>
<H2><A NAME="SEC3" HREF="#TOC3">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</A></H2>
<P>
<STRONG>0.</STRONG>
This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
<P>
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
<P>
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
<P>
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
<P>
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
<P>
<STRONG>1.</STRONG>
You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
<P>
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
<P>
<STRONG>2.</STRONG>
You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
<P>
<UL>
<LI><STRONG>a)</STRONG>
The modified work must itself be a software library.
<LI><STRONG>b)</STRONG>
You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
<LI><STRONG>c)</STRONG>
You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
<LI><STRONG>d)</STRONG>
If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
<P>
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
<P>
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
<P>
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
<P>
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
</UL>
<P>
<STRONG>3.</STRONG>
You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
<P>
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
<P>
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
<P>
<STRONG>4.</STRONG>
You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
<P>
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
<P>
<STRONG>5.</STRONG>
A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
<P>
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
<P>
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
<P>
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
<P>
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
<P>
<STRONG>6.</STRONG>
As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
<P>
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
<P>
<UL>
<LI><STRONG>a)</STRONG> Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
<LI><STRONG>b)</STRONG> Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
<LI><STRONG>c)</STRONG> Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
<LI><STRONG>d)</STRONG> If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
<LI><STRONG>e)</STRONG> Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
</UL>
<P>
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
<P>
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
<P>
<STRONG>7.</STRONG> You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
<P>
<UL>
<LI><STRONG>a)</STRONG> Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
<LI><STRONG>b)</STRONG> Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
</UL>
<P>
<STRONG>8.</STRONG> You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
<P>
<STRONG>9.</STRONG>
You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
<P>
<STRONG>10.</STRONG>
Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
<P>
<STRONG>11.</STRONG>
If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
<P>
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
<P>
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
<P>
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
<P>
<STRONG>12.</STRONG>
If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
<P>
<STRONG>13.</STRONG>
The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
<P>
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
<P>
<STRONG>14.</STRONG>
If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
<P>
<STRONG>NO WARRANTY</STRONG>
<P>
<STRONG>15.</STRONG>
BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
<P>
<STRONG>16.</STRONG>
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
<P>
*/

20
doc_src/math.txt Normal file
View File

@@ -0,0 +1,20 @@
\section math math - Perform mathematics calculations
\subsection math-synopsis Synopsis
<tt>math EXPRESSION</tt>
\subsection math-description Description
math is used to perform mathematical calcualtions. It is only a very
thin wrapper for the bc program, that makes it possible to specify an
expression from the command line without using non-standard extensions
or a pipeline. Simply use a command like <code>math 1+1</code>.
For a description of the syntax supported by math, see the manual for
the bc program. Keep in mind that parameter expansion takes place on
any expressions before they are evaluated. This can be very useful in
order to perform calculations involving environment variables or the
output of command substitutions, but it also means that parenthesis
have to be escaped.

View File

@@ -1,5 +1,4 @@
\section mimedb mimedb - Lookup file information via the mime database
\section mimedb mimedb - lookup file information via the mime database
\subsection mimedb-synopsis Synopsis
<tt>mimedb [OPTIONS] FILES...</tt>

View File

@@ -1,10 +1,10 @@
\section nextd nextd
\section nextd nextd - move forward through directory history
\subsection nextd-synopsis Synopsis
<tt>nextd [-l | --list] [pos]</tt>
\subsection nextd-description Description <tt>nextd</tt> moves
forwards <tt>pos</tt> positions in the history of visited directories;
if the end of the history has been hit, a warning is printed. If the
<code>-l></code> or <code>--list</code> flag is specified, the current
\subsection nextd-description Description
<tt>nextd</tt> moves forwards <tt>pos</tt> positions in the history of visited
directories; if the end of the history has been hit, a warning is printed. If
the <code>-l></code> or <code>--list</code> flag is specified, the current
history is also displayed.

View File

@@ -1,14 +1,12 @@
\section not not - Negate the exit status of a job
\section not not - negate the exit status of a job
\subsection not-synopsis Synopsis
<tt>not COMMAND [OPTIONS...]</tt>
<tt>not COMMAND [OPTIONS...]</tt>
\subsection not-description Description
The \c not builtin is used to negate the exit status of another command.
\subsection not-example Example
The following code reports an error and exits if no file named spoon can be found.

View File

@@ -1,5 +1,4 @@
\section open open - Open file in it's default application
\section open open - open file in it's default application
\subsection open-synopsis Synopsis
<tt>open FILES...</tt>

View File

@@ -1,15 +1,19 @@
\section or or - Conditionally execute a command
\section or or - conditionally execute a command
\subsection or-synopsis Synopsis
<tt>COMMAND1; or COMMAND2</tt>
\subsection or-description Description
The \c or builtin is used to execute a command if the current exit status (as set by the last previous command) is non-zero
The \c or builtin is used to execute a command if the current exit
status (as set by the last previous command) is not 0.
The or command does not change the current exit status.
The exit status of the last foreground command to exit can always be
accessed using the <a href="index.html#variables-status">$status</a>
variable.
\subsection or-example Example
The following code runs the \c make command to build a program, if the

View File

@@ -1,4 +1,4 @@
\section popd popd
\section popd popd - move through directory stack
\subsection popd-synopsis Synopsis
<tt>popd</tt>

View File

@@ -1,10 +1,11 @@
\section prevd prevd
\section prevd prevd - move backward through direcotry history
\subsection prevd-synopsis Synopsis
<tt>prevd [-l | --list] [pos]</tt>
\subsection prevd-description Description <tt>prevd</tt> moves
backwards <tt>pos</tt> positions in the history of visited
directories; if the beginning of the history has been hit, a warning
is printed. If the <code>-l</code> or <code>--list</code> flag is
specified, the current history is also displayed.
\subsection prevd-description Description
<tt>prevd</tt> moves backwards <tt>pos</tt> positions in the history
of visited directories; if the beginning of the history has been hit,
a warning is printed. If the <code>-l</code> or <code>--list</code>
flag is specified, the current history is also displayed.

View File

@@ -1,8 +1,7 @@
\section psub psub - Perform process substitution
\section psub psub - perform process substitution
\subsection psub-synopsis Synopsis
<tt>COMMAND1 (COMMAND2|psub) </tt>
<tt>COMMAND1 (COMMAND2|psub [-f]) </tt>
\subsection psub-description Description
@@ -15,6 +14,12 @@ filename of the named pipe sent as an argument to the calling
program. The psub shellscript function, which when combined with a
regular command substitution provides the same functionality.
If the \c -f or \c --file switch is given to psub, psub will use a
regular file instead of a named pipe to communicate with the calling
process. This will cause psub to be significantly slower when large
amounts of data are involved, but has the advantage that the reading
process can seek in the stream.
\subsection psub-example Example
<tt>diff (sort a.txt|psub) (sort b.txt|psub)</tt> shows the difference

View File

@@ -1,4 +1,4 @@
\section pushd pushd
\section pushd pushd - push directory to directory stack
\subsection pushd-synopsis Synopsis
<tt>pushd [DIRECTORY]</tt>

View File

@@ -1,5 +1,4 @@
\section random random - Generate random number
\section random random - generate random number
\subsection random-synopsis Synopsis
<tt>random [SEED]</tt>

View File

@@ -11,7 +11,9 @@ input and store the result in one or more environment variables.
- <tt>-c CMD</tt> or <tt>--command=CMD</tt> specifies that the initial string in the interactive mode command buffer should be CMD.
- <tt>-e</tt> or <tt>--export</tt> specifies that the variables will be exported to subshells.
- <tt>-g</tt> or <tt>--global</tt> specifies that the variables will be made global.
- <tt>-m NAME</tt> or <tt>--mode-name=NAME</tt> specifies that the name NAME should be used to save/load the hiustory file. If NAME is fish, the regular fish history will be available.
- <tt>-p PROMPT_CMD</tt> or <tt>--prompt=PROMPT_CMD</tt> specifies that the output of the shell command PROMPT_CMD should be used as the prompt for the interactive mode prompt. The default prompt command is <tt>set_color green; echo read; set_color normal; echo "> "</tt>.
- <code>-s</code> or <code>--shell</code> Use syntax highlighting, tab completions and command termination suitable for entering shellscript code
- <code>-u</code> or <code>--unexport</code> causes the specified environment not to be exported to child processes
- <code>-U</code> or <code>--universal</code> causes the specified environment variable to be made universal. If this option is supplied, the variable will be shared between all the current users fish instances on the current computer, and will be preserved across restarts of the shell.
- <code>-x</code> or <code>--export</code> causes the specified environment variable to be exported to child processes

View File

@@ -1,8 +1,7 @@
\section return return - Stop the innermost currently evaluated function
\section return return - stop the innermost currently evaluated function
\subsection return-synopsis Synopsis
<tt>function NAME; [COMMANDS...] return [STATUS]; [COMMANDS...] end</tt>
<tt>function NAME; [COMMANDS...;] return [STATUS]; [COMMANDS...;] end</tt>
\subsection return-description Description
@@ -17,9 +16,11 @@ function.
\subsection return-example Example
The following code is an implementation of the false command as a fish function
<p>
<pre>function false
return 1
end</pre>
</p>
<pre>
function false
return 1
end
</pre>

12
doc_src/save_function.txt Normal file
View File

@@ -0,0 +1,12 @@
\section save_function save_function - save the definition of a function to the users autoload directory
\subsection save_function-synopsis Synopsis
<tt>save_function FUNCTION_NAME</tt>
\subsection save_function-description Description
save_function is used to save the current definition of a function to
a file which will be autoloaded by current and future fish
sessions. This can be useful if you have interactively created a new
function and wish to save it for later use.

View File

@@ -1,12 +1,14 @@
\section set set - Handle environment variables.
\section set set - handle environment variables.
\subsection set-synopsis Synopsis
<pre>set [SCOPE_OPTIONS]
<pre>
set [SCOPE_OPTIONS]
set [OPTIONS] VARIABLE_NAME VALUES...
set [OPTIONS] VARIABLE_NAME[INDICES]... VALUES...
set (-q | --query) [SCOPE_OPTIONS] VARIABLE_NAMES...
set (-e | --erase) [SCOPE_OPTIONS] VARIABLE_NAME
set (-e | --erase) [SCOPE_OPTIONS] VARIABLE_NAME[INDICES]... </pre>
set (-e | --erase) [SCOPE_OPTIONS] VARIABLE_NAME[INDICES]...
</pre>
The <code>set</code> builtin causes fish to assign the variable <code>VARIABLE_NAME</code> the values <code>VALUES...</code>.
@@ -15,7 +17,7 @@ The <code>set</code> builtin causes fish to assign the variable <code>VARIABLE_N
- <code>-l</code> or <code>--local</code> forces the specified environment variable to be given a scope that is local to the current block, even if a variable with the given name exists and is non-local
- <code>-g</code> or <code>--global</code> causes the specified environment variable to be given a global scope. Non-global variables disappear when the block they belong to ends
- <code>-U</code> or <code>--universal</code> causes the specified environment variable to be given a universal scope. If this option is supplied, the variable will be shared between all the current users fish instances on the current computer, and will be preserved across restarts of the shell.
- <code>-n</code> or <code>--names</code> List only the names of all defined variables
- <code>-n</code> or <code>--names</code> List only the names of all defined variables, not their value
- <code>-q</code> or <code>--query</code> test if the specified variable names are defined. Does not output anything, but the builtins exit status is the number of variables specified that were not defined.
- <code>-u</code> or <code>--unexport</code> causes the specified environment not to be exported to child processes
- <code>-x</code> or <code>--export</code> causes the specified environment variable to be exported to child processes

View File

@@ -1,5 +1,4 @@
\section set_color set_color - Set the terminal color
\section set_color set_color - set the terminal color
\subsection set_color-synopsis Synopsis
<tt>set_color [-v --version] [-h --help] [-b --background COLOR] [COLOR]</tt>

View File

@@ -1,4 +1,4 @@
\section source . - Evaluate contents of file.
\section source . - evaluate contents of file.
\subsection source-synopsis Synopsis
<tt>. FILENAME</tt>

View File

@@ -1,5 +1,4 @@
\section status status - Display fish runtime information
\section status status - query fish runtime information
\subsection status-synopsis Synopsis
<tt>status [OPTION]</tt>

View File

@@ -1,8 +1,7 @@
\section switch switch - conditionally execute a block of commands
\subsection switch-synopsis Synopsis
<tt>switch VALUE; [case [WILDCARD...]; [COMMANDS...];...] end</tt>
<tt>switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end</tt>
\subsection switch-description Description
@@ -22,12 +21,17 @@ Note that fish does not fall through on case statements. Though the
syntax may look a bit like C switch statements, it behaves more like
the case stamantes of traditional shells.
Also note that command substitutions in a case statement will be
evaluated even if it's body is not taken. This may seem
counterintuitive at first, but it is unavoidable, since it would be
impossible to know if a case command will evaluate to true before all
forms of parameter expansion have been performed for the case command.
\subsection switch-example Example
If the variable \$animal contains the name of an animal, the
following code would attempt to classify it:
If the variable \$animal contains the name of an animal, the following
code would attempt to classify it:
<p>
<pre>
switch $animal
case cat
@@ -42,10 +46,7 @@ switch $animal
echo I have no idea what a $animal is
end
</pre>
</p>
<p>
If the above code was run with \c \$animal set to \c whale, the output
would be \c mammal.
</p>

View File

@@ -1,4 +1,3 @@
\section trap trap - perform an action when the shell receives a signal
\subsection trap-synopsis Synopsis
@@ -7,8 +6,8 @@
\subsection trap-description Description
Trap is a shellscript wrapper around the fish event delivery
framework. IT is defined for backwards compatibility reasons. For
other uses, it is recommended to define a <a
framework. It exists for backwards compatibility with Posix
shells. For other uses, it is recommended to define a <a
href='index.html#event'>event handler</a>.
- ARG is the command to be executed on signal delivery

View File

@@ -1,5 +1,4 @@
\section type type - Indicate how a name would be interpreted if used as a command name
\section type type - indicate how a name would be interpreted if used as a command name
\subsection type-synopsis Synopsis
<tt>type [OPTIONS] name [name ...]</tt>

View File

@@ -1,28 +1,18 @@
\section ulimit ulimit - Set or get the shells resource usage limits
\section ulimit ulimit - set or get the shells resource usage limits
\subsection ulimit-synopsis Synopsis
<tt>ulimit [OPTIONS] [LIMIT]</tt>
\subsection ulimit-description Description
The ulimit builtin provides control over the resources available to
the shell and to processes started by it. The -H and -S options
specify that the hard or soft limit is set for the given resource. A
hard limit cannot be increased once it is set; a soft limit may be
increased up to the value of the hard limit. If neither -H nor -S is
specified, both the soft and hard limits are set. The value of limit
can be a number in the unit specified for the resource or one of the
special values hard, soft, or unlimited, which stand for the current
hard limit, the current soft limit, and no limit, respectively. If
limit is omitted, the current value of the soft limit of the resource
is printed, unless the -H option is given. When more than one
resource is specified, the limit name and unit are printed before the
value. Other options are interpreted as follows:
The ulimit builtin is used to set the resource usage limits of the
shell and any processes spawned by it. If a new limit value is
omitted, the current value of the limit of the resource is printed.
Use one of the following switches to specify which resource limit to set or report:
- <code>-a</code> or <code>--all</code> Set or get all current limits
- <code>-c</code> or <code>--core-size</code> The maximum size of core files created
- <code>-d</code> or <code>--data-size</code> The maximum size of a process’s data segment
- <code>-d</code> or <code>--data-size</code> The maximum size of a process's data segment
- <code>-f</code> or <code>--file-size</code> The maximum size of files created by the shell
- <code>-l</code> or <code>--lock-size</code> The maximum size that may be locked into memory
- <code>-m</code> or <code>--resident-set-size</code> The maximum resident set size
@@ -32,17 +22,41 @@ value. Other options are interpreted as follows:
- <code>-u</code> or <code>--process-count</code> The maximum number of processes available to a single user
- <code>-v</code> or <code>--virtual-memory-size</code> The maximum amount of virtual memory available to the shell. If supported by OS.
Note that not all these limits are available in all operating systems.
The value of limit can be a number in the unit specified for
the resource or one of the special values hard, soft, or unlimited,
which stand for the current hard limit, the current soft limit, and no
limit, respectively.
If limit is given, it is the new value of the specified resource. If
no option is given, then -f is assumed. Values are in kilobytes,
except for -t, which is in seconds and -n and -u, which are unscaled
values. The return status is 0 unless an invalid option or argument is
supplied, or an error occurs while setting a new limit.
The fish implementation of ulimit should behave identically to the implementation in bash, except for these differences:
ulimit also accepts the following switches that determine what type of limit to set:
- <code>-H</code> or <code>--hard</code> Set hard resource limit
- <code>-S</code> or <code>--soft</code> Set soft resource limit
A hard limit cannot be increased once it is set; a soft limit may be
increased up to the value of the hard limit. If neither -H nor -S is
specified, both the soft and hard limits are updated when assigning a
new limit value, and the soft limit is used when reporting the current
value.
The following additional options are also understood by ulimit:
- <code>-a</code> or <code>--all</code> Print all current limits
- <code>-h</code> or <code>--help</code> Display help and exit
The fish implementation of ulimit should behave identically to the
implementation in bash, except for these differences:
- Fish ulimit supports GNU-style long options for all switches
- Fish ulimit does not support the -p option for getting the pipe size. The bash implementation consists of a compile-time check that empirically guesses this number by writing to a pipe and waiting for SIGPIPE.
- Fish ulimit does not support getting the values of multiple limits in one command, except by using the -a switch
- Fish ulimit does not support the -p option for getting the pipe size. The bash implementation consists of a compile-time check that empirically guesses this number by writing to a pipe and waiting for SIGPIPE. Depending on bash version, there may also be further additional limits to set in bash that do not exist in fish.
- Fish ulimit does not support getting or setting multiple limits in one command, except reporting all values using the -a switch
\subsection ulimit-example Example

View File

@@ -1,5 +1,4 @@
\section umask umask - Set or get the shells resource usage limits
\section umask umask - set or get the shells resource usage limits
\subsection umask-synopsis Synopsis
<code>umask [OPTIONS] [MASK]</code>

View File

@@ -1,5 +1,4 @@
\section vared vared - Interactively edit the value of an environment variable
\section vared vared - interactively edit the value of an environment variable
\subsection vared-synopsis Synopsis
<tt>vared VARIABLE_NAME</tt>

View File

@@ -1,13 +1,19 @@
\section while while - perform a command multiple times
\subsection while-synopsis Synopsis
<tt>while CONDITION; COMMANDS; end</tt>
<tt>while CONDITION; COMMANDS...; end</tt>
\subsection while-synopsis Synopsis
The <tt>while</tt> builtin causes fish to continually execute the command COMMANDS while the command CONDITION returns with status 0.
\subsection while-description Description
The <tt>while</tt> builtin causes fish to continually execute CONDITION and
execute COMMANDS as long as CONDITION returned with status 0. If CONDITION is
false on the first time, COMMANDS will not be executed at all. Hints: use
<a href="#begin"><tt>begin; ...; end</tt></a> for complex conditions; more
complex control can be achieved with <tt>while true</tt> containing a
<a href="#break">break</a>.
\subsection while-example Example
<tt>while test -f foo.txt; echo file exists; sleep 10; end</tt>
causes fish to print the line 'file exists' at 10 second intervals as long as the file foo.txt exists.
causes fish to print the line 'file exists' at 10 second intervals as long as
the file foo.txt exists.

303
env.c
View File

@@ -1,7 +1,6 @@
/** \file env.c
Functions for setting and getting environment variables.
*/
#include "config.h"
#include <stdlib.h>
@@ -31,6 +30,10 @@
#include <ncurses/term.h>
#endif
#if HAVE_LIBINTL_H
#include <libintl.h>
#endif
#include <errno.h>
@@ -49,13 +52,13 @@
#include "env_universal.h"
#include "input_common.h"
#include "event.h"
#include "translate.h"
#include "complete.h"
/**
Command used to start fishd
*/
#define FISHD_CMD L"if which fishd >/dev/null; fishd ^/tmp/fishd.log.%s; end"
#define FISHD_CMD L"fishd ^/tmp/fishd.log.%s"
/**
Value denoting a null string
@@ -63,9 +66,13 @@
#define ENV_NULL L"\x1d"
/**
At init, we read all the environment variables from this array
At init, we read all the environment variables from this array.
*/
extern char **environ;
/**
This should be the same thing as \c environ, but it is possible only one of the two work...
*/
extern char **__environ;
/**
@@ -104,6 +111,8 @@ typedef struct env_node
typedef struct var_entry
{
int export; /**< Whether the variable should be exported */
size_t size; /**< The maximum length (excluding the NULL) that will fit into this var_entry_t */
#if __STDC_VERSION__ < 199901L
wchar_t val[1]; /**< The value of the variable */
#else
@@ -196,7 +205,9 @@ static void clear_hash_entry( void *key, void *data )
{
var_entry_t *entry = (var_entry_t *)data;
if( entry->export )
{
has_changed = 1;
}
free( (void *)key );
free( (void *)data );
@@ -251,8 +262,12 @@ static int is_locale( const wchar_t *key )
{
int i;
for( i=0; locale_variable[i]; i++ )
{
if( wcscmp(locale_variable[i], key ) == 0 )
{
return 1;
}
}
return 0;
}
@@ -297,24 +312,30 @@ static void handle_locale()
for( i=2; locale_variable[i]; i++ )
{
const wchar_t *val = env_get( locale_variable[i] );
if( val )
{
wsetlocale( cat[i], val );
}
}
}
if( wcscmp( wsetlocale( LC_MESSAGES, (void *)0 ), old ) != 0 )
{
/* Try to make change known to gettext. */
#ifdef HAVE__NL_MSG_CAT_CNTR
{
extern int _nl_msg_cat_cntr;
++_nl_msg_cat_cntr;
}
#elif HAVE_DCGETTEXT
dcgettext("fish","Changing language to English",LC_MESSAGES);
#endif
/*
Try to make change known to gettext. Both changing
_nl_msg_cat_cntr and calling dcgettext might potentially
tell some gettext implementation that the translation
strings should be reloaded. We do both and hope for the
best.
*/
extern int _nl_msg_cat_cntr;
_nl_msg_cat_cntr++;
dcgettext( "fish", "Changing language to English", LC_MESSAGES );
if( is_interactive )
{
debug( 0, _(L"Changing language to English") );
@@ -336,17 +357,24 @@ static void universal_callback( int type,
wchar_t *str=0;
if( is_locale( name ) )
{
handle_locale();
}
switch( type )
{
case SET:
case SET_EXPORT:
{
str=L"SET";
break;
}
case ERASE:
{
str=L"ERASE";
break;
}
}
if( str )
@@ -397,19 +425,27 @@ static void setup_path()
al_init( &l );
if( path )
{
tokenize_variable_array( path, &l );
}
for( j=0; path_el[j]; j++ )
{
int has_el=0;
for( i=0; i<al_get_count( &l); i++ )
{
wchar_t * el = (wchar_t *)al_get( &l, i );
size_t len = wcslen( el );
while( (len > 0) && (el[len-1]==L'/') )
{
len--;
if( (wcslen( path_el[j] ) == len) && (wcsncmp( el, path_el[j], len)==0) )
}
if( (wcslen( path_el[j] ) == len) &&
(wcsncmp( el, path_el[j], len)==0) )
{
has_el = 1;
}
@@ -447,12 +483,37 @@ static void setup_path()
al_destroy( &l );
}
static void env_set_defaults()
{
if( !env_get( L"USER" ) )
{
struct passwd *pw = getpwuid( getuid());
wchar_t *unam = str2wcs( pw->pw_name );
env_set( L"USER", unam, ENV_GLOBAL );
free( unam );
}
if( !env_get( L"HOME" ) )
{
wchar_t *unam = env_get( L"USER" );
char *unam_narrow = wcs2str( unam );
struct passwd *pw = getpwnam( unam_narrow );
wchar_t *dir = str2wcs( pw->pw_dir );
env_set( L"HOME", dir, ENV_GLOBAL );
free( dir );
free( unam_narrow );
}
}
void env_init()
{
char **p;
struct passwd *pw;
wchar_t *uname;
wchar_t *version;
sb_init( &dyn_var );
b_init( &export_buffer );
@@ -463,6 +524,7 @@ void env_init()
hash_put( &env_read_only, L"status", L"" );
hash_put( &env_read_only, L"history", L"" );
hash_put( &env_read_only, L"version", L"" );
hash_put( &env_read_only, L"_", L"" );
hash_put( &env_read_only, L"LINES", L"" );
hash_put( &env_read_only, L"COLUMNS", L"" );
@@ -493,7 +555,7 @@ void env_init()
hash_init( &top->env, &hash_wcs_func, &hash_wcs_cmp );
global_env = top;
global = &top->env;
/*
Now the environemnt variable handling is set up, the next step
is to insert valid data
@@ -502,7 +564,7 @@ void env_init()
/*
Import environment variables
*/
for( p=environ; *p; p++ )
for( p=environ?environ:__environ; p && *p; p++ )
{
wchar_t *key, *val;
wchar_t *pos;
@@ -510,13 +572,16 @@ void env_init()
key = str2wcs(*p);
if( !key )
{
continue;
}
val = wcschr( key, L'=' );
if( val == 0 )
{
env_set( key, L"", ENV_EXPORT );
}
else
{
*val = L'\0';
@@ -526,7 +591,9 @@ void env_init()
while( *pos )
{
if( *pos == L':' )
{
*pos = ARRAY_SEP;
}
pos++;
}
@@ -534,7 +601,7 @@ void env_init()
}
free(key);
}
/*
Set up the PATH variable
*/
@@ -550,12 +617,23 @@ void env_init()
env_set( L"USER", uname, ENV_GLOBAL | ENV_EXPORT );
free( uname );
}
/*
Set up the version variable
*/
version = str2wcs( PACKAGE_VERSION );
env_set( L"version", version, ENV_GLOBAL );
free( version );
env_universal_init( env_get( L"FISHD_SOCKET_DIR"),
env_get( L"USER" ),
&start_fishd,
&universal_callback );
/*
Set correct defaults for e.g. USER and HOME variables
*/
env_set_defaults();
}
void env_destroy()
@@ -567,8 +645,10 @@ void env_destroy()
b_destroy( &export_buffer );
while( &top->env != global )
{
env_pop();
}
hash_destroy( &env_read_only );
hash_destroy( &env_electric );
@@ -582,8 +662,8 @@ void env_destroy()
}
/**
Find the scope hashtable containing the variable with the specified
key
Search all visible scopes in order for the specified key. Return
the first scope in which it was found.
*/
static env_node_t *env_get_node( const wchar_t *key )
{
@@ -601,9 +681,13 @@ static env_node_t *env_get_node( const wchar_t *key )
}
if( env->new_scope )
{
env = global_env;
}
else
{
env = env->next;
}
}
return 0;
@@ -623,7 +707,7 @@ int env_set( const wchar_t *key,
event_t ev;
int is_universal = 0;
CHECK( key, ENV_INVALID );
if( (var_mode & ENV_USER ) &&
@@ -651,13 +735,15 @@ int env_set( const wchar_t *key,
}
}
/*
Do not actually create a umask variable, on env_get, it will be calculated dynamically
Do not actually create a umask variable, on env_get, it will
be calculated dynamically
*/
return 0;
}
/*
Zero element arrays are internaly not coded as null but as this placeholder string
Zero element arrays are internaly not coded as null but as this
placeholder string
*/
if( !val )
{
@@ -674,23 +760,17 @@ int env_set( const wchar_t *key,
env_universal_get_export( key );
}
else
{
export = (var_mode & ENV_EXPORT );
}
env_universal_set( key, val, export );
is_universal = 1;
}
else
{
if( val == 0 )
{
wchar_t *prev_val;
free_val = 1;
prev_val = env_get( key );
val = wcsdup( prev_val?prev_val:L"" );
}
node = env_get_node( key );
if( node && &node->env != 0 )
{
@@ -698,8 +778,9 @@ int env_set( const wchar_t *key,
key );
if( e->export )
{
has_changed_new = 1;
}
}
if( (var_mode & ENV_LOCAL) ||
@@ -735,8 +816,10 @@ int env_set( const wchar_t *key,
env_universal_get_export( key );
}
else
{
export = (var_mode & ENV_EXPORT );
}
env_universal_set( key, val, export );
is_universal = 1;
@@ -747,12 +830,15 @@ int env_set( const wchar_t *key,
{
/*
New variable with unspecified scope. The default
scope is the innermost scope that is shadowing
scope is the innermost scope that is shadowing,
which will be either the current function or the
global scope.
*/
node = top;
while( node->next && !node->new_scope )
{
node = node->next;
}
}
}
}
@@ -760,24 +846,59 @@ int env_set( const wchar_t *key,
if( !done )
{
void *k, *v;
hash_remove( &node->env, key, &k, &v );
free( k );
free( v );
var_entry_t *old_entry;
size_t val_len = wcslen(val);
entry = malloc( sizeof( var_entry_t ) +
sizeof(wchar_t )*(wcslen(val)+1));
if( var_mode & ENV_EXPORT)
hash_remove( &node->env, key, &k, &v );
/*
Try to reuse previous key string
*/
if( !k )
{
entry->export = 1;
has_changed_new = 1;
k = wcsdup(key);
}
old_entry = (var_entry_t *)v;
if( old_entry && old_entry->size >= val_len )
{
entry = old_entry;
if( !!(var_mode & ENV_EXPORT) || entry->export )
{
entry->export = !!(var_mode & ENV_EXPORT);
has_changed_new = 1;
}
}
else
entry->export = 0;
{
free( v );
entry = malloc( sizeof( var_entry_t ) +
sizeof(wchar_t )*(val_len+1));
if( !entry )
{
DIE_MEM();
}
entry->size = val_len;
if( var_mode & ENV_EXPORT)
{
entry->export = 1;
has_changed_new = 1;
}
else
{
entry->export = 0;
}
}
wcscpy( entry->val, val );
hash_put( &node->env, wcsdup(key), entry );
hash_put( &node->env, k, entry );
if( entry->export )
{
@@ -785,8 +906,10 @@ int env_set( const wchar_t *key,
}
if( free_val )
{
free((void *)val);
}
has_changed = has_changed_old || has_changed_new;
}
@@ -832,8 +955,10 @@ static int try_remove( env_node_t *n,
wchar_t *old_key, *old_val;
if( n == 0 )
{
return 0;
}
hash_remove( &n->env,
key,
&old_key_void,
@@ -856,12 +981,18 @@ static int try_remove( env_node_t *n,
}
if( var_mode & ENV_LOCAL )
{
return 0;
}
if( n->new_scope )
{
return try_remove( global_env, key, var_mode );
}
else
{
return try_remove( n->next, key, var_mode );
}
}
@@ -931,7 +1062,7 @@ wchar_t *env_get( const wchar_t *key )
wchar_t *item;
CHECK( key, 0 );
if( wcscmp( key, L"history" ) == 0 )
{
wchar_t *current;
@@ -946,22 +1077,22 @@ wchar_t *env_get( const wchar_t *key )
sb_append( &dyn_var, current );
}
for( i=add_current; i<8; i++ )
for( i=add_current;; i++ )
{
wchar_t *next = history_get( i-add_current );
if( !next )
{
/*
This is not an error - it simply means the user has
a short history
*/
break;
}
if( i!=0)
{
sb_append( &dyn_var, ARRAY_SEP_STR );
}
sb_append( &dyn_var, next );
}
return (wchar_t *)dyn_var.buff;
}
else if( wcscmp( key, L"COLUMNS" )==0 )
@@ -1000,13 +1131,19 @@ wchar_t *env_get( const wchar_t *key )
return 0;
}
else
{
return res->val;
}
}
if( env->new_scope )
{
env = global_env;
}
else
{
env = env->next;
}
}
if( !proc_had_barrier)
{
@@ -1021,7 +1158,9 @@ wchar_t *env_get( const wchar_t *key )
return 0;
}
else
{
return item;
}
}
int env_exist( const wchar_t *key, int mode )
@@ -1058,12 +1197,18 @@ int env_exist( const wchar_t *key, int mode )
}
if( mode & ENV_LOCAL )
{
break;
}
if( env->new_scope )
{
env = global_env;
}
else
{
env = env->next;
}
}
}
@@ -1276,16 +1421,31 @@ void env_get_names( array_list_t *l, int flags )
static void export_func1( void *k, void *v, void *aux )
{
var_entry_t *val_entry = (var_entry_t *)v;
if( val_entry->export )
{
hash_table_t *h = (hash_table_t *)aux;
if( !hash_get( h, k ) )
hash_put( h, k, val_entry->val );
hash_table_t *h = (hash_table_t *)aux;
hash_remove( h, k, 0, 0 );
if( val_entry->export && wcscmp( val_entry->val, ENV_NULL ) )
{
hash_put( h, k, val_entry->val );
}
}
static void get_exported( env_node_t *n, hash_table_t *h )
{
if( !n )
return;
if( n->new_scope )
get_exported( global_env, h );
else
get_exported( n->next, h );
hash_foreach2( &n->env, &export_func1, h );
}
/**
Function used by env_export_arr to iterate over hashtable of variables
*/
@@ -1338,7 +1498,6 @@ char **env_export_arr( int recalc )
{
array_list_t uni;
hash_table_t vals;
env_node_t *n=top;
int prev_was_null=1;
int pos=0;
int i;
@@ -1347,15 +1506,7 @@ char **env_export_arr( int recalc )
hash_init( &vals, &hash_wcs_func, &hash_wcs_cmp );
while( n )
{
hash_foreach2( &n->env, &export_func1, &vals );
if( n->new_scope )
n = global_env;
else
n = n->next;
}
get_exported( top, &vals );
al_init( &uni );
env_universal_get_names( &uni, 1, 0 );
@@ -1363,7 +1514,7 @@ char **env_export_arr( int recalc )
{
wchar_t *key = (wchar_t *)al_get( &uni, i );
wchar_t *val = env_universal_get( key );
if( !hash_get( &vals, key ) )
if( wcscmp( val, ENV_NULL) && !hash_get( &vals, key ) )
hash_put( &vals, key, val );
}
al_destroy( &uni );

7
env.h
View File

@@ -80,8 +80,8 @@ void env_destroy();
*/
int env_set( const wchar_t *key,
const wchar_t *val,
int mode );
const wchar_t *val,
int mode );
/**
@@ -94,7 +94,7 @@ int env_set( const wchar_t *key,
wchar_t *env_get( const wchar_t *key );
/**
Returns 1 if the specified key exists. This can't be reliable done
Returns 1 if the specified key exists. This can't be reliably done
using env_get, since env_get returns null for 0-element arrays
\param key The name of the variable to remove
@@ -129,7 +129,6 @@ char **env_export_arr( int recalc );
/**
Insert all variable names into l. These are not copies of the strings and should not be freed after use.
*/
void env_get_names( array_list_t *l, int flags );

View File

@@ -4,7 +4,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#include <strings.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
@@ -25,6 +25,10 @@
#include <ncurses/term.h>
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#include <signal.h>
#include "fallback.h"
@@ -66,6 +70,11 @@ static int barrier_reply = 0;
void env_universal_barrier();
static int is_dead()
{
return env_universal_server.fd < 0;
}
/**
Get a socket for reading from the server
@@ -136,18 +145,18 @@ static int get_socket( int fork_ok )
return get_socket( 0 );
}
debug( 2, L"Could not connect to socket %d, already tried manual restart (or no command supplied), giving up", s );
debug( 1, L"Could not connect to universal variable server, already tried manual restart (or no command supplied). You will not be able to share variable values between fish sessions. Is fish properly installed?" );
return -1;
}
if( fcntl( s, F_SETFL, O_NONBLOCK ) != 0 )
if( (fcntl( s, F_SETFL, O_NONBLOCK ) != 0) || (fcntl( s, F_SETFD, FD_CLOEXEC ) != 0) )
{
wperror( L"fcntl" );
close( s );
return -1;
}
debug( 3, L"Connected to fd %d", s );
return s;
@@ -160,7 +169,6 @@ static void callback( int type, const wchar_t *name, const wchar_t *val )
{
if( type == BARRIER_REPLY )
{
debug( 3, L"Got barrier reply" );
barrier_reply = 1;
}
else
@@ -190,11 +198,36 @@ static void check_connection()
env_universal_server.fd = -1;
env_universal_server.killme=0;
sb_clear( &env_universal_server.input );
env_universal_server.input.used=0;
env_universal_read_all();
}
}
/**
Remove all universal variables.
*/
static void env_universal_remove_all()
{
array_list_t lst;
int i;
al_init( &lst );
env_universal_common_get_names( &lst,
1,
1 );
for( i=0; i<al_get_count( &lst ); i++ )
{
wchar_t *key = (wchar_t *)al_get( &lst, i );
env_universal_common_remove( key );
}
al_destroy( &lst );
}
/**
Try to establish a new connection to fishd. If successfull, end
with call to env_universal_barrier(), to make sure everything is in
@@ -208,10 +241,12 @@ static void reconnect()
debug( 3, L"Get new fishd connection" );
init = 0;
env_universal_server.buffer_consumed = env_universal_server.buffer_used = 0;
env_universal_server.fd = get_socket(1);
init = 1;
if( env_universal_server.fd >= 0 )
{
env_universal_remove_all();
env_universal_barrier();
}
}
@@ -222,26 +257,21 @@ void env_universal_init( wchar_t * p,
void (*sf)(),
void (*cb)( int type, const wchar_t *name, const wchar_t *val ))
{
debug( 3, L"env_universal_init()" );
path=p;
user=u;
start_fishd=sf;
external_callback = cb;
connection_init( &env_universal_server, -1 );
env_universal_server.fd = -1;
env_universal_server.killme = 0;
env_universal_server.fd = get_socket(1);
memset (&env_universal_server.wstate, '\0', sizeof (mbstate_t));
q_init( &env_universal_server.unsent );
env_universal_common_init( &callback );
sb_init( &env_universal_server.input );
env_universal_read_all();
init = 1;
if( env_universal_server.fd >= 0 )
{
env_universal_barrier();
}
debug( 3, L"end env_universal_init()" );
}
void env_universal_destroy()
@@ -255,17 +285,11 @@ void env_universal_destroy()
{
wperror( L"fcntl" );
}
try_send_all( &env_universal_server );
try_send_all( &env_universal_server );
}
if( close( env_universal_server.fd ) )
{
wperror( L"close" );
}
connection_destroy( &env_universal_server );
env_universal_server.fd =-1;
q_destroy( &env_universal_server.unsent );
sb_destroy( &env_universal_server.input );
env_universal_common_destroy();
init = 0;
}
@@ -279,8 +303,6 @@ int env_universal_read_all()
if( !init)
return 0;
debug( 3, L"env_universal_read_all()" );
if( env_universal_server.fd == -1 )
{
reconnect();
@@ -308,7 +330,6 @@ wchar_t *env_universal_get( const wchar_t *name )
CHECK( name, 0 );
debug( 3, L"env_universal_get( \"%ls\" )", name );
return env_universal_common_get( name );
}
@@ -319,7 +340,6 @@ int env_universal_get_export( const wchar_t *name )
CHECK( name, 0 );
debug( 3, L"env_universal_get_export()" );
return env_universal_common_get_export( name );
}
@@ -328,7 +348,7 @@ void env_universal_barrier()
message_t *msg;
fd_set fds;
if( !init || ( env_universal_server.fd == -1 ))
if( !init || is_dead() )
return;
barrier_reply = 0;
@@ -363,7 +383,7 @@ void env_universal_barrier()
FD_SET( env_universal_server.fd, &fds );
select( env_universal_server.fd+1, 0, &fds, 0, 0 );
}
/*
Wait for barrier reply
*/
@@ -395,20 +415,27 @@ void env_universal_set( const wchar_t *name, const wchar_t *value, int export )
CHECK( name, );
debug( 3, L"env_universal_set( \"%ls\", \"%ls\" )", name, value );
msg = create_message( export?SET_EXPORT:SET,
name,
value);
if( !msg )
if( is_dead() )
{
debug( 1, L"Could not create universal variable message" );
return;
env_universal_common_set( name, value, export );
}
else
{
msg = create_message( export?SET_EXPORT:SET,
name,
value);
if( !msg )
{
debug( 1, L"Could not create universal variable message" );
return;
}
msg->count=1;
q_put( &env_universal_server.unsent, msg );
env_universal_barrier();
}
msg->count=1;
q_put( &env_universal_server.unsent, msg );
env_universal_barrier();
}
int env_universal_remove( const wchar_t *name )
@@ -422,16 +449,22 @@ int env_universal_remove( const wchar_t *name )
CHECK( name, 1 );
res = !env_universal_common_get( name );
debug( 3,
L"env_universal_remove( \"%ls\" )",
name );
msg= create_message( ERASE, name, 0);
msg->count=1;
q_put( &env_universal_server.unsent, msg );
env_universal_barrier();
if( is_dead() )
{
env_universal_common_remove( name );
}
else
{
msg= create_message( ERASE, name, 0);
msg->count=1;
q_put( &env_universal_server.unsent, msg );
env_universal_barrier();
}
return res;
}
@@ -441,6 +474,8 @@ void env_universal_get_names( array_list_t *l,
{
if( !init )
return;
CHECK( l, );
env_universal_common_get_names( l,
show_exported,

View File

@@ -1,5 +1,5 @@
/** \file env_universal.h
Universal variable client library
Universal variable client library.
*/
#ifndef ENV_UNIVERSAL_H

View File

@@ -11,7 +11,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#include <strings.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
@@ -21,6 +21,7 @@
#include <sys/stat.h>
#include <dirent.h>
#include <wctype.h>
#include <iconv.h>
#include <errno.h>
#include <locale.h>
@@ -28,6 +29,10 @@
#include <signal.h>
#include <sys/stat.h>
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#include "fallback.h"
#include "util.h"
@@ -65,6 +70,21 @@
*/
#define PARSE_ERR L"Unable to parse universal variable message: '%ls'"
/**
ERROR string for internal buffered reader
*/
#define ENV_UNIVERSAL_ERROR 0x100
/**
EAGAIN string for internal buffered reader
*/
#define ENV_UNIVERSAL_AGAIN 0x101
/**
EOF string for internal buffered reader
*/
#define ENV_UNIVERSAL_EOF 0x102
/**
A variable entry. Stores the value of a variable and whether it
should be exported. Obviously, it needs to be allocated large
@@ -106,9 +126,163 @@ static int get_names_show_exported;
static int get_names_show_unexported;
wchar_t *utf2wcs( const char *in )
{
iconv_t cd=(iconv_t) -1;
int i,j;
wchar_t *out;
char *to_name[]=
{
"wchar_t", "WCHAR_T", "wchar", "WCHAR", 0
}
;
char *from_name[]=
{
"utf-8", "UTF-8", "utf8", "UTF8", 0
}
;
size_t in_len = strlen( in );
size_t out_len = sizeof( wchar_t )*(in_len+1);
size_t nconv;
char *nout;
out = malloc( out_len );
nout = (char *)out;
if( !out )
return 0;
for( i=0; to_name[i]; i++ )
{
for( j=0; from_name[j]; j++ )
{
cd = iconv_open ( to_name[i], from_name[j] );
if( cd != (iconv_t) -1)
{
goto start_conversion;
}
}
}
start_conversion:
if (cd == (iconv_t) -1)
{
/* Something went wrong. */
debug( 0, L"Could not perform utf-8 conversion" );
if(errno != EINVAL)
wperror( L"iconv_open" );
/* Terminate the output string. */
free(out);
return 0;
}
nconv = iconv( cd, (char **)&in, &in_len, &nout, &out_len );
if (nconv == (size_t) -1)
{
debug( 0, L"Error while converting from utf string" );
return 0;
}
*((wchar_t *) nout) = L'\0';
if (iconv_close (cd) != 0)
wperror (L"iconv_close");
return out;
}
char *wcs2utf( const wchar_t *in )
{
iconv_t cd=(iconv_t) -1;
int i,j;
char *char_in = (char *)in;
char *out;
char *from_name[]=
{
"wchar_t", "WCHAR_T", "wchar", "WCHAR", 0
}
;
char *to_name[]=
{
"utf-8", "UTF-8", "utf8", "UTF8", 0
}
;
size_t in_len = wcslen( in );
size_t out_len = sizeof( char )*( (MAX_UTF8_BYTES*in_len)+1);
size_t nconv;
char *nout;
out = malloc( out_len );
nout = (char *)out;
in_len *= sizeof( wchar_t );
if( !out )
return 0;
for( i=0; to_name[i]; i++ )
{
for( j=0; from_name[j]; j++ )
{
cd = iconv_open ( to_name[i], from_name[j] );
if( cd != (iconv_t) -1)
{
goto start_conversion;
}
}
}
start_conversion:
if (cd == (iconv_t) -1)
{
/* Something went wrong. */
debug( 0, L"Could not perform utf-8 conversion" );
if(errno != EINVAL)
wperror( L"iconv_open" );
/* Terminate the output string. */
free(out);
return 0;
}
nconv = iconv( cd, &char_in, &in_len, &nout, &out_len );
if (nconv == (size_t) -1)
{
debug( 0, L"%d %d", in_len, out_len );
debug( 0, L"Error while converting from to string" );
return 0;
}
*nout = '\0';
if (iconv_close (cd) != 0)
wperror (L"iconv_close");
return out;
}
void env_universal_common_init( void (*cb)(int type, const wchar_t *key, const wchar_t *val ) )
{
debug( 3, L"Init env_universal_common" );
callback = cb;
hash_init( &env_universal_var, &hash_wcs_func, &hash_wcs_cmp );
}
@@ -130,69 +304,118 @@ void env_universal_common_destroy()
hash_destroy( &env_universal_var );
}
static int read_byte( connection_t *src )
{
if( src->buffer_consumed >= src->buffer_used )
{
int res;
res = read( src->fd, src->buffer, ENV_UNIVERSAL_BUFFER_SIZE );
// debug(4, L"Read chunk '%.*s'", res, src->buffer );
if( res < 0 )
{
if( errno == EAGAIN ||
errno == EINTR )
{
return ENV_UNIVERSAL_AGAIN;
}
return ENV_UNIVERSAL_ERROR;
}
if( res == 0 )
{
return ENV_UNIVERSAL_EOF;
}
src->buffer_consumed = 0;
src->buffer_used = res;
}
return src->buffer[src->buffer_consumed++];
}
void read_message( connection_t *src )
{
while( 1 )
{
char b;
int read_res = read( src->fd, &b, 1 );
wchar_t res=0;
if( read_res < 0 )
int ib = read_byte( src );
char b;
switch( ib )
{
if( errno != EAGAIN &&
errno != EINTR )
case ENV_UNIVERSAL_AGAIN:
{
return;
}
case ENV_UNIVERSAL_ERROR:
{
debug( 2, L"Read error on fd %d, set killme flag", src->fd );
wperror( L"read" );
if( debug_level > 2 )
wperror( L"read" );
src->killme = 1;
return;
}
return;
}
if( read_res == 0 )
{
src->killme = 1;
debug( 3, L"Fd %d has reached eof, set killme flag", src->fd );
if( src->input.used > 0 )
case ENV_UNIVERSAL_EOF:
{
debug( 1,
L"Universal variable connection closed while reading command. Partial command recieved: '%ls'",
(wchar_t *)src->input.buff );
src->killme = 1;
debug( 3, L"Fd %d has reached eof, set killme flag", src->fd );
if( src->input.used > 0 )
{
char c = 0;
b_append( &src->input, &c, 1 );
debug( 1,
L"Universal variable connection closed while reading command. Partial command recieved: '%s'",
(wchar_t *)src->input.buff );
}
return;
}
return;
}
int sz = mbrtowc( &res, &b, 1, &src->wstate );
b = (char)ib;
if( sz == -1 )
{
debug( 1, L"Error while reading universal variable after '%ls'", (wchar_t *)src->input.buff );
wperror( L"mbrtowc" );
}
else if( sz > 0 )
if( b == '\n' )
{
if( res == L'\n' )
wchar_t *msg;
b = 0;
b_append( &src->input, &b, 1 );
msg = utf2wcs( src->input.buff );
/*
Before calling parse_message, we must empty reset
everything, since the callback function could
potentially call read_message.
*/
src->input.used=0;
if( msg )
{
/*
Before calling parse_message, we must empty reset
everything, since the callback function could
potentially call read_message.
*/
wchar_t *msg = wcsdup( (wchar_t *)src->input.buff );
sb_clear( &src->input );
memset (&src->wstate, '\0', sizeof (mbstate_t));
parse_message( msg, src );
free( msg );
}
else
{
sb_append_char( &src->input, res );
debug( 0, _(L"Could not convert message '%s' to wide character string"), src->input.buff );
}
free( msg );
}
else
{
b_append( &src->input, &b, 1 );
}
}
}
@@ -200,7 +423,7 @@ void read_message( connection_t *src )
/**
Remove variable with specified name
*/
static void remove_entry( wchar_t *name )
void env_universal_common_remove( const wchar_t *name )
{
void *k, *v;
hash_remove( &env_universal_var,
@@ -226,20 +449,48 @@ static int match( const wchar_t *msg, const wchar_t *cmd )
return 1;
}
void env_universal_common_set( const wchar_t *key, const wchar_t *val, int export )
{
var_uni_entry_t *entry;
wchar_t *name;
CHECK( key, );
CHECK( val, );
entry = malloc( sizeof(var_uni_entry_t) + sizeof(wchar_t)*(wcslen(val)+1) );
name = wcsdup(key);
if( !entry || !name )
DIE_MEM();
entry->export=export;
wcscpy( entry->val, val );
env_universal_common_remove( name );
hash_put( &env_universal_var, name, entry );
if( callback )
{
callback( export?SET_EXPORT:SET, name, val );
}
}
/**
Parse message msg
*/
static void parse_message( wchar_t *msg,
connection_t *src )
{
debug( 3, L"parse_message( %ls );", msg );
// debug( 3, L"parse_message( %ls );", msg );
if( msg[0] == L'#' )
return;
if( match( msg, SET_STR ) || match( msg, SET_EXPORT_STR ))
{
wchar_t *name, *val, *tmp;
wchar_t *name, *tmp;
int export = match( msg, SET_EXPORT_STR );
name = msg+(export?wcslen(SET_EXPORT_STR):wcslen(SET_STR));
@@ -249,31 +500,20 @@ static void parse_message( wchar_t *msg,
tmp = wcschr( name, L':' );
if( tmp )
{
wchar_t *key =malloc( sizeof( wchar_t)*(tmp-name+1));
wchar_t *key;
wchar_t *val;
key = malloc( sizeof( wchar_t)*(tmp-name+1));
memcpy( key, name, sizeof( wchar_t)*(tmp-name));
key[tmp-name]=0;
val = tmp+1;
val = unescape( val, 0 );
var_uni_entry_t *entry =
malloc( sizeof(var_uni_entry_t) + sizeof(wchar_t)*(wcslen(val)+1) );
if( !entry )
DIE_MEM();
entry->export=export;
env_universal_common_set( key, val, export );
wcscpy( entry->val, val );
remove_entry( key );
hash_put( &env_universal_var, key, entry );
if( callback )
{
callback( export?SET_EXPORT:SET, key, val );
}
free(val );
free( val );
free( key );
}
else
{
@@ -299,7 +539,7 @@ static void parse_message( wchar_t *msg,
debug( 1, PARSE_ERR, msg );
}
remove_entry( name );
env_universal_common_remove( name );
if( callback )
{
@@ -339,7 +579,16 @@ static int try_send( message_t *msg,
L"before write of %d chars to fd %d", strlen(msg->body), fd );
int res = write( fd, msg->body, strlen(msg->body) );
if( res != -1 )
{
debug( 4, L"Wrote message '%s'", msg->body );
}
else
{
debug( 4, L"Failed to write message '%s'", msg->body );
}
if( res == -1 )
{
switch( errno )
@@ -348,10 +597,11 @@ static int try_send( message_t *msg,
return 0;
default:
debug( 1,
debug( 2,
L"Error while sending universal variable message to fd %d. Closing connection",
fd );
wperror( L"write" );
if( debug_level > 2 )
wperror( L"write" );
return -1;
}
@@ -367,9 +617,9 @@ static int try_send( message_t *msg,
void try_send_all( connection_t *c )
{
debug( 3,
/* debug( 3,
L"Send all updates to connection on fd %d",
c->fd );
c->fd );*/
while( !q_empty( &c->unsent) )
{
switch( try_send( (message_t *)q_peek( &c->unsent), c->fd ) )
@@ -379,7 +629,7 @@ void try_send_all( connection_t *c )
break;
case 0:
debug( 1,
debug( 4,
L"Socket full, send rest later" );
return;
@@ -390,6 +640,33 @@ void try_send_all( connection_t *c )
}
}
static wchar_t *full_escape( const wchar_t *in )
{
string_buffer_t out;
sb_init( &out );
for( ; *in; in++ )
{
if( *in < 32 )
{
sb_printf( &out, L"\\x%.2x", *in );
}
else if( *in < 128 )
{
sb_append_char( &out, *in );
}
else if( *in < 65536 )
{
sb_printf( &out, L"\\u%.4x", *in );
}
else
{
sb_printf( &out, L"\\U%.8x", *in );
}
}
return (wchar_t *)out.buff;
}
message_t *create_message( int type,
const wchar_t *key_in,
const wchar_t *val_in )
@@ -398,10 +675,18 @@ message_t *create_message( int type,
char *key=0;
size_t sz;
// debug( 4, L"Crete message of type %d", type );
if( key_in )
{
key = wcs2str(key_in);
if( wcsvarname( key_in ) )
{
debug( 0, L"Illegal variable name: '%ls'", key_in );
return 0;
}
key = wcs2utf(key_in);
if( !key )
{
debug( 0,
@@ -422,11 +707,11 @@ message_t *create_message( int type,
val_in=L"";
}
wchar_t *esc = escape(val_in,1);
wchar_t *esc = full_escape( val_in );
if( !esc )
break;
char *val = wcs2str(esc );
char *val = wcs2utf(esc );
free(esc);
sz = strlen(type==SET?SET_MBS:SET_EXPORT_MBS) + strlen(key) + strlen(val) + 4;
@@ -491,6 +776,9 @@ message_t *create_message( int type,
if( msg )
msg->count=0;
// debug( 4, L"Message body is '%s'", msg->body );
return msg;
}
@@ -568,3 +856,30 @@ void enqueue_all( connection_t *c )
try_send_all( c );
}
void connection_init( connection_t *c, int fd )
{
memset (c, 0, sizeof (connection_t));
c->fd = fd;
b_init( &c->input );
q_init( &c->unsent );
c->buffer_consumed = c->buffer_used = 0;
}
void connection_destroy( connection_t *c)
{
q_destroy( &c->unsent );
b_destroy( &c->input );
/*
A connection need not always be open - we only try to close it
if it is open.
*/
if( c->fd >= 0 )
{
if( close( c->fd ) )
{
wperror( L"close" );
}
}
}

View File

@@ -49,6 +49,11 @@ enum
}
;
/**
The size of the buffer used for reading from the socket
*/
#define ENV_UNIVERSAL_BUFFER_SIZE 1024
/**
This struct represents a connection between a universal variable server/client
*/
@@ -66,16 +71,28 @@ typedef struct connection
Set to one when this connection should be killed
*/
int killme;
/**
The state used for character conversions
*/
mbstate_t wstate;
/**
The input string. Input from the socket goes here. When a
newline is encountered, the buffer is parsed and cleared.
*/
string_buffer_t input;
buffer_t input;
/**
The read buffer.
*/
char buffer[ENV_UNIVERSAL_BUFFER_SIZE];
/**
Number of bytes that have already been consumed.
*/
int buffer_consumed;
/**
Number of bytes that have been read into the buffer.
*/
int buffer_used;
/**
Link to the next connection
*/
@@ -126,19 +143,50 @@ void env_universal_common_destroy();
/**
Add all variable names to the specified list
This function operate agains the local copy of all universal
variables, it does not communicate with any other process.
*/
void env_universal_common_get_names( array_list_t *l,
int show_exported,
int show_unexported );
/**
Perform the specified variable assignment.
This function operate agains the local copy of all universal
variables, it does not communicate with any other process.
Do not call this function. Create a message to do it. This function
is only to be used when fishd is dead.
*/
void env_universal_common_set( const wchar_t *key, const wchar_t *val, int export );
/**
Remove the specified variable.
This function operate agains the local copy of all universal
variables, it does not communicate with any other process.
Do not call this function. Create a message to do it. This function
is only to be used when fishd is dead.
*/
void env_universal_common_remove( const wchar_t *key );
/**
Get the value of the variable with the specified name
This function operate agains the local copy of all universal
variables, it does not communicate with any other process.
*/
wchar_t *env_universal_common_get( const wchar_t *name );
/**
Get the export flag of the variable with the specified
name. Returns 0 if the variable doesn't exist.
This function operate agains the local copy of all universal
variables, it does not communicate with any other process.
*/
int env_universal_common_get_export( const wchar_t *name );
@@ -147,5 +195,17 @@ int env_universal_common_get_export( const wchar_t *name );
*/
void enqueue_all( connection_t *c );
/**
Fill in the specified connection_t struct. Use the specified file
descriptor for communication.
*/
void connection_init( connection_t *c, int fd );
/**
Close and destroy the specified connection struct. This frees
allstructures allocated by the connection, such as ques of unsent
messages.
*/
void connection_destroy( connection_t *c);
#endif

View File

@@ -3,13 +3,6 @@
#
# @configure_input@
#
# Set default search paths for completions and shellscript functions
#
set -g fish_function_path ~/.fish.d/functions @SYSCONFDIR@/fish.d/functions @DATADIR@/fish/functions
set -g fish_complete_path ~/.fish.d/completions @SYSCONFDIR@/fish.d/completions @DATADIR@/fish/completions
#
# Set default field separators
#
@@ -66,6 +59,8 @@ end
# Load additional initialization files
#
for i in fish.d/*.fish
. $i
end
if test -d include
for i in include/*.fish
. $i
end
end

View File

@@ -1,110 +0,0 @@
#
# Initializations that should only be performed when in interactive mode
#
# @configure_input@
if not status --is-interactive
exit
end
#
# Print a greeting
#
printf (_ 'Welcome to fish, the friendly interactive shell\n')
printf (_ 'Type %shelp%s for instructions on how to use fish\n') (set_color green) (set_color normal)
#
# Set exit message
#
function fish_on_exit -d (_ "Commands to execute when fish exits") --on-process %self
printf (_ "Good bye\n")
end
#
# Set INPUTRC to something nice
#
# We override INPUTRC if already set, since it may be set by a shell
# other than fish, which may use a different file. The new value should
# be exported, since the fish inputrc file plays nice with other files
# by including them when found.
# Give priority to the default file installed with fish in
# @SYSCONFDIR@/fish_inputrc.
#
for i in ~/.fish_inputrc @SYSCONFDIR@/fish_inputrc ~/.inputrc /etc/inputrc
if test -f $i
set -xg INPUTRC $i
break
end
end
#
# Set various defaults using these throwaway functions
#
function set_default -d "Set an universal variable, unless it has already been set"
if not set -q $argv[1]
set -U -- $argv
end
if not set -q $argv[1]
set -g -- $argv
end
end
function set_exported_default -d "Set an exported universal variable, unless it has already been set"
if not set -q $argv[1]
set -Ux -- $argv
end
if not set -q $argv[1]
set -gx -- $argv
end
end
# Regular syntax highlighting colors
set_default fish_color_normal normal
set_default fish_color_command green
set_default fish_color_redirection normal
set_default fish_color_comment red
set_default fish_color_error red --bold
set_default fish_color_escape cyan
set_default fish_color_operator cyan
set_default fish_color_quote brown
set_default fish_color_valid_path --underline
set_default fish_color_cwd green
# Background color for matching quotes and parenthesis
set_default fish_color_match cyan
# Background color for search matches
set_default fish_color_search_match purple
# Pager colors
set_default fish_pager_color_prefix cyan
set_default fish_pager_color_completion normal
set_default fish_pager_color_description normal
set_default fish_pager_color_progress cyan
#
# Directory history colors
#
set_default fish_color_history_current cyan
#
# Setup the CDPATH variable
#
set_default CDPATH . ~
#
# Remove temporary functions for setting default variable values
#
functions -e set_exported_default
functions -e set_default

30
event.c
View File

@@ -3,6 +3,8 @@
Functions for handling event triggers
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -11,8 +13,6 @@
#include <signal.h>
#include <string.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
@@ -23,7 +23,7 @@
#include "common.h"
#include "event.h"
#include "signal.h"
#include "translate.h"
#include "halloc_util.h"
/**
@@ -391,9 +391,9 @@ static int event_is_killed( event_t *e )
/**
Perform the specified event. Since almost all event firings will
not match a single event handler, we make sureto optimize the 'no
matches' path. This means that nothing is allocated/initialized
unless that is needed.
not be matched by even a single event handler, we make sure to
optimize the 'no matches' path. This means that nothing is
allocated/initialized unless needed.
*/
static void event_fire_internal( event_t *event )
{
@@ -444,7 +444,8 @@ static void event_fire_internal( event_t *event )
for( i=0; i<al_get_count( fire ); i++ )
{
event_t *criterion = (event_t *)al_get( fire, i );
int prev_status;
/*
Check if this event has been removed, if so, dont fire it
*/
@@ -473,14 +474,16 @@ static void event_fire_internal( event_t *event )
/*
Event handlers are not part of the main flow of code, so
they are marked as non-interactive and as a subshell
they are marked as non-interactive
*/
proc_push_interactive(0);
prev_status = proc_get_last_status();
parser_push_block( EVENT );
current_block->param1.event = event;
eval( (wchar_t *)b->buff, 0, TOP );
parser_pop_block();
proc_pop_interactive();
proc_set_last_status( prev_status );
}
if( b )
@@ -510,6 +513,13 @@ static void event_fire_delayed()
int i;
/*
If is_event is one, we are running the event-handler non-recursively.
When the event handler has called a piece of code that triggers
another event, we do not want to fire delayed events because of
concurrency problems.
*/
if( blocked && is_event==1)
{
array_list_t *new_blocked = 0;
@@ -533,7 +543,7 @@ static void event_fire_delayed()
free( blocked );
blocked = new_blocked;
}
while( sig_list[active_list].count > 0 )
{
signal_list_t *lst;
@@ -594,7 +604,7 @@ void event_fire( event_t *event )
/*
This means we are in a signal handler. We must be very
careful not do do anything that could cause a memory
allocation or something else that might be illegal in a
allocation or something else that might be bad when in a
signal handler.
*/
if( sig_list[active_list].count < SIG_UNHANDLED_MAX )

649
exec.c

File diff suppressed because it is too large Load Diff

4
exec.h
View File

@@ -51,8 +51,8 @@ void exec( job_t *j );
\return the status of the last job to exit, or -1 if en error was encountered.
*/
int exec_subshell( const wchar_t *cmd,
array_list_t *l );
__warn_unused int exec_subshell( const wchar_t *cmd,
array_list_t *l );
/**

478
expand.c
View File

@@ -5,6 +5,8 @@ parameter expansion.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -26,8 +28,6 @@ parameter expansion.
#include <procfs.h>
#endif
#include "config.h"
#include "fallback.h"
#include "util.h"
@@ -42,10 +42,31 @@ parameter expansion.
#include "signal.h"
#include "tokenizer.h"
#include "complete.h"
#include "translate.h"
#include "parse_util.h"
#include "halloc.h"
#include "halloc_util.h"
/**
Error issued on invalid variable name
*/
#define COMPLETE_VAR_DESC _( L"The '$' character begins a variable name. The character '%lc', which directly followed a '$', is not allowed as a part of a variable name, and variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'.")
/**
Error issued on invalid variable name
*/
#define COMPLETE_VAR_NULL_DESC _( L"The '$' begins a variable name. It was given at the end of an argument. Variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'.")
/**
Error issued on invalid variable name
*/
#define COMPLETE_VAR_BRACKET_DESC _( L"Did you mean %ls{$%ls}%ls? The '$' character begins a variable name. A bracket, which directly followed a '$', is not allowed as a part of a variable name, and variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'." )
/**
Error issued on invalid variable name
*/
#define COMPLETE_VAR_PARAN_DESC _( L"Did you mean (COMMAND)? In fish, the '$' character is only used for accessing variables. To learn more about command substitution in fish, type 'help expand-command-substitution'.")
/**
Description for child process
*/
@@ -251,16 +272,18 @@ static int iswnumeric( const wchar_t *n )
*/
static int match_pid( const wchar_t *cmd,
const wchar_t *proc,
int flags )
int flags,
int *offset)
{
/* Test for direct match */
if( wcsncmp( cmd, proc, wcslen( proc ) ) == 0 )
{
if( offset )
*offset = 0;
return 1;
if( flags & ACCEPT_INCOMPLETE )
return 0;
}
/*
Test if the commandline is a path to the command, if so we try
to match against only the command part
@@ -288,7 +311,11 @@ static int match_pid( const wchar_t *cmd,
if( wcsncmp( start+1, proc, wcslen( proc ) ) == 0 )
{
if( offset )
*offset = start+1-first_token;
free( first_token );
return 1;
}
}
@@ -360,8 +387,12 @@ static int find_process( const wchar_t *proc,
else
{
int jid = wcstol( proc, 0, 10 );
if( jid > 0 )
int jid;
wchar_t *end;
errno = 0;
jid = wcstol( proc, &end, 10 );
if( jid > 0 && !errno && !*end )
{
j = job_get( jid );
if( (j != 0) && (j->command != 0 ) )
@@ -382,14 +413,16 @@ static int find_process( const wchar_t *proc,
for( j=first_job; j != 0; j=j->next )
{
int offset;
if( j->command == 0 )
continue;
if( match_pid( j->command, proc, flags ) )
if( match_pid( j->command, proc, flags, &offset ) )
{
if( flags & ACCEPT_INCOMPLETE )
{
wchar_t *res = wcsdupcat2( j->command + wcslen(proc),
wchar_t *res = wcsdupcat2( j->command + offset + wcslen(proc),
COMPLETE_SEP_STR,
COMPLETE_JOB_DESC,
(void *)0 );
@@ -417,15 +450,16 @@ static int find_process( const wchar_t *proc,
continue;
for( p=j->first_process; p; p=p->next )
{
int offset;
if( p->actual_cmd == 0 )
continue;
if( match_pid( p->actual_cmd, proc, flags ) )
if( match_pid( p->actual_cmd, proc, flags, &offset ) )
{
if( flags & ACCEPT_INCOMPLETE )
{
wchar_t *res = wcsdupcat2( p->actual_cmd + wcslen(proc),
wchar_t *res = wcsdupcat2( p->actual_cmd + offset + wcslen(proc),
COMPLETE_SEP_STR,
COMPLETE_CHILD_PROCESS_DESC,
(void *)0);
@@ -535,16 +569,19 @@ static int find_process( const wchar_t *proc,
if( cmd != 0 )
{
if( match_pid( cmd, proc, flags ) )
int offset;
if( match_pid( cmd, proc, flags, &offset ) )
{
if( flags & ACCEPT_INCOMPLETE )
{
wchar_t *res = wcsdupcat2( cmd + wcslen(proc),
wchar_t *res = wcsdupcat2( cmd + offset + wcslen(proc),
COMPLETE_SEP_STR,
COMPLETE_PROCESS_DESC,
(void *)0);
if( res )
al_push( out, res );
}
else
{
@@ -575,12 +612,9 @@ static int expand_pid( wchar_t *in,
array_list_t *out )
{
if( !in || !out)
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
return 0;
}
CHECK( in, 0 );
CHECK( out, 0 );
if( *in != PROCESS_EXPAND )
{
al_push( out, in );
@@ -637,8 +671,8 @@ static int expand_pid( wchar_t *in,
free( in );
else
{
*in = L'%';
al_push( out, in );
free(in);
return 0;
}
}
else
@@ -649,6 +683,132 @@ static int expand_pid( wchar_t *in,
return 1;
}
void expand_variable_error( const wchar_t *token, int token_pos, int error_pos )
{
int stop_pos = token_pos+1;
switch( token[stop_pos] )
{
case BRACKET_BEGIN:
{
wchar_t *cpy = wcsdup( token );
*(cpy+token_pos)=0;
wchar_t *name = &cpy[stop_pos+1];
wchar_t *end = wcschr( name, BRACKET_END );
wchar_t *post;
int is_var=0;
if( end )
{
post = end+1;
*end = 0;
if( !wcsvarname( name ) )
{
is_var = 1;
}
}
if( is_var )
{
error( SYNTAX_ERROR,
error_pos,
COMPLETE_VAR_BRACKET_DESC,
cpy,
name,
post );
}
else
{
error( SYNTAX_ERROR,
error_pos,
COMPLETE_VAR_BRACKET_DESC,
L"",
L"VARIABLE",
L"" );
}
free( cpy );
break;
}
case INTERNAL_SEPARATOR:
{
error( SYNTAX_ERROR,
error_pos,
COMPLETE_VAR_PARAN_DESC );
break;
}
case 0:
{
error( SYNTAX_ERROR,
error_pos,
COMPLETE_VAR_NULL_DESC );
break;
}
default:
{
error( SYNTAX_ERROR,
error_pos,
COMPLETE_VAR_DESC,
token[stop_pos] );
break;
}
}
}
static int parse_slice( wchar_t *in, wchar_t **end_ptr, array_list_t *idx )
{
wchar_t *end;
int pos = 1;
// debug( 0, L"parse_slice on '%ls'", in );
while( 1 )
{
long tmp;
while( iswspace(in[pos]) || (in[pos]==INTERNAL_SEPARATOR))
pos++;
if( in[pos] == L']' )
{
pos++;
break;
}
errno=0;
tmp = wcstol( &in[pos], &end, 10 );
if( ( errno ) || ( end == &in[pos] ) )
{
return 1;
}
// debug( 0, L"Push idx %d", tmp );
al_push_long( idx, tmp );
pos = end-in;
}
if( end_ptr )
{
// debug( 0, L"Remainder is '%ls', slice def was %d characters long", in+pos, pos );
*end_ptr = in+pos;
}
// debug( 0, L"ok, done" );
return 0;
}
/**
Expand all environment variables in the string *ptr.
@@ -674,12 +834,9 @@ static int expand_variables( wchar_t *in, array_list_t *out, int last_idx )
static string_buffer_t *var_tmp = 0;
static array_list_t *var_idx_list = 0;
if( !in || !out)
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
return 0;
}
CHECK( in, 0 );
CHECK( out, 0 );
if( !var_tmp )
{
var_tmp = sb_halloc( global_context );
@@ -735,43 +892,8 @@ static int expand_variables( wchar_t *in, array_list_t *out, int last_idx )
if( var_len == 0 )
{
switch( in[stop_pos] )
{
case BRACKET_BEGIN:
{
error( SYNTAX_ERROR,
-1,
COMPLETE_VAR_BRACKET_DESC );
break;
}
case INTERNAL_SEPARATOR:
{
error( SYNTAX_ERROR,
-1,
COMPLETE_VAR_PARAN_DESC );
break;
}
case 0:
{
error( SYNTAX_ERROR,
-1,
COMPLETE_VAR_NULL_DESC );
break;
}
default:
{
error( SYNTAX_ERROR,
-1,
COMPLETE_VAR_DESC,
in[stop_pos] );
break;
}
}
expand_variable_error( in, stop_pos-1, -1 );
is_ok = 0;
break;
}
@@ -785,44 +907,22 @@ static int expand_variables( wchar_t *in, array_list_t *out, int last_idx )
int all_vars=1;
array_list_t var_item_list;
al_init( &var_item_list );
if( in[stop_pos] == L'[' )
{
wchar_t *end;
all_vars = 0;
stop_pos++;
while( 1 )
wchar_t *slice_end;
all_vars=0;
if( parse_slice( &in[stop_pos], &slice_end, var_idx_list ) )
{
long tmp;
while( iswspace(in[stop_pos]) || (in[stop_pos]==INTERNAL_SEPARATOR))
stop_pos++;
if( in[stop_pos] == L']' )
{
stop_pos++;
break;
}
errno=0;
tmp = wcstol( &in[stop_pos], &end, 10 );
if( ( errno ) || ( end == &in[stop_pos] ) )
{
error( SYNTAX_ERROR,
-1,
L"Expected integer or \']\'" );
is_ok = 0;
break;
}
al_push( var_idx_list, (void *)tmp );
stop_pos = end-in;
}
}
error( SYNTAX_ERROR,
-1,
L"Invalid index value" );
is_ok = 0;
}
stop_pos = (slice_end-in);
}
if( is_ok )
{
tokenize_variable_array( var_val, &var_item_list );
@@ -831,12 +931,17 @@ static int expand_variables( wchar_t *in, array_list_t *out, int last_idx )
int j;
for( j=0; j<al_get_count( var_idx_list ); j++)
{
long tmp = (long)al_get( var_idx_list, j );
long tmp = al_get_long( var_idx_list, j );
if( tmp < 0 )
{
tmp = al_get_count( &var_item_list)+tmp+1;
}
/*
Check that we are within array
bounds. If not, truncate the list to
exit.
*/
if( tmp < 1 || tmp > al_get_count( &var_item_list ) )
{
error( SYNTAX_ERROR,
@@ -848,12 +953,11 @@ static int expand_variables( wchar_t *in, array_list_t *out, int last_idx )
}
else
{
/* Move string from list l to list idx */
al_set( var_idx_list, j, al_get( &var_item_list, tmp-1 ) );
al_set( &var_item_list, tmp-1, 0 );
/* Replace each index in var_idx_list inplace with the string value at the specified index */
al_set( var_idx_list, j, wcsdup(al_get( &var_item_list, tmp-1 ) ) );
}
}
/* Free remaining strings in list l and truncate it */
/* Free strings in list var_item_list and truncate it */
al_foreach( &var_item_list, &free );
al_truncate( &var_item_list, 0 );
/* Add items from list idx back to list l */
@@ -1002,13 +1106,10 @@ static int expand_brackets( wchar_t *in, int flags, array_list_t *out )
wchar_t *item_begin;
int len1, len2, tot_len;
if( !in || !out)
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
return 0;
}
CHECK( in, 0 );
CHECK( out, 0 );
for( pos=in;
(*pos) && !syntax_error;
pos++ )
@@ -1127,23 +1228,24 @@ static int expand_brackets( wchar_t *in, int flags, array_list_t *out )
}
/**
Perform subshell expansion
Perform cmdsubst expansion
*/
static int expand_subshell( wchar_t *in, array_list_t *out )
static int expand_cmdsubst( wchar_t *in, array_list_t *out )
{
wchar_t *paran_begin=0, *paran_end=0;
int len1, len2;
int len1;
wchar_t prev=0;
wchar_t *subcmd;
array_list_t sub_res, tail_expand;
array_list_t *sub_res, *tail_expand;
int i, j;
const wchar_t *item_begin;
wchar_t *tail_begin = 0;
void *context;
CHECK( in, 0 );
CHECK( out, 0 );
if( !in || !out)
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
return 0;
}
switch( parse_util_locate_cmdsubst(in,
&paran_begin,
@@ -1163,44 +1265,97 @@ static int expand_subshell( wchar_t *in, array_list_t *out )
break;
}
context = halloc( 0, 0 );
len1 = (paran_begin-in);
len2 = wcslen(paran_end)-1;
prev=0;
item_begin = paran_begin+1;
al_init( &sub_res );
if( !(subcmd = malloc( sizeof(wchar_t)*(paran_end-paran_begin) )))
sub_res = al_halloc( context );
if( !(subcmd = halloc( context, sizeof(wchar_t)*(paran_end-paran_begin) )))
{
al_destroy( &sub_res );
halloc_free( context );
return 0;
}
wcslcpy( subcmd, paran_begin+1, paran_end-paran_begin );
subcmd[ paran_end-paran_begin-1]=0;
if( exec_subshell( subcmd, &sub_res)==-1 )
if( exec_subshell( subcmd, sub_res) == -1 )
{
al_foreach( &sub_res, &free );
al_destroy( &sub_res );
free( subcmd );
halloc_free( context );
error( CMDSUBST_ERROR, -1, L"Unknown error while evaulating command substitution" );
return 0;
}
al_init( &tail_expand );
expand_subshell( wcsdup(paran_end+1), &tail_expand );
tail_begin = paran_end + 1;
if( *tail_begin == L'[' )
{
array_list_t *slice_idx = al_halloc( context );
wchar_t *slice_end;
if( parse_slice( tail_begin, &slice_end, slice_idx ) )
{
halloc_free( context );
error( SYNTAX_ERROR, -1, L"Invalid index value" );
return 0;
}
else
{
array_list_t *sub_res2 = al_halloc( context );
tail_begin = slice_end;
for( i=0; i<al_get_count( slice_idx ); i++ )
{
long idx = al_get_long( slice_idx, i );
if( idx < 0 )
{
idx = al_get_count( sub_res ) + idx + 1;
}
if( idx < 1 || idx > al_get_count( sub_res ) )
{
halloc_free( context );
error( SYNTAX_ERROR, -1, L"Invalid index value" );
return 0;
}
idx = idx-1;
al_push( sub_res2, al_get( sub_res, idx ) );
// debug( 0, L"Pushing item '%ls' with index %d onto sliced result", al_get( sub_res, idx ), idx );
al_set( sub_res, idx, 0 );
}
al_foreach( sub_res, &free );
sub_res = sub_res2;
}
}
for( i=0; i<al_get_count( &sub_res ); i++ )
tail_expand = al_halloc( context );
/*
Recursively call ourselves to expand any remaining command
substitutions. The result of this recursive call usiung the tail
of the string is inserted into the tail_expand array list
*/
expand_cmdsubst( wcsdup(tail_begin), tail_expand );
/*
Combine the result of the current command substitution with the
result of the recursive tail expansion
*/
for( i=0; i<al_get_count( sub_res ); i++ )
{
wchar_t *sub_item, *sub_item2;
sub_item = (wchar_t *)al_get( &sub_res, i );
sub_item = (wchar_t *)al_get( sub_res, i );
sub_item2 = escape( sub_item, 1 );
free(sub_item);
int item_len = wcslen( sub_item2 );
for( j=0; j<al_get_count( &tail_expand ); j++ )
for( j=0; j<al_get_count( tail_expand ); j++ )
{
string_buffer_t whole_item;
wchar_t *tail_item = (wchar_t *)al_get( &tail_expand, j );
wchar_t *tail_item = (wchar_t *)al_get( tail_expand, j );
sb_init( &whole_item );
@@ -1217,12 +1372,8 @@ static int expand_subshell( wchar_t *in, array_list_t *out )
}
free(in);
al_destroy( &sub_res );
al_foreach( &tail_expand, &free );
al_destroy( &tail_expand );
free( subcmd );
al_foreach( tail_expand, &free );
halloc_free( context );
return 1;
}
@@ -1246,6 +1397,8 @@ static wchar_t *expand_unescape( const wchar_t * in, int escape_special )
static wchar_t * expand_tilde_internal( wchar_t *in )
{
CHECK( in, 0 );
if( in[0] == HOME_DIRECTORY )
{
int tilde_error = 0;
@@ -1332,12 +1485,14 @@ wchar_t *expand_tilde( wchar_t *in)
/**
Remove any internal separators. Also optionally convert wildcard characters to
regular equivalents. This is done to support EXPAN_SKIP_WILDCARDS.
regular equivalents. This is done to support EXPAND_SKIP_WILDCARDS.
*/
static void remove_internal_separator( const void *s, int conv )
{
wchar_t *in = (wchar_t *)s;
wchar_t *out=in;
CHECK( s, );
while( *in )
{
@@ -1376,7 +1531,7 @@ int expand_string( void *context,
array_list_t *in, *out;
int i;
int subshell_ok = 1;
int cmdsubst_ok = 1;
int res = EXPAND_OK;
int start_count = al_get_count( end_out );
@@ -1393,7 +1548,7 @@ int expand_string( void *context,
al_init( &list1 );
al_init( &list2 );
if( EXPAND_SKIP_SUBSHELL & flags )
if( EXPAND_SKIP_CMDSUBST & flags )
{
wchar_t *begin, *end;
@@ -1402,7 +1557,7 @@ int expand_string( void *context,
&end,
1 ) != 0 )
{
error( SUBSHELL_ERROR, -1, L"Subshells not allowed" );
error( CMDSUBST_ERROR, -1, L"Command substitutions not allowed" );
free( str );
al_destroy( &list1 );
al_destroy( &list2 );
@@ -1412,10 +1567,10 @@ int expand_string( void *context,
}
else
{
subshell_ok = expand_subshell( str, &list1 );
cmdsubst_ok = expand_cmdsubst( str, &list1 );
}
if( !subshell_ok )
if( !cmdsubst_ok )
{
al_destroy( &list1 );
return EXPAND_ERROR;
@@ -1429,8 +1584,14 @@ int expand_string( void *context,
{
wchar_t *next;
next = expand_unescape( (wchar_t *)al_get( in, i ),
1);
/*
We accept incomplete strings here, since complete uses
expand_string to expand incomplete strings from the
commandline.
*/
int unescape_flags = UNESCAPE_SPECIAL | UNESCAPE_INCOMPLETE;
next = expand_unescape( (wchar_t *)al_get( in, i ), unescape_flags );
free( (void *)al_get( in, i ) );
@@ -1592,6 +1753,15 @@ int expand_string( void *context,
al_truncate( out, 0 );
break;
}
case -1:
{
al_foreach( out, &free );
al_destroy( in );
al_destroy( out );
return EXPAND_ERROR;
}
}
}
else

View File

@@ -20,9 +20,9 @@
#include "util.h"
/**
Flag specifying that subshell expansion should be skipped
Flag specifying that cmdsubst expansion should be skipped
*/
#define EXPAND_SKIP_SUBSHELL 1
#define EXPAND_SKIP_CMDSUBST 1
/**
Flag specifying that variable expansion should be skipped
@@ -112,26 +112,6 @@ enum
/** String containing the character for separating two array elements */
#define ARRAY_SEP_STR L"\x1e"
/**
Error issued on invalid variable name
*/
#define COMPLETE_VAR_DESC _( L"The '$' character begins a variable name. The character '%lc', which directly followed a '$', is not allowed as a part of a variable name, and variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'.")
/**
Error issued on invalid variable name
*/
#define COMPLETE_VAR_NULL_DESC _( L"The '$' begins a variable name. It was given at the end of an argument. Variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'.")
/**
Error issued on invalid variable name
*/
#define COMPLETE_VAR_BRACKET_DESC _( L"Did you mean {$VARIABLE}? The '$' character begins a variable name. A bracket, which directly followed a '$', is not allowed as a part of a variable name, and variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'." )
/**
Error issued on invalid variable name
*/
#define COMPLETE_VAR_PARAN_DESC _( L"Did you mean (COMMAND)? In fish, the '$' character is only used for accessing variables. To learn more about command substitution in fish, type 'help expand-command-substitution'.")
/**
Error issued on array out of bounds
*/
@@ -142,7 +122,7 @@ enum
Perform various forms of expansion on in, such as tilde expansion
(\~USER becomes the users home directory), variable expansion
(\$VAR_NAME becomes the value of the environment variable VAR_NAME),
subshell expansion and wildcard expansion. The results are inserted
cmdsubst expansion and wildcard expansion. The results are inserted
into the list out.
If the parameter does not need expansion, it is copied into the list
@@ -155,11 +135,11 @@ enum
\param context the halloc context to use for automatic deallocation
\param in The parameter to expand
\param flag Specifies if any expansion pass should be skipped. Legal values are any combination of EXPAND_SKIP_SUBSHELL EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS
\param flag Specifies if any expansion pass should be skipped. Legal values are any combination of EXPAND_SKIP_CMDSUBST EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS
\param out The list to which the result will be appended.
\return One of EXPAND_OK, EXPAND_ERROR, EXPAND_WILDCARD_MATCH and EXPAND_WILDCARD_NO_MATCH. EXPAND_WILDCARD_NO_MATCH and EXPAND_WILDCARD_MATCH are normal exit conditions used only on strings containing wildcards to tell if the wildcard produced any matches.
*/
int expand_string( void *context, wchar_t *in, array_list_t *out, int flag );
__warn_unused int expand_string( void *context, wchar_t *in, array_list_t *out, int flag );
/**
expand_one is identical to expand_string, except it will fail if in
@@ -171,7 +151,7 @@ int expand_string( void *context, wchar_t *in, array_list_t *out, int flag );
\param context the halloc context to use for automatic deallocation
\param in The parameter to expand
\param flag Specifies if any expansion pass should be skipped. Legal values are any combination of EXPAND_SKIP_SUBSHELL EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS
\param flag Specifies if any expansion pass should be skipped. Legal values are any combination of EXPAND_SKIP_CMDSUBST EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS
\return The expanded parameter, or 0 on failiure
*/
wchar_t *expand_one( void *context, wchar_t *in, int flag );
@@ -207,4 +187,17 @@ wchar_t *expand_tilde(wchar_t *in);
*/
int expand_is_clean( const wchar_t *in );
/**
Perform error reporting for a syntax error related to the variable
expansion beginning at the specified character of the specified
token. This function will call the error function with an
explanatory string about what is wrong with the specified token.
\param token The token containing the error
\param token_pos The position where the expansion begins
\param error_pos The position on the line to report to the error function.
*/
void expand_variable_error( const wchar_t *token, int token_pos, int error_pos );
#endif

View File

@@ -2,6 +2,10 @@
This file only contains fallback implementations of functions which
have been found to be missing or broken by the configuration
scripts.
Many of these functions are more or less broken and
incomplete. lrand28_r internally uses the regular (bad) rand_r
function, the gettext function doesn't actually do anything, etc.
*/
#include "config.h"
@@ -21,6 +25,7 @@
#include <dirent.h>
#include <stdarg.h>
#include <limits.h>
#include <assert.h>
#if HAVE_NCURSES_H
#include <ncurses.h>
@@ -42,6 +47,12 @@
#include "util.h"
#ifndef HAVE___ENVIRON
char **__environ = 0;
#endif
#ifdef TPUTS_KLUDGE
int tputs(const char *str, int affcnt, int (*fish_putc)(tputs_arg_t))
@@ -65,7 +76,11 @@ int tputs(const char *str, int affcnt, int (*fish_putc)(tputs_arg_t))
#ifdef INTERNAL_FWPRINTF
void pad( void (*writer)(wchar_t), int count)
/**
Internal function for the wprintf fallbacks. USed to write the
specified number of spaces.
*/
static void pad( void (*writer)(wchar_t), int count)
{
int i;
@@ -997,14 +1012,6 @@ wcslcpy(wchar_t *dst, const wchar_t *src, size_t siz)
#endif
#ifdef HAVE_BROKEN_DEL_CURTERM
int del_curterm(TERMINAL *oterm)
{
}
#endif
#ifndef HAVE_LRAND48_R
int lrand48_r(struct drand48_data *buffer, long int *result)
@@ -1029,6 +1036,77 @@ int futimes(int fd, const struct timeval *times)
return -1;
}
#endif
#ifndef HAVE_GETTEXT
char * gettext (const char * msgid)
{
return (char *)msgid;
}
char * bindtextdomain (const char * domainname, const char * dirname)
{
return 0;
}
char * textdomain (const char * domainname)
{
return 0;
}
#endif
#ifndef HAVE_DCGETTEXT
char * dcgettext ( const char * domainname,
const char * msgid,
int category)
{
return (char *)msgid;
}
#endif
#ifndef HAVE__NL_MSG_CAT_CNTR
int _nl_msg_cat_cntr=0;
#endif
#ifndef HAVE_KILLPG
int killpg( int pgr, int sig )
{
assert( pgr > 1 );
return kill( -pgr, sig );
}
#endif
#ifndef HAVE_WORKING_GETOPT_LONG
int getopt_long( int argc,
char * const argv[],
const char *optstring,
const struct option *longopts,
int *longindex )
{
return getopt( argc, argv, optstring );
}
#endif
#ifndef HAVE_BACKTRACE
int backtrace (void **buffer, int size)
{
return 0;
}
#endif
#ifndef HAVE_BACKTRACE_SYMBOLS
char ** backtrace_symbols (void *const *buffer, int size)
{
return 0;
}
#endif

View File

@@ -9,6 +9,8 @@
#include <wchar.h>
#include <limits.h>
#include <sys/time.h>
#include <sys/types.h>
#include <signal.h>
#ifndef WCHAR_MAX
/**
@@ -43,6 +45,24 @@ typedef int tputs_arg_t;
typedef char tputs_arg_t;
#endif
#ifndef SIGIO
#define SIGIO SIGUSR1
#endif
#ifndef SIGWINCH
#define SIGWINCH SIGUSR2
#endif
#ifndef HAVE_WINSIZE
struct winsize
{
unsigned short ws_row;
unsigned short ws_col;
}
;
#endif
#ifdef TPUTS_KLUDGE
/**
@@ -290,7 +310,7 @@ size_t wcslcpy( wchar_t *dst, const wchar_t *src, size_t siz );
/**
BSD del_curterm seems to do a double-free. We redefine it as a no-op
*/
int del_curterm(TERMINAL *oterm);
#define del_curterm(oterm) OK
#endif
#ifndef HAVE_LRAND48_R
@@ -310,18 +330,96 @@ struct drand48_data
/**
Fallback implementation of lrand48_r. Internally uses rand_r, so it is pretty weak.
*/
int lrand48_r(struct drand48_data *buffer, long int *result);
int lrand48_r( struct drand48_data *buffer, long int *result );
/**
Fallback implementation of srand48_r, the seed function for lrand48_r.
*/
int srand48_r(long int seedval, struct drand48_data *buffer);
int srand48_r( long int seedval, struct drand48_data *buffer );
#endif
#ifndef HAVE_FUTIMES
int futimes(int fd, const struct timeval *times);
int futimes( int fd, const struct timeval *times );
#endif
#ifndef HAVE_GETTEXT
/**
Fallback implementation of gettext. Just returns the original string.
*/
char * gettext( const char * msgid );
/**
Fallback implementation of bindtextdomain. Does nothing.
*/
char * bindtextdomain( const char * domainname, const char * dirname );
/**
Fallback implementation of textdomain. Does nothing.
*/
char * textdomain( const char * domainname );
#endif
#ifndef HAVE_DCGETTEXT
/**
Fallback implementation of dcgettext. Just returns the original string.
*/
char * dcgettext ( const char * domainname,
const char * msgid,
int category );
#endif
#ifndef HAVE__NL_MSG_CAT_CNTR
/**
Some gettext implementation use have this variable, and by
increasing it, one can tell the system that the translations need
to be reloaded.
*/
extern int _nl_msg_cat_cntr;
#endif
#ifndef HAVE_KILLPG
int killpg( int pgr, int sig );
#endif
#ifndef HAVE_WORKING_GETOPT_LONG
struct option
{
const char *name;
int has_arg;
int *flag;
int val;
}
;
#ifndef no_argument
#define no_argument 0
#endif
#ifndef required_argument
#define required_argument 1
#endif
#ifndef optional_argument
#define optional_argument 2
#endif
int getopt_long(int argc,
char * const argv[],
const char *optstring,
const struct option *longopts,
int *longindex);
#endif

View File

@@ -1,5 +1,3 @@
%define xinclude %( if test -d /usr/X11R6/include; then echo /usr/X11R6/include; else echo /usr/include; fi )
Summary: A friendly interactive shell
Name: @PACKAGE_NAME@
@@ -8,25 +6,57 @@ Release: 0%{?dist}
License: GPL
Group: System Environment/Shells
URL: http://roo.no-ip.org/fish/
URL: http://www.fishshell.org
Source0: http://roo.no-ip.org/%{name}/files/%{version}/%{name}-%{version}.tar.bz2
Source0: http://www.fishshell.org/files/%{version}/%{name}-%{version}.tar.bz2
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: ncurses-devel
BuildRequires: %{xinclude}/X11/StringDefs.h, %{xinclude}/X11/Xlib.h
BuildRequires: %{xinclude}/X11/Intrinsic.h, %{xinclude}/X11/Xatom.h
BuildRequires: ncurses-devel gettext groff
# Locate correct build time-dependencies for providing X headers
%if "%fedora" >= "5"
# Modern Fedora version, has modular X.org
BuildRequires: xorg-x11-proto-devel libX11-devel libXt-devel libXext-devel
%endif
%if "%fedora" < "5"
%if "%fedora" >= "3"
# Semi-old Fedora version, has non-modular X.org
BuildRequires: xorg-x11-devel
%endif
%endif
%if 0%{?fedora}
%if "%fedora" < "3"
# Ancient Fedora version, has XFree86
BuildRequires: XFree86-devel
%endif
%else
# The %fedora variable has not been correctly defined, or this is is
# not a Fedora system, try guessing BuildRequires by looking at the
# directory structure
%define xinclude /usr%(if [ -d /usr/X11R6/include ]; then echo /X11R6; fi)/include
BuildRequires: %{xinclude}/X11/StringDefs.h, %{xinclude}/X11/Xlib.h
BuildRequires: %{xinclude}/X11/Intrinsic.h, %{xinclude}/X11/Xatom.h
%endif
%description
fish is a shell geared towards interactive use. It's features are
focused on user friendlieness and discoverability. The language syntax
fish is a shell geared towards interactive use. Its features are
focused on user friendliness and discoverability. The language syntax
is simple but incompatible with other shell languages.
%prep
%setup -q
@@ -34,6 +64,9 @@ is simple but incompatible with other shell languages.
%build
# The docdir argument is to make the name of the cosumantation
# directory 'fish-VERSION', instead of the default, which is simply
# 'fish'.
%configure docdir=%_datadir/doc/%{name}-%{version}
make %{?_smp_mflags}
@@ -44,6 +77,8 @@ make %{?_smp_mflags}
rm -rf $RPM_BUILD_ROOT
make install DESTDIR="$RPM_BUILD_ROOT"
# Find translation files
%find_lang %{name}.\*
@@ -54,6 +89,7 @@ rm -rf $RPM_BUILD_ROOT
%post
# Add fish to the list of allowed shells in /etc/shells
if ! grep %_bindir/fish %_sysconfdir/shells >/dev/null; then
echo %_bindir/fish >>%_sysconfdir/shells
fi
@@ -62,6 +98,7 @@ fi
%postun
# Remove fish from the list of allowed shells in /etc/shells
if [ "$1" = 0 ]; then
grep -v %_bindir/fish %_sysconfdir/shells >%_sysconfdir/fish.tmp
mv %_sysconfdir/fish.tmp %_sysconfdir/shells
@@ -70,11 +107,14 @@ fi
%files
%files -f %{name}.\*.lang
%defattr(-,root,root,-)
# The documentation directory
%doc %_datadir/doc/%{name}-%{version}
# man files
%_mandir/man1/fish.1*
%_mandir/man1/xsel.1x*
%_mandir/man1/mimedb.1*
@@ -83,6 +123,7 @@ fi
%_mandir/man1/fishd.1*
%_mandir/man1/fish_pager.1*
# The program binaries
%attr(0755,root,root) %_bindir/fish
%attr(0755,root,root) %_bindir/fishd
%attr(0755,root,root) %_bindir/fish_pager
@@ -91,26 +132,51 @@ fi
%attr(0755,root,root) %_bindir/mimedb
%attr(0755,root,root) %_bindir/count
%config %_sysconfdir/fish
%config %_sysconfdir/fish_inputrc
%dir %_sysconfdir/fish.d
%config %_sysconfdir/fish.d/fish_*.fish
# Configuration files
%config %_sysconfdir/fish/config.fish
%config %_sysconfdir/fish/fish_inputrc
%dir %_sysconfdir/fish
# Non-configuration initialization files
%dir %_datadir/fish
%_datadir/fish/fish
%_datadir/fish/config.fish
%_datadir/fish/config_interactive.fish
# Program specific tab-completions
%dir %_datadir/fish/completions
%_datadir/fish/completions/*.fish
# Dynamically loaded shellscript functions
%dir %_datadir/fish/functions
%_datadir/fish/functions/*.fish
%_datadir/locale/*/LC_MESSAGES/fish.mo
# Documentation for builtins and shellscript functions
%dir %_datadir/fish/man
%_datadir/fish/man/*.1
%changelog
* Thu Feb 8 2007 Axel Liljencrantz<axel@liljencrantz.se> 1.22.3-0
- Tell rpm about the help pages in %_datadir/fish/man/
* Sat Oct 14 2006 Axel Liljencrantz<axel@liljencrantz.se> 1.22.0-0
- Update names of various configuration files
* Fri Aug 4 2006 Axel Liljencrantz<axel@liljencrantz.se> 1.21.10-4
- Add better translation finding code from fedora spec to main spec. Thank you to Michael Schwendt.
- Add missing dependency libXext-devel.
- Remove one nesting level from dependency checking code.
* Tue Aug 1 2006 Axel Liljencrantz<axel@liljencrantz.se> 1.21.10-1
- Improved the dependency check for X headers. Thank you to Michael Schwendt for pointers on how to do this
* Mon Jul 31 2006 Axel Liljencrantz<axel@liljencrantz.se> 1.21.10-1
- Fixed spelling and punctuation as a per patch from Paul Howarth
- Fixed dependencies as per patch from Paul Howarth
* Tue Nov 29 2005 Axel Liljencrantz <axel@liljencrantz.se> 1.17.0-0
- 1.17.0

View File

@@ -9,7 +9,14 @@
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_SYS_TERMIOS_H
#include <sys/termios.h>
#endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
#include <sys/time.h>
#include <sys/wait.h>
#include <dirent.h>
@@ -35,6 +42,11 @@
#include <signal.h>
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif
#include <errno.h>
#include "fallback.h"
#include "util.h"
@@ -47,6 +59,7 @@
#include "env_universal.h"
#include "halloc.h"
#include "halloc_util.h"
#include "print_help.h"
enum
{
@@ -67,18 +80,66 @@ enum
}
;
enum
{
/*
Returnd by the pager if no more displaying is needed
*/
PAGER_DONE,
/*
Returned by the pager if the completions would not fit in the specified number of columns
*/
PAGER_RETRY,
/*
Returned by the pager if the terminal changes size
*/
PAGER_RESIZE
}
;
/**
The minimum width (in characters) the terminal may have for fish_pager to not refuse showing the completions
*/
#define PAGER_MIN_WIDTH 16
/**
The maximum number of columns of completion to attempt to fit onto the screen
*/
#define PAGER_MAX_COLS 6
/**
The string describing the single-character options accepted by fish_pager
*/
#define GETOPT_STRING "c:hr:qvp:"
/**
Error to use when given an invalid file descriptor for reading completions or writing output
*/
#define ERR_NOT_FD _( L"%ls: Argument '%s' is not a valid file descriptor\n" )
/**
This struct should be continually updated by signals as the term
resizes, and as such always contain the correct current size.
*/
static struct winsize termsize;
/**
The termios modes the terminal had when the program started. These
should be restored on exit
*/
static struct termios saved_modes;
static struct termios pager_modes;
/**
This flag is set to 1 of we have sent the enter_ca_mode terminfo
sequence to save the previous terminal contents.
*/
static int is_ca_mode = 0;
/**
This buffer_t is used to buffer the output of the pager to improve
screen redraw performance bu cutting down the number of write()
calls to only one.
*/
static buffer_t *pager_buffer;
/**
@@ -94,12 +155,18 @@ static wchar_t *hightlight_var[] =
}
;
/**
This string_buffer_t contains the text that should be sent back to the calling program
*/
static string_buffer_t out_buff;
/**
This is the file to which the output text should be sent. It is really a pipe.
*/
static FILE *out_file;
/**
Data structure describing one or a group of related completions
*/
*/
typedef struct
{
/**
@@ -129,16 +196,27 @@ typedef struct
}
comp_t;
/**
This function translates from a highlight code to a specific color
by check invironement variables
*/
static int get_color( int highlight )
{
wchar_t *val;
if( highlight < 0 )
return FISH_COLOR_NORMAL;
if( highlight >= (4) )
return FISH_COLOR_NORMAL;
wchar_t *val = env_universal_get( hightlight_var[highlight]);
val = wgetenv( hightlight_var[highlight]);
if( !val )
{
val = env_universal_get( hightlight_var[highlight]);
}
if( val == 0 )
if( !val )
{
return FISH_COLOR_NORMAL;
}
@@ -146,6 +224,12 @@ static int get_color( int highlight )
return output_color_code( val );
}
/**
This function calculates the minimum width for each completion
entry in the specified array_list. This width depends on the
terminal size, so this function should be called when the terminal
changes size.
*/
static void recalc_width( array_list_t *l, const wchar_t *prefix )
{
int i;
@@ -159,6 +243,10 @@ static void recalc_width( array_list_t *l, const wchar_t *prefix )
}
/**
Test if the specified character sequence has been entered on the
keyboard
*/
static int try_sequence( char *seq )
{
int j, k;
@@ -182,6 +270,9 @@ static int try_sequence( char *seq )
return 0;
}
/**
Read a character from keyboard
*/
static wint_t readch()
{
struct mapping
@@ -241,26 +332,39 @@ static wint_t readch()
return input_common_readch(0);
}
/**
Write specified character to the output buffer \c pager_buffer
*/
static int pager_buffered_writer( char c)
{
b_append( pager_buffer, &c, 1 );
return 0;
}
/**
Flush \c pager_buffer to stdout
*/
static void pager_flush()
{
write( 1, pager_buffer->buff, pager_buffer->used );
pager_buffer->used = 0;
}
/**
Print the specified string, but use at most the specified amount of
space. If the whole string can't be fitted, ellipsize it.
\param str the string to print
\param max the maximum space that may be used for printing
\param has_more if this flag is true, this is not the entire string, and the string should be ellisiszed even if the string fits but takes up the whole space.
*/
static int print_max( const wchar_t *str, int max, int has_more )
{
int i;
int written = 0;
for( i=0; str[i]; i++ )
{
if( written + wcwidth(str[i]) > max )
break;
if( ( written + wcwidth(str[i]) == max) && (has_more || str[i+1]) )
@@ -276,6 +380,9 @@ static int print_max( const wchar_t *str, int max, int has_more )
return written;
}
/**
Print the specified item using at the specified amount of space
*/
static void completion_print_item( const wchar_t *prefix, comp_t *c, int width )
{
int comp_width=0, desc_width=0;
@@ -409,7 +516,7 @@ static void completion_print( int cols,
\param is_quoted whether the completions should be quoted
\param l the list of completions
\return zero if the specified number of columns do not fit, no-zero otherwise
\return one of PAGER_RETRY, PAGER_DONE and PAGER_RESIZE
*/
static int completion_try_print( int cols,
@@ -420,11 +527,11 @@ static int completion_try_print( int cols,
/*
The calculated preferred width of each column
*/
int pref_width[32];
int pref_width[PAGER_MAX_COLS];
/*
The calculated minimum width of each column
*/
int min_width[32];
int min_width[PAGER_MAX_COLS];
/*
If the list can be printed with this width, width will contain the width of each column
*/
@@ -440,13 +547,13 @@ static int completion_try_print( int cols,
int pref_tot_width=0;
int min_tot_width = 0;
int res=0;
int res=PAGER_RETRY;
/*
Skip completions on tiny terminals
*/
if( termsize.ws_col < 16 )
return 1;
if( termsize.ws_col < PAGER_MIN_WIDTH )
return PAGER_DONE;
memset( pref_width, 0, sizeof(pref_width) );
memset( min_width, 0, sizeof(min_width) );
@@ -511,8 +618,22 @@ static int completion_try_print( int cols,
( pref_tot_width-termsize.ws_col< 4 && cols < 3 ) ) )
{
/*
Terminal almost wide enough, or squeezing makes the whole list fit on-screen
Terminal almost wide enough, or squeezing makes the
whole list fit on-screen.
This part of the code is really important. People hate
having to scroll through the completion list. In cases
where there are a huge number of completions, it can't
be helped, but it is not uncommon for the completions to
_almost_ fit on one screen. In those cases, it is almost
always desirable to 'squeeze' the completions into a
single page.
If we are using N columns and can get everything to
fit using squeezing, but everything would also fit
using N-1 columns, don't try.
*/
int tot_width = min_tot_width;
width = min_width;
@@ -531,11 +652,9 @@ static int completion_try_print( int cols,
}
}
// return cols==1;
if( print )
{
res=1;
res=PAGER_DONE;
if( rows < termsize.ws_row )
{
/* List fits on screen. Print it and leave */
@@ -569,15 +688,19 @@ static int completion_try_print( int cols,
*/
while(do_loop)
{
wchar_t msg[10];
int percent = 100*pos/(rows-termsize.ws_row+1);
string_buffer_t msg;
sb_init( &msg );
set_color( FISH_COLOR_BLACK,
get_color(HIGHLIGHT_PAGER_PROGRESS) );
swprintf( msg, 12,
L" %ls(%d%%) \r",
percent==100?L"":(percent >=10?L" ": L" "),
percent );
writestr(msg);
sb_printf( &msg,
_(L" %d to %d of %d \r"),
pos,
pos+termsize.ws_row-1,
rows );
writestr((wchar_t *)msg.buff);
sb_destroy( &msg );
set_color( FISH_COLOR_NORMAL, FISH_COLOR_NORMAL );
pager_flush();
int c = readch();
@@ -675,7 +798,7 @@ static int completion_try_print( int cols,
case R_NULL:
{
do_loop=0;
res=2;
res=PAGER_RESIZE;
break;
}
@@ -822,6 +945,7 @@ static void mangle_completions( array_list_t *l, const wchar_t *prefix )
{
*end = 0;
wchar_t * str = escape( start, 1 );
comp->comp_width += my_wcswidth( str );
halloc_register( global_context, str );
al_push( comp->comp, str );
@@ -864,46 +988,79 @@ static void handle_winch( int sig )
}
}
/**
The callback function that the keyboard reading function calls when
an interrupt occurs. This makes sure that R_NULL is returned at
once when an interrupt has occured.
*/
static int interrupt_handler()
{
return R_NULL;
}
static void init()
/**
Initialize various subsystems. This also closes stdin and replaces
it with a copy of stderr, so the reading of completion strings must
be done before init is called.
*/
static void init( int mangle_descriptors, int out )
{
struct sigaction act;
program_name = L"fish_pager";
wsetlocale( LC_ALL, L"" );
/*
Make fd 1 output to screen, and use some other fd for writing
the resulting output back to the caller
*/
int out = dup( 1 );
close(1);
if( open( ttyname(0), O_WRONLY ) != 1 )
static struct termios pager_modes;
if( mangle_descriptors )
{
if( dup2( 2, 1 ) == -1 )
{
debug( 0, L"Could not set up file descriptors for pager" );
/*
Make fd 1 output to screen, and use some other fd for writing
the resulting output back to the caller
*/
int in;
out = dup( 1 );
close(1);
close(0);
if( (in = open( ttyname(2), O_RDWR )) != -1 )
{
if( dup2( 2, 1 ) == -1 )
{
debug( 0, _(L"Could not set up output file descriptors for pager") );
exit( 1 );
}
if( dup2( in, 0 ) == -1 )
{
debug( 0, _(L"Could not set up input file descriptors for pager") );
exit( 1 );
}
}
else
{
debug( 0, _(L"Could not open tty for pager") );
exit( 1 );
}
}
out_file = fdopen( out, "w" );
if( !(out_file = fdopen( out, "w" )) )
{
debug( 0, _(L"Could not initialize result pipe" ) );
exit( 1 );
}
/**
Init the stringbuffer used to keep any output in
*/
sb_init( &out_buff );
halloc_util_init();
env_universal_init( 0, 0, 0, 0);
input_common_init( &interrupt_handler );
output_set_writer( &pager_buffered_writer );
pager_buffer = halloc( global_context, sizeof( buffer_t ) );
halloc_register_function( global_context, (void (*)(void *))&b_destroy, pager_buffer );
sigemptyset( & act.sa_mask );
act.sa_flags=0;
act.sa_handler=SIG_DFL;
@@ -916,7 +1073,7 @@ static void init()
}
handle_winch( 0 ); /* Set handler for window change events */
tcgetattr(0,&pager_modes); /* get the current terminal modes */
memcpy( &saved_modes,
&pager_modes,
@@ -938,84 +1095,358 @@ static void init()
if( setupterm( 0, STDOUT_FILENO, 0) == ERR )
{
debug( 0, L"Could not set up terminal" );
debug( 0, _(L"Could not set up terminal") );
exit(1);
}
}
void destroy()
/**
Free memory used by various subsystems.
*/
static void destroy()
{
env_universal_destroy();
input_common_destroy();
halloc_util_destroy();
del_curterm( cur_term );
wutil_destroy();
if( del_curterm( cur_term ) == ERR )
{
debug( 0, _(L"Error while closing terminfo") );
}
sb_destroy( &out_buff );
fclose( out_file );
}
/**
Read lines of input from the specified file, unescape them and
insert them into the specified list.
*/
static void read_array( FILE* file, array_list_t *comp )
{
buffer_t buffer;
int c;
char cc;
wchar_t *wcs, *unescaped;
b_init( &buffer );
while( !feof( file ) )
{
buffer.used=0;
while( 1 )
{
c = getc( file );
if( c == EOF )
{
break;
}
if( c == '\n' )
{
break;
}
cc=c;
b_append( &buffer, &cc, 1 );
}
if( buffer.used )
{
cc=0;
b_append( &buffer, &cc, 1 );
wcs = str2wcs( buffer.buff );
if( wcs )
{
unescaped = unescape( wcs, 0 );
al_push( comp, unescaped );
free( wcs );
}
}
}
b_destroy( &buffer );
}
static int get_fd( const char *str )
{
char *end;
long fd;
errno = 0;
fd = strtol( str, &end, 10 );
if( fd < 0 || *end || errno )
{
debug( 0, ERR_NOT_FD, program_name, optarg );
exit( 1 );
}
return (int)fd;
}
int main( int argc, char **argv )
{
int i;
int is_quoted=0;
array_list_t *comp;
wchar_t *prefix;
wchar_t *prefix = 0;
int mangle_descriptors = 0;
int result_fd = -1;
init();
if( argc < 3 )
/*
This initialization is made early, so that the other init code
can use global_context for memory managment
*/
halloc_util_init();
program_name = L"fish_pager";
wsetlocale( LC_ALL, L"" );
comp = al_halloc( global_context );
/*
The call signature for fish_pager is a mess. Because we want
to be able to upgrade fish without breaking running
instances, we need to support all previous
modes. Unfortunatly, the two previous ones are a mess. The
third one is designed to be extensible, so hopefully it will
be the last.
*/
if( argc > 1 && argv[1][0] == '-' )
{
debug( 0, L"Insufficient arguments" );
/*
Third mode
*/
int completion_fd = -1;
FILE *completion_file;
while( 1 )
{
static struct option
long_options[] =
{
{
"result-fd", required_argument, 0, 'r'
}
,
{
"completion-fd", required_argument, 0, 'c'
}
,
{
"prefix", required_argument, 0, 'p'
}
,
{
"is-quoted", no_argument, 0, 'q'
}
,
{
"help", no_argument, 0, 'h'
}
,
{
"version", no_argument, 0, 'v'
}
,
{
0, 0, 0, 0
}
}
;
int opt_index = 0;
int opt = getopt_long( argc,
argv,
GETOPT_STRING,
long_options,
&opt_index );
if( opt == -1 )
break;
switch( opt )
{
case 0:
{
break;
}
case 'r':
{
result_fd = get_fd( optarg );
break;
}
case 'c':
{
completion_fd = get_fd( optarg );
break;
}
case 'p':
{
prefix = str2wcs(optarg);
break;
}
case 'h':
{
print_help( argv[0], 1 );
exit(0);
}
case 'v':
{
debug( 0, L"%ls, version %s\n", program_name, PACKAGE_VERSION );
exit( 0 );
}
case 'q':
{
is_quoted = 1;
}
}
}
if( completion_fd == -1 || result_fd == -1 )
{
debug( 0, _(L"Unspecified file descriptors") );
exit( 1 );
}
if( (completion_file = fdopen( completion_fd, "r" ) ) )
{
read_array( completion_file, comp );
fclose( completion_file );
}
else
{
debug( 0, _(L"Could not read completions") );
wperror( L"fdopen" );
exit( 1 );
}
if( !prefix )
{
prefix = wcsdup( L"" );
}
}
else
{
comp = al_halloc( global_context );
prefix = str2wcs( argv[2] );
is_quoted = strcmp( "1", argv[1] )==0;
is_quoted = 0;
debug( 3, L"prefix is '%ls'", prefix );
for( i=3; i<argc; i++ )
{
wchar_t *wcs = str2wcs( argv[i] );
if( wcs )
{
al_push( comp, wcs );
}
}
mangle_descriptions( comp );
if( wcscmp( prefix, L"-" ) == 0 )
join_completions( comp );
mangle_completions( comp, prefix );
for( i = 6; i>0; i-- )
{
switch( completion_try_print( i, prefix, is_quoted, comp ) )
{
case 0:
break;
case 1:
i=0;
break;
case 2:
i=7;
break;
}
}
free(prefix );
/*
Second or first mode. These suck, but we need to support
them for backwards compatibility. At least for some
time.
fwprintf( out_file, L"%ls", (wchar_t *)out_buff.buff );
if( is_ca_mode )
Third mode was implemented in January 2007, and previous
modes should be considered deprecated from that point
forward. A reasonable time frame for removal of the code
below has yet to be determined.
*/
if( argc < 3 )
{
writembs(exit_ca_mode);
pager_flush();
print_help( argv[0], 1 );
exit( 0 );
}
else
{
mangle_descriptors = 1;
prefix = str2wcs( argv[2] );
is_quoted = strcmp( "1", argv[1] )==0;
if( argc > 3 )
{
/*
First mode
*/
for( i=3; i<argc; i++ )
{
wchar_t *wcs = str2wcs( argv[i] );
if( wcs )
{
al_push( comp, wcs );
}
}
}
else
{
/*
Second mode
*/
read_array( stdin, comp );
}
}
}
// debug( 3, L"prefix is '%ls'", prefix );
init( mangle_descriptors, result_fd );
mangle_descriptions( comp );
if( wcscmp( prefix, L"-" ) == 0 )
join_completions( comp );
mangle_completions( comp, prefix );
/**
Try to print the completions. Start by trying to print the
list in PAGER_MAX_COLS columns, if the completions won't
fit, reduce the number of columns by one. Printing a single
column never fails.
*/
for( i = PAGER_MAX_COLS; i>0; i-- )
{
switch( completion_try_print( i, prefix, is_quoted, comp ) )
{
case PAGER_RETRY:
break;
case PAGER_DONE:
i=0;
break;
case PAGER_RESIZE:
/*
This means we got a resize event, so we start
over from the beginning. Since it the screen got
bigger, we might be able to fit all completions
on-screen.
*/
i=PAGER_MAX_COLS+1;
break;
}
}
free(prefix );
fwprintf( out_file, L"%ls", (wchar_t *)out_buff.buff );
if( is_ca_mode )
{
writembs(exit_ca_mode);
pager_flush();
}
destroy();
halloc_util_destroy();
}

View File

@@ -88,14 +88,6 @@ static void err( wchar_t *blah, ... )
wprintf( L"\n" );
}
/**
Print ok message
*/
static void ok()
{
wprintf( L"OK\n" );
}
/**
Compare two pointers
*/
@@ -120,7 +112,7 @@ static void pq_test( int elements )
for( i=0; i<elements; i++ )
{
int foo = rand() % 100;
long foo = rand() % 100;
// printf( "Adding %d\n", foo );
pq_put( &q, (void *)foo );
count[foo]++;
@@ -130,7 +122,7 @@ static void pq_test( int elements )
for( i=0; i<elements; i++ )
{
int pos = (int)pq_get( &q );
long pos = (long)pq_get( &q );
count[ pos ]--;
if( pos > prev )
err( L"Wrong order of elements in priority_queue_t" );
@@ -152,7 +144,7 @@ static void pq_test( int elements )
*/
static int stack_test( int elements )
{
int i;
long i;
int res=1;
@@ -162,12 +154,12 @@ static int stack_test( int elements )
for( i=0; i<elements; i++ )
{
int foo;
long foo;
al_push( &s, (void*)i);
al_push( &s, (void*)i);
al_push_long( &s, i);
al_push_long( &s, i);
if( (foo=(int)al_pop( &s )) != i )
if( (foo=al_pop_long( &s )) != i )
{
err( L"Unexpected data" );
res = 0;
@@ -177,16 +169,14 @@ static int stack_test( int elements )
for( i=0; i<elements; i++ )
{
int foo;
long foo;
if( (foo=(int)al_pop( &s )) != (elements-i-1) )
if( (foo=al_pop_long( &s )) != (elements-i-1) )
{
err( L"Unexpected data" );
res = 0;
break;
}
}
}
@@ -198,19 +188,19 @@ static int stack_test( int elements )
/**
Hash function for pointers
*/
static int hash_func( const void *data )
static int hash_func( void *data )
{
/* srand( (int)data );
return rand();
*/
int foo = (int)data;
int foo = (int)(long)data;
return 127*((foo^0xefc7e214)) ^(foo<<11);
}
/**
Pointer hash comparison function
*/
static int compare_func( const void *key1, const void *key2 )
static int compare_func( void *key1, void *key2 )
{
return key1==key2;
}
@@ -219,9 +209,9 @@ static int compare_func( const void *key1, const void *key2 )
/**
Hashtable test
*/
static int hash_test( int elements )
static int hash_test( long elements )
{
int i;
long i;
int res=1;
hash_table_t h;
@@ -230,17 +220,17 @@ static int hash_test( int elements )
for( i=1; i< elements+1; i++ )
{
hash_put( &h, (void*)i, (void*)100-i );
hash_put( &h, (void*)i, (void*)100l-i );
}
for( i=1; i< elements+1; i++ )
{
if( (int)hash_get( &h, (void*)i ) != (100-i) )
if( (long)hash_get( &h, (void*)i ) != (100l-i) )
{
err( L"Key %d gave data %d, expected data %d",
i,
(int)hash_get( &h, (void*)i ),
100-i );
(long)hash_get( &h, (void*)i ),
100l-i );
res = 0;
break;
@@ -273,7 +263,7 @@ static int hash_test( int elements )
for( i=1; i<elements+1; i++ )
{
if( hash_contains( &h, (void*)i) != (i+1)%2 )
if( hash_contains( &h, (void*)i) != (i+1l)%2l )
{
if( i%2 )
err( L"Key %d remains, should be deleted",
@@ -297,22 +287,22 @@ static int hash_test( int elements )
*/
static void al_test( int sz)
{
int i;
long i;
array_list_t l;
al_init( &l );
al_set( &l, 1, (void *)7 );
al_set( &l, sz, (void *)7 );
al_set_long( &l, 1, 7L );
al_set_long( &l, sz, 7L );
if( al_get_count( &l ) != maxf( sz+1, 2 ) )
if( al_get_count( &l ) != maxi( sz+1, 2 ) )
err( L"Wrong number of elements in array list" );
for( i=0; i<al_get_count( &l ); i++ )
{
int val = (int)((long) al_get( &l, i ));
long val = al_get_long( &l, i );
if( (i == 1) || (i==sz))
{
if( val != 7 )
@@ -486,43 +476,43 @@ static void test_parser()
say( L"Testing null input to parser" );
if( !parser_test( 0, 0, 0 ) )
if( !parser_test( 0, 0, 0, 0 ) )
{
err( L"Null input to parser_test undetected" );
}
say( L"Testing block nesting" );
if( !parser_test( L"if; end", 0, 0 ) )
if( !parser_test( L"if; end", 0, 0, 0 ) )
{
err( L"Incomplete if statement undetected" );
}
if( !parser_test( L"if test; echo", 0, 0 ) )
if( !parser_test( L"if test; echo", 0, 0, 0 ) )
{
err( L"Missing end undetected" );
}
if( !parser_test( L"if test; end; end", 0, 0 ) )
if( !parser_test( L"if test; end; end", 0, 0, 0 ) )
{
err( L"Unbalanced end undetected" );
}
say( L"Testing detection of invalid use of builtin commands" );
if( !parser_test( L"case foo", 0, 0 ) )
if( !parser_test( L"case foo", 0, 0, 0 ) )
{
err( L"'case' command outside of block context undetected" );
}
if( !parser_test( L"switch ggg; if true; case foo;end;end", 0, 0 ) )
if( !parser_test( L"switch ggg; if true; case foo;end;end", 0, 0, 0 ) )
{
err( L"'case' command outside of switch block context undetected" );
}
if( !parser_test( L"else", 0, 0 ) )
if( !parser_test( L"else", 0, 0, 0 ) )
{
err( L"'else' command outside of conditional block context undetected" );
}
if( !parser_test( L"break", 0, 0 ) )
if( !parser_test( L"break", 0, 0, 0 ) )
{
err( L"'break' command outside of loop block context undetected" );
}
if( !parser_test( L"exec ls|less", 0, 0 ) || !parser_test( L"echo|return", 0, 0 ))
if( !parser_test( L"exec ls|less", 0, 0, 0 ) || !parser_test( L"echo|return", 0, 0, 0 ))
{
err( L"Invalid pipe command undetected" );
}
@@ -555,7 +545,11 @@ static int expand_test( const wchar_t *in, int flags, ... )
wchar_t *arg;
al_init( &out );
expand_string( 0, wcsdup(in), &out, flags);
if( expand_string( 0, wcsdup(in), &out, flags) )
{
}
va_start( va, flags );
@@ -577,7 +571,7 @@ static int expand_test( const wchar_t *in, int flags, ... )
}
va_end( va );
al_foreach( &out, (void (*)(const void *))&free );
al_foreach( &out, &free );
return res;
}
@@ -642,7 +636,7 @@ void perf_complete()
matches += al_get_count( &out );
al_foreach( &out, (void (*)(const void *))&free );
al_foreach( &out, &free );
al_truncate( &out, 0 );
}
t2=get_time();
@@ -664,7 +658,7 @@ void perf_complete()
matches += al_get_count( &out );
al_foreach( &out, (void (*)(const void *))&free );
al_foreach( &out, &free );
al_truncate( &out, 0 );
}
t2=get_time();
@@ -696,7 +690,6 @@ int main( int argc, char **argv )
parser_init();
function_init();
builtin_init();
complete_init();
reader_init();
env_init();
@@ -718,7 +711,6 @@ int main( int argc, char **argv )
parser_destroy();
function_destroy();
builtin_destroy();
complete_destroy();
wutil_destroy();
event_destroy();
proc_destroy();

164
fishd.c
View File

@@ -17,10 +17,12 @@ set_export KEY:VALUE
These commands update the value of a variable. The only difference
between the two is that <tt>set_export</tt>-variables should be
exported to children of the process using them. The variable value may
be escaped using C-style backslash escapes. In fact, this is required
for newline characters, which would otherwise be interpreted as end of
command.
exported to children of the process using them. When sending messages,
all values below 32 or above 127 must be escaped using C-style
backslash escapes. This means that the over the wire protocol is
ASCII. However, any conforming reader must also accept non-ascii
characters and interpret them as UTF-8. Lines containing invalid UTF-8
escape sequences must be ignored entirely.
<pre>erase KEY
</pre>
@@ -68,6 +70,10 @@ time the original barrier request was sent have been received.
#include "common.h"
#include "wutil.h"
#include "env_universal_common.h"
#include "halloc.h"
#include "halloc_util.h"
#include "path.h"
#include "print_help.h"
/**
Maximum length of socket filename
@@ -98,7 +104,7 @@ time the original barrier request was sent have been received.
/**
The name of the save file. The hostname is appended to this.
*/
#define FILE ".fishd."
#define FILE "fishd."
/**
Maximum length of hostname. Longer hostnames are truncated
@@ -135,11 +141,6 @@ static int sock;
*/
static int quit=0;
/**
Dynamically generated function, made from the documentation in doc_src.
*/
void print_help();
/**
Constructs the fish socket filename
*/
@@ -386,23 +387,108 @@ static void daemonize()
}
/**
Get environment variable value. The resulting string needs to be free'd.
*/
static wchar_t *fishd_env_get( wchar_t *key )
{
char *nres, *nkey;
wchar_t *res;
nkey = wcs2str( key );
nres = getenv( nkey );
free( nkey );
if( nres )
{
return str2wcs( nres );
}
else
{
res = env_universal_common_get( key );
if( res )
res = wcsdup( res );
return env_universal_common_get( key );
}
}
/**
Get the configuration directory. The resulting string needs to be
free'd. This is mostly the same code as path_get_config(), but had
to be rewritten to avoid dragging in additional library
dependencies.
*/
static wchar_t *fishd_get_config()
{
wchar_t *xdg_dir, *home;
int done = 0;
wchar_t *res = 0;
xdg_dir = fishd_env_get( L"XDG_CONFIG_HOME" );
if( xdg_dir )
{
res = wcsdupcat( xdg_dir, L"/fish" );
if( !create_directory( res ) )
{
done = 1;
}
else
{
free( res );
}
free( xdg_dir );
}
else
{
home = fishd_env_get( L"HOME" );
if( home )
{
res = wcsdupcat( home, L"/.config/fish" );
if( !create_directory( res ) )
{
done = 1;
}
else
{
free( res );
}
free( home );
}
}
if( done )
{
return res;
}
else
{
debug( 0, _(L"Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory where the current user has write access." ));
return 0;
}
}
/**
Load or save all variables
*/
void load_or_save( int save)
static void load_or_save( int save)
{
struct passwd *pw;
char *name;
char *dir = getenv( "HOME" );
wchar_t *wdir = fishd_get_config();
char *dir;
char hostname[HOSTNAME_LEN];
connection_t c;
int fd;
if( !dir )
if( !wdir )
{
pw = getpwuid( getuid() );
dir = pw->pw_dir;
return;
}
dir = wcs2str( wdir );
free( wdir );
gethostname( hostname, HOSTNAME_LEN );
name = malloc( strlen(dir)+ strlen(FILE)+ strlen(hostname) + 2 );
@@ -410,15 +496,19 @@ void load_or_save( int save)
strcat( name, "/" );
strcat( name, FILE );
strcat( name, hostname );
free( dir );
debug( 4, L"Open file for %s: '%s'",
save?"saving":"loading",
name );
c.fd = open( name, save?(O_CREAT | O_TRUNC | O_WRONLY):O_RDONLY, 0600);
fd = open( name, save?(O_CREAT | O_TRUNC | O_WRONLY):O_RDONLY, 0600);
free( name );
if( c.fd == -1 )
if( fd == -1 )
{
debug( 1, L"Could not open load/save file. No previous saves?" );
wperror( L"open" );
@@ -426,9 +516,7 @@ void load_or_save( int save)
}
debug( 4, L"File open on fd %d", c.fd );
sb_init( &c.input );
memset (&c.wstate, '\0', sizeof (mbstate_t));
q_init( &c.unsent );
connection_init( &c, fd );
if( save )
{
@@ -439,9 +527,7 @@ void load_or_save( int save)
else
read_message( &c );
q_destroy( &c.unsent );
sb_destroy( &c.input );
close( c.fd );
connection_destroy( &c );
}
/**
@@ -485,6 +571,8 @@ int main( int argc, char ** argv )
int update_count=0;
fd_set read_fd, write_fd;
halloc_util_init();
program_name=L"fishd";
wsetlocale( LC_ALL, L"" );
@@ -494,7 +582,6 @@ int main( int argc, char ** argv )
*/
while( 1 )
{
#ifdef HAVE_GETOPT_LONG
static struct option
long_options[] =
{
@@ -520,11 +607,6 @@ int main( int argc, char ** argv )
long_options,
&opt_index );
#else
int opt = getopt( argc,
argv,
GETOPT_STRING );
#endif
if( opt == -1 )
break;
@@ -534,7 +616,7 @@ int main( int argc, char ** argv )
break;
case 'h':
print_help();
print_help( argv[0], 1 );
exit(0);
case 'v':
@@ -553,7 +635,7 @@ int main( int argc, char ** argv )
connection_t *c;
int res;
t=sizeof( remote );
t = sizeof( remote );
FD_ZERO( &read_fd );
FD_ZERO( &write_fd );
@@ -611,12 +693,8 @@ int main( int argc, char ** argv )
else
{
connection_t *new = malloc( sizeof(connection_t));
new->fd = child_socket;
connection_init( new, child_socket );
new->next = conn;
q_init( &new->unsent );
new->killme=0;
sb_init( &new->input );
memset (&new->wstate, '\0', sizeof (mbstate_t));
send( new->fd, GREETING, strlen(GREETING), MSG_DONTWAIT );
enqueue_all( new );
conn=new;
@@ -660,9 +738,6 @@ int main( int argc, char ** argv )
{
debug( 4, L"Close connection %d", c->fd );
close(c->fd );
sb_destroy( &c->input );
while( !q_empty( &c->unsent ) )
{
message_t *msg = (message_t *)q_get( &c->unsent );
@@ -671,7 +746,7 @@ int main( int argc, char ** argv )
free( msg );
}
q_destroy( &c->unsent );
connection_destroy( c );
if( prev )
{
prev->next=c->next;
@@ -692,13 +767,16 @@ int main( int argc, char ** argv )
c=c->next;
}
}
if( !conn )
{
debug( 0, L"No more clients. Quitting" );
save();
env_universal_common_destroy();
exit(0);
c=c->next;
break;
}
}
halloc_util_destroy();
}

View File

@@ -1,6 +1,14 @@
/** \file function.c
Functions for storing and retrieving function information.
Prototypes for functions for storing and retrieving function
information. These functions also take care of autoloading
functions in the $fish_function_path. Actual function evaluation
is taken care of by the parser and to some degree the builtin
handling library.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -8,15 +16,12 @@
#include <termios.h>
#include <signal.h>
#include "config.h"
#include "wutil.h"
#include "fallback.h"
#include "util.h"
#include "function.h"
#include "proc.h"
#include "translate.h"
#include "parser.h"
#include "common.h"
#include "intern.h"
@@ -25,6 +30,8 @@
#include "parse_util.h"
#include "env.h"
#include "expand.h"
#include "halloc.h"
#include "halloc_util.h"
/**
@@ -44,10 +51,6 @@ typedef struct
Line where definition started
*/
int definition_offset;
/**
Flag for specifying functions which are actually key bindings
*/
int is_binding;
/**
Flag for specifying that this function was automatically loaded
@@ -139,19 +142,6 @@ static void autoload_names( array_list_t *out, int get_hidden )
al_destroy( &path_list );
}
/**
Free all contents of an entry to the function hash table
*/
static void clear_function_entry( void *key,
void *data )
{
function_data_t *d = (function_data_t *)data;
free( (void *)d->cmd );
free( (void *)d->desc );
free( (void *)d );
}
void function_init()
{
hash_init( &function,
@@ -159,9 +149,14 @@ void function_init()
&hash_wcs_cmp );
}
static void clear_entry( void *key, void *value )
{
halloc_free( value );
}
void function_destroy()
{
hash_foreach( &function, &clear_function_entry );
hash_foreach( &function, &clear_entry );
hash_destroy( &function );
}
@@ -169,8 +164,7 @@ void function_destroy()
void function_add( const wchar_t *name,
const wchar_t *val,
const wchar_t *desc,
array_list_t *events,
int is_binding )
array_list_t *events )
{
int i;
wchar_t *cmd_end;
@@ -181,18 +175,13 @@ void function_add( const wchar_t *name,
function_remove( name );
d = malloc( sizeof( function_data_t ) );
d = halloc( 0, sizeof( function_data_t ) );
d->definition_offset = parse_util_lineno( parser_get_buffer(), current_block->tok_pos )-1;
d->cmd = wcsdup( val );
d->cmd = halloc_wcsdup( d, val );
cmd_end = d->cmd + wcslen(d->cmd)-1;
while( (cmd_end>d->cmd) && wcschr( L"\n\r\t ", *cmd_end ) )
{
*cmd_end-- = 0;
}
d->desc = desc?wcsdup( desc ):0;
d->is_binding = is_binding;
d->desc = desc?halloc_wcsdup( d, desc ):0;
d->definition_file = intern(reader_current_filename());
d->is_autoload = is_autoload;
@@ -240,7 +229,7 @@ void function_remove( const wchar_t *name )
ev.function_name=name;
event_remove( &ev );
clear_function_entry( key, d );
halloc_free( d );
/*
Notify the autoloader that the specified function is erased, but
@@ -292,7 +281,7 @@ void function_set_desc( const wchar_t *name, const wchar_t *desc )
if( data == 0 )
return;
data->desc =wcsdup(desc);
data->desc = halloc_wcsdup( data, desc );
}
/**
@@ -304,9 +293,9 @@ static int al_contains_str( array_list_t *list, const wchar_t * str )
for( i=0; i<al_get_count( list ); i++ )
{
if( wcscmp( al_get( list, i ), str) == 0 )
{
return 1;
}
{
return 1;
}
}
return 0;
}
@@ -319,9 +308,7 @@ static void get_names_internal( void *key,
void *aux )
{
wchar_t *name = (wchar_t *)key;
function_data_t *f = (function_data_t *)val;
if( name[0] != L'_' && !f->is_binding && !al_contains_str( (array_list_t *)aux, name ) )
if( name[0] != L'_' && !al_contains_str( (array_list_t *)aux, name ) )
{
al_push( (array_list_t *)aux, name );
}
@@ -365,7 +352,6 @@ const wchar_t *function_get_definition_file( const wchar_t *argv )
CHECK( argv, 0 );
load( argv );
data = (function_data_t *)hash_get( &function, argv );
if( data == 0 )
return 0;
@@ -380,7 +366,6 @@ int function_get_definition_offset( const wchar_t *argv )
CHECK( argv, -1 );
load( argv );
data = (function_data_t *)hash_get( &function, argv );
if( data == 0 )
return -1;

View File

@@ -1,8 +1,10 @@
/** \file function.h
Prototypes for functions for storing and retrieving function
information. Actual function evaluation is taken care of by the
parser and to some degree the builtin handling library.
information. These functions also take care of autoloading
functions in the $fish_function_path. Actual function evaluation
is taken care of by the parser and to some degree the builtin
handling library.
*/
#ifndef FISH_FUNCTION_H
@@ -16,30 +18,26 @@
Initialize function data
*/
void function_init();
/**
Destroy function data
*/
void function_destroy();
/**
Add an function. The parameters values are copied and should be freed by the caller.
Add an function. The parameters values are copied and should be
freed by the caller.
*/
void function_add( const wchar_t *name,
const wchar_t *val,
const wchar_t *desc,
array_list_t *events,
int is_binding );
array_list_t *events );
/**
Remove the function with the specified name.
*/
void function_remove( const wchar_t *name );
/**
Returns true if the function with the name name uses internal variables, false otherwise.
*/
int function_use_vars( const wchar_t *name );
/**
Returns the definition of the function with the name \c name.
*/
@@ -56,12 +54,13 @@ const wchar_t *function_get_desc( const wchar_t *name );
void function_set_desc( const wchar_t *name, const wchar_t *desc );
/**
Returns true if the function witrh the name name exists.
Returns true if the function with the name name exists.
*/
int function_exists( const wchar_t *name );
/**
Insert all function names into l. These are not copies of the strings and should not be freed after use.
Insert all function names into l. These are not copies of the
strings and should not be freed after use.
\param list the list to add the names to
\param get_hidden whether to include hidden functions, i.e. ones starting with an underscore
@@ -72,11 +71,18 @@ void function_get_names( array_list_t *list,
/**
Returns tha absolute path of the file where the specified function
was defined. Returns 0 if the file was defined on the commandline.
This function does not autoload functions, it will only work on
functions that have already been defined.
*/
const wchar_t *function_get_definition_file( const wchar_t *name );
/**
Returns the linenumber where the definition of the specified function started
Returns the linenumber where the definition of the specified
function started.
This function does not autoload functions, it will only work on
functions that have already been defined.
*/
int function_get_definition_offset( const wchar_t *name );

View File

@@ -1,12 +0,0 @@
#!/bin/sh
# This little script calls the man command to render a manual page and
# pipes the result into the gen_hdr2 program to convert the output
# into a C string literal.
# NAME is the name of the function we are generating documentation for.
NAME=`basename $1 .doxygen`
# Render the page
nroff -man doc_src/builtin_doc/man/man1/${NAME}.1 | col -b | cat -s | sed -e '$d' | ./gen_hdr2

Some files were not shown because too many files have changed in this diff Show More