Compare commits

...

164 Commits

Author SHA1 Message Date
axel
0b044b785a 1.20.2
darcs-hash:20060207115300-ac50b-036d087b1f3493d9ecd7fd1c31d31be5c77c26b6.gz
2006-02-07 21:53:00 +10:00
axel
ddff3561e3 Minor tweaks to expand_Variables, fixes rare memory leak
darcs-hash:20060207114857-ac50b-9b2ecf31106678ec35d888066162bf14605c6003.gz
2006-02-07 21:48:57 +10:00
axel
c4dfdfa849 Fix various uses of old set syntax
darcs-hash:20060206184145-ac50b-5140cacddec9da734d4ef9a38f053259ea1f479a.gz
2006-02-07 04:41:45 +10:00
axel
08251dcc98 Only hide /private directories under OS X
darcs-hash:20060206181717-ac50b-043020858020be5dc55c34240329916696f5892a.gz
2006-02-07 04:17:17 +10:00
axel
57d53c70e3 Further halloc:ification if fish
darcs-hash:20060206181101-ac50b-db0aac307a81e7f0677acd15a9f38ff8c7ff36d2.gz
2006-02-07 04:11:01 +10:00
axel
4e77ee4516 Fix bug that would accidentally disable interactive mode on OS X when writing the titlebar message on some systems. Found by Nick Pilon
darcs-hash:20060206152015-ac50b-63d86ca778c240012bbe1e0d28062591a10f3a54.gz
2006-02-07 01:20:15 +10:00
axel
6291be256b Second checkin of halloc changeover. Make the argv array, but not it's contents, be allocated using halloc. Also make list_to_char_arr use halloc
darcs-hash:20060206151817-ac50b-e8fd4cff831ee975c5bf3855d9ecfc15a3fb9215.gz
2006-02-07 01:18:17 +10:00
axel
e756f7d619 Minor code cleanup, don't use expand_escape and expand_unescape any more
darcs-hash:20060206151552-ac50b-e2229d096926461f643fdcdfc79ef1ff01344a35.gz
2006-02-07 01:15:52 +10:00
axel
cf3d30d4e4 Lazily load history file
darcs-hash:20060206150810-ac50b-f4e5fe9312aa898fa025d2874444c4fc5724c309.gz
2006-02-07 01:08:10 +10:00
axel
585191310b First checkin of transition to using a new hierarchical memory allocator, some of the memory associated with a job is covered
darcs-hash:20060206142502-ac50b-ba1c9a4f64ea0f44f65303a125f9ddae5bd31e2f.gz
2006-02-07 00:25:02 +10:00
axel
530bbfc9ac Make sure line counting doesn't move past end of string
darcs-hash:20060206134757-ac50b-2e80cf3ec104f7b40babef5260fb1d5435dbc74d.gz
2006-02-06 23:47:57 +10:00
axel
a521fa4165 Make execution of functions use wcsdup to make sure no memory errors happen if a function removes itself
darcs-hash:20060206134701-ac50b-27be7fe76512d6ac4313eea79b45a9c11083bccd.gz
2006-02-06 23:47:01 +10:00
axel
0f76f77173 Make sure interactive mode is of when firing events
darcs-hash:20060206134532-ac50b-93f8a7cf7be2a82a1222fb520541b08bef33baa4.gz
2006-02-06 23:45:32 +10:00
axel
c743ebf211 Add long style option support for prevd/pushd, also add a few missing translation strings
darcs-hash:20060206112453-ac50b-271b830b35176d1ff93d9d9fb6c30343b4f1b4df.gz
2006-02-06 21:24:53 +10:00
Nicholas Pilon
04ce9ecf16 Darwin Open
Tweak the open function to use /usr/bin/open on Darwin, and mimedb on everything else.

darcs-hash:20060206012623-494f2-e4626c03895065837f0c8981482d5b16313dfc08.gz
2006-02-06 11:26:23 +10:00
Nicholas Pilon
bde5921258 Describe Command awk-ification
Changed __fish_describe_command to use awk instead of sed, and handle 'alternative' names, as used by OS X. (And possibly some BSDs?)

darcs-hash:20060205221805-494f2-85a48edd8e6fbcfc1dcd28079e4adfa52a0466d0.gz
2006-02-06 08:18:05 +10:00
Nicholas Pilon
89ae02976f Completion: System Commands
Tiny tweak to sed expression to get descriptions for system commands too.

darcs-hash:20060205194830-494f2-1f1df9c2d4d1d2302e34df113c4919078388aa1a.gz
2006-02-06 05:48:30 +10:00
Nicholas Pilon
d8382acc74 PWD Tweaks
Tweaked prompt_pwd and pwd to omit the leading /private from some system directories on OS X.

darcs-hash:20060205194908-494f2-936d1346a4cd118f763bea24495edf9829b59748.gz
2006-02-06 05:49:08 +10:00
axel
749c44fe27 Minor edits of builtin.c, some reindentation and code comment improvement
darcs-hash:20060205212050-ac50b-70c1b34208b442b5670fde2c6655e09c4480c7e7.gz
2006-02-06 07:20:50 +10:00
axel
88ec924323 Another set of spelling corrections from HJB
darcs-hash:20060205211835-ac50b-d08f069c3307ec7785b038f157c919416c6bb8b7.gz
2006-02-06 07:18:35 +10:00
axel
7ff069a2e1 Make LS_COLORS non-univerasl, and contain many more filetypes
darcs-hash:20060205131422-ac50b-521f4764e463acab1fc0414f58e73af55bd62c5c.gz
2006-02-05 23:14:22 +10:00
axel
8e05c8bee8 Tiny performance tweaks
darcs-hash:20060205131335-ac50b-5b1895d50334dfe9e375ab60e723d1b62b712707.gz
2006-02-05 23:13:35 +10:00
axel
0fa3c15114 Tweaks to some source comments
darcs-hash:20060205131253-ac50b-c3ad91b280a73fc8ec318ca6c285de773ffecfc6.gz
2006-02-05 23:12:53 +10:00
axel
58667673d9 Remove duplicate line counting code. Make the remaining implementation have a two element cache.
darcs-hash:20060205131035-ac50b-885c6ba87a6d16aa48dfa7ee4608ae8891c71724.gz
2006-02-05 23:10:35 +10:00
axel
a53a9aa293 Clean up init code in builtin.c
darcs-hash:20060205130840-ac50b-1a2b29671b7d8c557ebd284513c535e082ee5cf3.gz
2006-02-05 23:08:40 +10:00
axel
09402223e8 Minor edits to the INSTALL file
darcs-hash:20060204131412-ac50b-3713bdae731b4853e598930c9823b950d3039a72.gz
2006-02-04 23:14:12 +10:00
axel
4f947015d2 Minor tweaks, including a few small performance improvements
darcs-hash:20060204130914-ac50b-331e83fd8fe472545fce60fc4b76bb8300526d64.gz
2006-02-04 23:09:14 +10:00
axel
9f3a7543aa Remove some unneeded debug messages
darcs-hash:20060204115812-ac50b-b756b9d1257be714fae52f713a48a360903437dd.gz
2006-02-04 21:58:12 +10:00
axel
7ae6805698 Minor optimization - only set locale if we actually want to output something in set_color
darcs-hash:20060204114256-ac50b-5ec72de2f15d359b8edb330ae6c5f05c4c54e4b5.gz
2006-02-04 21:42:56 +10:00
axel
1401c44a79 Don't print full stack trace for failiures in cd in interactive mode
darcs-hash:20060204113650-ac50b-465dd4b3fb27e8d90127231cccdae29ac7b8fd20.gz
2006-02-04 21:36:50 +10:00
axel
40ea5987b2 Add /opt and /opt/local to list of possibly interesting directories for PATH and library path
darcs-hash:20060204113619-ac50b-97b1e6b3c2cf32fa12bf42486f9249319f4a531b.gz
2006-02-04 21:36:19 +10:00
axel
6920f039eb Minor optimization to the prompt command
darcs-hash:20060204113512-ac50b-4604692cac17972b379a7f40599a30e0bbfc3f89.gz
2006-02-04 21:35:12 +10:00
axel
ff00354305 Make sure completions aren't run in interactive mode
darcs-hash:20060204113433-ac50b-454170ab12fbbcec9cfb6615910b611c680fcc3d.gz
2006-02-04 21:34:33 +10:00
axel
f9c63a142b Don't print errors if parent can't give child control of terminal during exec(), since child may have already exited
darcs-hash:20060204113320-ac50b-385b600789e7d1aee2a15a69658e9e0b4af838d0.gz
2006-02-04 21:33:20 +10:00
axel
3733fe3997 Make children set their own process group instead of waiting for their parent to do it for them
darcs-hash:20060203215031-ac50b-d00ce5c09b469edd968618a4bba4b5c1f7dc075c.gz
2006-02-04 07:50:31 +10:00
axel
7e3128f097 Minor comment edits in complete.c
darcs-hash:20060203213006-ac50b-86ccb93b4c984ab0d29423b8a63269bd1e161410.gz
2006-02-04 07:30:06 +10:00
axel
727472d5bd Correct broken test for gettext command
darcs-hash:20060203212939-ac50b-8a99c32124c6b643443bc7295df91d6f0c903247.gz
2006-02-04 07:29:39 +10:00
axel
3616a23bdd Add fink and pkgsrc /bin directories to PATH if they exist
darcs-hash:20060203212901-ac50b-94e02eea218c2f40542efd62060a74796cdbe363.gz
2006-02-04 07:29:01 +10:00
axel
f13262d87e Move parts of the command description lookup code to a shellscript function
darcs-hash:20060203172736-ac50b-95430eb4ca0d7ee2859237e8543a4e0883349fdb.gz
2006-02-04 03:27:36 +10:00
axel
f71cd494de prompt and terminal functions should not be run in interactive mode
darcs-hash:20060203093426-ac50b-5e6bf8382c6a5fb4b409439eddf612fffa9c752e.gz
2006-02-03 19:34:26 +10:00
axel
264c065006 Remove old unneeded code that makes fish_pager wait to become owner of the terminal
darcs-hash:20060203093314-ac50b-537c521093e85a110f822cde37b022d7706e8cb0.gz
2006-02-03 19:33:14 +10:00
axel
07c89c71d8 Fix broken test for realpath taking null as a second argument
darcs-hash:20060203004145-ac50b-5357d5f203fa66d5aaef9059e3f03866d2e7f67d.gz
2006-02-03 10:41:45 +10:00
axel
19c67db731 Make hostname completion code more robust
darcs-hash:20060203004114-ac50b-54fda8fe89649d404cd6981d7783e18f5092f217.gz
2006-02-03 10:41:14 +10:00
axel
294da72d11 Make string conversion in wutil.c handle special 'broken encoding' sequences
darcs-hash:20060203004028-ac50b-01fbe7b22aece08a7a4d1afe84affd80ce944d40.gz
2006-02-03 10:40:28 +10:00
axel
847b6daa34 Minor fix for completions for status builtin
darcs-hash:20060203003935-ac50b-fd3e5b642cdca5631f36942309b017ebbaa63cb2.gz
2006-02-03 10:39:35 +10:00
axel
807a0b8dbd Improved error checking in main()
darcs-hash:20060203003855-ac50b-d4f5c4e183dc1b38bbfe15bf44be746bb188ef10.gz
2006-02-03 10:38:55 +10:00
axel
c3a1473419 Add fish switch to enter login mode
darcs-hash:20060203003754-ac50b-99961eb6635beb0700fbd542fc7ff979ab1ceeb9.gz
2006-02-03 10:37:54 +10:00
axel
29707e66e6 Update INSTALL file to be less redundant and contain a bit of information about compilers
darcs-hash:20060202153401-ac50b-502136b1a0e1c5117a34cc1e105a718d6ea8884b.gz
2006-02-03 01:34:01 +10:00
axel
a97b652046 Minor source documentation edits
darcs-hash:20060202153330-ac50b-63ad1ac0f20b94f6015e472b52ac32040a942280.gz
2006-02-03 01:33:30 +10:00
axel
91b46b305d Make error message in contains function translatable
darcs-hash:20060202153304-ac50b-69fc557308b7ae7eb3a3d8d658e6f7c871aa68cd.gz
2006-02-03 01:33:04 +10:00
axel
fbe66f54aa Make completion of subsommands for time and sudo a bit better at differing between command and subcommand
darcs-hash:20060202153151-ac50b-d943052af165dc345366b49a5db413f635a2f28a.gz
2006-02-03 01:31:51 +10:00
axel
ff03fe7e41 Make autoconf detection for have__nl_msg_cat_cntr slightly more robust
darcs-hash:20060202152939-ac50b-9b38585f8c1d1855d08cc7fd1a75e51ff54a9b0e.gz
2006-02-03 01:29:39 +10:00
axel
06fd1aa9f8 Make stack traces print absolute filenames
darcs-hash:20060202152356-ac50b-9e6ab31c03d5f49824ccca7eee3b8e62d66b0009.gz
2006-02-03 01:23:56 +10:00
axel
5942a6d6c1 Don't reset history on cursor movement
darcs-hash:20060201155546-ac50b-975730e850775a9f47e15a65c9c5959a335edc93.gz
2006-02-02 01:55:46 +10:00
axel
a781736fb7 Swedish translation checkin
darcs-hash:20060201155516-ac50b-aeeebdc296c8684325a97edf92ad360f7675a981.gz
2006-02-02 01:55:16 +10:00
axel
feabc032f6 Generalize the stack tracing code, add support for showing events and command substitutions in stack traces
darcs-hash:20060201154911-ac50b-707358ea50231661c05a92b40ca109ec801081e6.gz
2006-02-02 01:49:11 +10:00
axel
9f9f7bf95a Minor edits to fish documentation
darcs-hash:20060201134029-ac50b-c80a9dadb4960dfbba255ca046682f2798621cf2.gz
2006-02-01 23:40:29 +10:00
axel
02f638ad2b Minor spelling fixes from Hermann J. Beckers
darcs-hash:20060201122912-ac50b-88d59b8c0e94e8a2db5b1a6f94b4fa7f25c7859e.gz
2006-02-01 22:29:12 +10:00
axel
e95effb043 Readd the terminal flag for jobs, as not all jobs under job control should be given the terminal.
darcs-hash:20060201122715-ac50b-7efc499e8905e9898c214816d0a3468e077c7005.gz
2006-02-01 22:27:15 +10:00
axel
7a1a5a6f01 Swedish translation checkin
darcs-hash:20060131220043-ac50b-f4885e4fb81bea7b84b0ea85669f813f751b9903.gz
2006-02-01 08:00:43 +10:00
axel
bfefe7f262 Add completions for the status builtin
darcs-hash:20060131215933-ac50b-330b6cb15406ee62006d0dcd3b9ae4cf70ee1e68.gz
2006-02-01 07:59:33 +10:00
axel
44e8dcd331 Add not on commandline behaviour when using complete -C to documentation
darcs-hash:20060131214646-ac50b-dc7b1510ceefc7645061d91bbe5022c09c209a34.gz
2006-02-01 07:46:46 +10:00
axel
3580811f8e Minor documentation correction regarding how to use io redirection to close a fd
darcs-hash:20060131214551-ac50b-0b687b3279d3a9c94338092bff1b0a8001e9566d.gz
2006-02-01 07:45:51 +10:00
axel
35cf20640f Add mention of the new -C switch for complete in the documentation
darcs-hash:20060131214426-ac50b-16a1b18cf8f5c05e59e1b338dde1c13089321bac.gz
2006-02-01 07:44:26 +10:00
axel
eff36003db Remove fallback version of the _nl_msg_cat_cntr symbol. We check for it at configure-time and only use it if it exists
darcs-hash:20060131214303-ac50b-c13a7addd8f35e0adce72213f5aa6dc2a35b7a73.gz
2006-02-01 07:43:03 +10:00
axel
0eab394c24 Fix for how fish parses the double quote character
darcs-hash:20060131214201-ac50b-d921c2c74fa40723ae064a90d445258aa41ec94f.gz
2006-02-01 07:42:01 +10:00
axel
028e1f36a1 Improve the status builtin
darcs-hash:20060130195310-ac50b-5da6881a847170242be56555646bbf037218d545.gz
2006-01-31 05:53:10 +10:00
axel
f59e9baab9 Rename the 'terminal' flag to 'job_control', make sure fg and bg only considers jobs under job control and make it configurable which jobs are put under job control using the status builtin. Also add an option to the status builtin to print a stack trace.
darcs-hash:20060130175426-ac50b-46fb79797284cb600c67cb19462b53761446f00a.gz
2006-01-31 03:54:26 +10:00
axel
1c6f685522 Minor code tweaks
darcs-hash:20060130165800-ac50b-8fa4a7ff78365497c5d03d6c7643d5206f41de37.gz
2006-01-31 02:58:00 +10:00
axel
c8a36c9889 Autoconf tweaks to make library detection more robust
darcs-hash:20060130165706-ac50b-e7685a85f07811815fb01ac3b79609ea7f0a7786.gz
2006-01-31 02:57:06 +10:00
axel
521d09b6d0 Add support for calculating completions for arbitrary commands through the 'complete' builtin
darcs-hash:20060130165150-ac50b-5e2ef3bb0298dd5e1a5d6fbdade314cc73ef36f3.gz
2006-01-31 02:51:50 +10:00
axel
3efb0bf5cf Fix bug that caused shellscript functions in pipelines that don't have any output to never be properly removed
darcs-hash:20060129220414-ac50b-8c26e83933a73ef146c28bed020a6a2dfeca425f.gz
2006-01-30 08:04:14 +10:00
axel
003c4d776f Display use of . (source) builtin in stack traces
darcs-hash:20060128113440-ac50b-6556097eb766cc7561a3d30ef994bc913181fe65.gz
2006-01-28 21:34:40 +10:00
axel
00dea8a082 Optimize the fish_prompt function
darcs-hash:20060128102551-ac50b-58580c29fd9537e502bacaad7949433010b5a04b.gz
2006-01-28 20:25:51 +10:00
axel
7f195b2f23 Swedish translation checkin (small)
darcs-hash:20060128022149-ac50b-e4089e5517b80ea05aa2d1e2597fc83fc346feb4.gz
2006-01-28 12:21:49 +10:00
axel
ecc2fbca98 Minor documentation tweaks
darcs-hash:20060128022118-ac50b-555ebb17d4f43692a5f363a085dcbcf57aa69111.gz
2006-01-28 12:21:18 +10:00
axel
631acd529d Fix typo in sudo completions
darcs-hash:20060128022054-ac50b-8d859c4481c34c5830e9b5fa9e436e165160547e.gz
2006-01-28 12:20:54 +10:00
axel
369f1709be Misc init-files cleanup, including making sure various variables are function-local
darcs-hash:20060128022022-ac50b-3a9fabe385f53559dd9e0bb5d8f9994d833ced1d.gz
2006-01-28 12:20:22 +10:00
axel
1505cc3d81 Add comment in documentation for set builtin about not allowing switches after non-switches
darcs-hash:20060128021933-ac50b-db340075e9a57b41a91d6b64d56d9b5579185254.gz
2006-01-28 12:19:33 +10:00
axel
78ae6d3bea Check for gettext in seq fallback implementation
darcs-hash:20060128021846-ac50b-7c11eea694e5c3b87e00508fbeaedc9dcd163726.gz
2006-01-28 12:18:46 +10:00
axel
ea81321ccb Add translation support to wgetopt library
darcs-hash:20060128021740-ac50b-f670531d3d79cb8070756669f83f4e8b25233a0a.gz
2006-01-28 12:17:40 +10:00
axel
1977d3beb3 Add support for correctly handling illegal character strings
darcs-hash:20060128020329-ac50b-d3499e6ff9108cef25bf7e00f39bbe1476896e07.gz
2006-01-28 12:03:29 +10:00
axel
285984196d More spelling fixes from Hermann J. Beckers
darcs-hash:20060128003459-ac50b-af346d3abc52bf1bb4de43cbbaa3d87b3b7264eb.gz
2006-01-28 10:34:59 +10:00
axel
5f8e6c85e4 Small fixes for emerge completions, sent by Mike Auty
darcs-hash:20060127082639-ac50b-881d00da4712a2d149618c07356c8d711bf55ac9.gz
2006-01-27 18:26:39 +10:00
axel
e01ccb14af shellscript functions should use the help command to display help
darcs-hash:20060126173437-ac50b-69c03761554180467f741a9597205fab6c823378.gz
2006-01-27 03:34:37 +10:00
axel
86b7ae6d21 1.20.1
darcs-hash:20060126163046-ac50b-483c77663467060a13015bcee755f708a86157e9.gz
2006-01-27 02:30:46 +10:00
axel
bc42309dd8 Minor build fix
darcs-hash:20060126163002-ac50b-7766f42b8b3807a17577ed78819ab947ceb66e44.gz
2006-01-27 02:30:02 +10:00
axel
877b602d6b Fix bug in debian specific kill completions
darcs-hash:20060126160119-ac50b-1d1b5c248753f4c0ac77a838ea36eeb87473dbe9.gz
2006-01-27 02:01:19 +10:00
axel
37eb6c340d Make it possible to create zero length environment variable arrays without using the ENV_USER flag
darcs-hash:20060126154823-ac50b-21d0bdbd367289723cdda355cf6465264df565cf.gz
2006-01-27 01:48:23 +10:00
axel
7cd98a670b Fix glitches in stack trace
darcs-hash:20060126154722-ac50b-0d44e98b6d98e3b42f60f66f5bfa2c5f97ea2bd8.gz
2006-01-27 01:47:22 +10:00
axel
db0eccdc86 Checkin of swedish translations and some smaller changes to the emerge completion descriptions
darcs-hash:20060126151717-ac50b-7c8758dadf971f3cc25facb69176f6b6a7d683a4.gz
2006-01-27 01:17:17 +10:00
axel
0f10a3a277 Small output string tweaks
darcs-hash:20060126151659-ac50b-a6a7fbe764f0a8adb06f62efd233ef377178d521.gz
2006-01-27 01:16:59 +10:00
axel
312c7ab7b2 Add function stack trace to error output
darcs-hash:20060126144810-ac50b-3426191f596674504ce49dd61fcfa3c2c0c0f2bb.gz
2006-01-27 00:48:10 +10:00
axel
2e35e1ea60 util.h should include unistd.h
darcs-hash:20060126122134-ac50b-8701e01f5fac64df23b3d3437aea00d0223a05c7.gz
2006-01-26 22:21:34 +10:00
axel
b9c88f4c83 Spelling fixes, from Hermann J. Beckers
darcs-hash:20060126121659-ac50b-8c6a788e9750826c623d028410360da7353de9ea.gz
2006-01-26 22:16:59 +10:00
axel
5054492c6a Fixes to make fish work on Cygwin. Firstly a bunch of minor fixes fo the wcs* fallback functions, secondly MSG_DONTWAIT (a socket flag) is set to zero if it isn't already defined
darcs-hash:20060126095706-ac50b-766c1e2c0408dc51fc7379af38005352f7603b1e.gz
2006-01-26 19:57:06 +10:00
axel
5893154823 Add completions for emerge command
darcs-hash:20060124233229-ac50b-401bc6944f5f7bbe4836361061c0ecfe0f982656.gz
2006-01-25 09:32:29 +10:00
axel
4a4e1788e5 Swedish translation checkin
darcs-hash:20060124230850-ac50b-4db62238ef87351c28c164acd32bdd82d04ac11d.gz
2006-01-25 09:08:50 +10:00
axel
3d56d7ee32 Add completions for sshfs, fusermount and sudo
darcs-hash:20060124230133-ac50b-b6b8685b2c3771ec1699661de88ba45fe47df82d.gz
2006-01-25 09:01:33 +10:00
axel
18d06cf10f Smaller edits
darcs-hash:20060124181410-ac50b-4ec9e2990852a678de7d47a565ed41780b5279fc.gz
2006-01-25 04:14:10 +10:00
axel
452558624c Installation should not rely on making the .po files
darcs-hash:20060124181245-ac50b-27104b2918c53230377afcd8b684335aafb7ed76.gz
2006-01-25 04:12:45 +10:00
axel
b7ef6852c7 Add autoconf test for regex.h
darcs-hash:20060124181205-ac50b-3bd50ce2b55f58994633556af790c06c4205798b.gz
2006-01-25 04:12:05 +10:00
axel
fef420d648 Make the prompt_pwd behave better with strange sed implementations (I'm looking at you, OS X)
darcs-hash:20060124180944-ac50b-63f45e0ef950fca45b1c5eaa48e960895d418631.gz
2006-01-25 04:09:44 +10:00
axel
f2c4becde7 Add better test for whether the gettext command should be used
darcs-hash:20060124180850-ac50b-63529a14009c08f8985254565426b996bb16ef92.gz
2006-01-25 04:08:50 +10:00
axel
e0d6b5c438 Add manual page for fish_pager command
darcs-hash:20060124180729-ac50b-ee2811e3a96d7f29f372ea5a5b1d08ff9045545a.gz
2006-01-25 04:07:29 +10:00
James Vega
265d016721 doc_src/fishd.txt, fishd.c: Move the API description of fishd to the source file. Update the fishd help to indicate the new help and version options as well as a warning about fiddling with ~/.fishd.HOSTNAME.
darcs-hash:20060124172031-35ec8-6dbd2bdd1cca3528011f7a088630533a4fea25ab.gz
2006-01-25 03:20:31 +10:00
James Vega
495460066c Fixed various spelling mistakes.
darcs-hash:20060123231706-35ec8-2a30db603eee503d944b06d101cc88ce59340309.gz
2006-01-24 09:17:06 +10:00
axel
8df21a1cb1 Minor edits, mostly tweaks of the API documentation
darcs-hash:20060123233347-ac50b-44ebb96ba202c062739ba3d183519e28a95511b2.gz
2006-01-24 09:33:47 +10:00
axel
ba177b48d5 Do not show function body as description in output of the functions builtin
darcs-hash:20060123233213-ac50b-6887d4a2a9536e0697ab5ed0b1277dc645018cb9.gz
2006-01-24 09:32:13 +10:00
axel
29c488c6dc Fixes to api documentation, added .PHONY to makefile actions, made a few private functions static
darcs-hash:20060123204014-ac50b-b9d2a10c7f00945b5d9d244cb3b8c1489fe280de.gz
2006-01-24 06:40:14 +10:00
axel
14ae10daf7 Hopefully the last attempt at fixing the build rules for making .po and .gmo files
darcs-hash:20060123174742-ac50b-194561d756a9f3d78e1aeffe16e6c4d7c81593fe.gz
2006-01-24 03:47:42 +10:00
axel
ecdc5bdbc7 Add notice to set_text documentation about the use of --bold to brighten colors on some terminals
darcs-hash:20060123173811-ac50b-0ff42512a62fcebf1224b0aac9a47f04ed92c1c9.gz
2006-01-24 03:38:11 +10:00
axel
64fee9865e Add gettext i18n support for the set_color command
darcs-hash:20060123173720-ac50b-3e7621d28d041042c3bf7424a8210013d7c72b29.gz
2006-01-24 03:37:20 +10:00
axel
89eb80f3a4 Add option parsing and support for -h and -v switches to fishd
darcs-hash:20060123162534-ac50b-e993c28ee80cf83dc1f83a64f2cf7bac5dc1c55d.gz
2006-01-24 02:25:34 +10:00
axel
9853286bf9 the 'unknown' filetype description shouldn't be tranlated, since it is never used
darcs-hash:20060123154923-ac50b-bd7f826f77d33d26070b231ba630459e45ae6937.gz
2006-01-24 01:49:23 +10:00
axel
7d645ccc53 Use gettext to translate mimedb command. Also try to respect users locale setting when choosing language on file descriptions.
darcs-hash:20060123154500-ac50b-2a2eb9c24f41d2bbe05fc4c40dca31aaaca71979.gz
2006-01-24 01:45:00 +10:00
axel
820da6e7f7 Minor touchups of the complete.c file
darcs-hash:20060123114229-ac50b-b1f0ced50e81afd28807b6c8db3ab59f3e550130.gz
2006-01-23 21:42:29 +10:00
axel
3466f55ea0 Add completions for the time command, and improve completions for the type builtin and the su command
darcs-hash:20060123113936-ac50b-ba6f2516a8ce47734afd8da50fadf8995362da65.gz
2006-01-23 21:39:36 +10:00
axel
b969a175d4 Cleanup Makefile.in and make sure gen_hdr.sh is executable before using it
darcs-hash:20060123113807-ac50b-3959a084721ea2aebd7e5751788c82f633c2984a.gz
2006-01-23 21:38:07 +10:00
axel
bb079f5446 The seq fallback implementation is a shellscript, not a function
darcs-hash:20060123113648-ac50b-d6be198177d3b822b4e5270a70064f764ecf3cf7.gz
2006-01-23 21:36:48 +10:00
axel
250d20bfa8 Swedish translation for the seq command
darcs-hash:20060122234112-ac50b-35bd9ebd3867fdf72c388c3c0f1a8745b60f471d.gz
2006-01-23 09:41:12 +10:00
axel
58761f82e7 Avoid memory leaks in the complete builtin on errors
darcs-hash:20060122234003-ac50b-6b1b63d1b8fc9b8cfc7aa64b49db386618718d78.gz
2006-01-23 09:40:03 +10:00
axel
0ccc657aa6 Fix bug from the modified completion builtin where a completion that specified no switches would be ignored
darcs-hash:20060122233000-ac50b-779c3bbb08d1bdaaa6c6eae6192413d6b71aff21.gz
2006-01-23 09:30:00 +10:00
axel
7f01570caf .po should not depend on the messages.pot file, since it will cause that file to be autogenerated on build. Also, add a few comments to the Makefile.
darcs-hash:20060122213548-ac50b-e3d6c30bdfa401c03248fb88f96a0c6457fe9773.gz
2006-01-23 07:35:48 +10:00
axel
0dadd83fdd Move the complete builtin to it's own file, and make it accept multiple -c, -p, -s, -o and -l switches
darcs-hash:20060122211055-ac50b-6ef8cff7fb02e974d6a8096bf83bcbed429d7322.gz
2006-01-23 07:10:55 +10:00
axel
3e3541a05a Add simple fallback implementation of seq command, installed automatically on systems which lack the regular seq command
darcs-hash:20060122210756-ac50b-f09a50f61137acef18f0d2be16e2556b2cdea921.gz
2006-01-23 07:07:56 +10:00
axel
a824646d61 Add input checks to string_buffer_t functions
darcs-hash:20060121211629-ac50b-ce18cd1f58cf962d21e553fa292576ea7b3382ed.gz
2006-01-22 07:16:29 +10:00
axel
74fb5bd5e5 Minor tweaks of init files
darcs-hash:20060121211239-ac50b-02fc95b123698b972063c2cd1cd8e85d548e1f8b.gz
2006-01-22 07:12:39 +10:00
axel
f2d6ae3220 Swedish translation fixes (tiny)
darcs-hash:20060121204514-ac50b-53ce3806d118e3d5d6ae51ae3822d8424479c192.gz
2006-01-22 06:45:14 +10:00
axel
487c275926 Bugfix for command completion descriptions, potential crash on strange output from apropos
darcs-hash:20060121204423-ac50b-b4583611b49f9ec54de7b8529b2652ce93d03980.gz
2006-01-22 06:44:23 +10:00
axel
2f143303b7 Fix broken PATH check
darcs-hash:20060121204217-ac50b-70b29fcb9eb17ca739f595b589d196186a5b4860.gz
2006-01-22 06:42:17 +10:00
axel
78296d4fac Add autoconf test for presense of _nl_msg_cat_cntr
darcs-hash:20060121160234-ac50b-e41abc6688846ab207b9b6c3143cd694f8452154.gz
2006-01-22 02:02:34 +10:00
axel
fea22833cd Use backticks for command substitutions in Makefile to make it work on older sh implementations
darcs-hash:20060121160117-ac50b-80b950ee724d149a0cdf8373c9a2a8dcc21bed04.gz
2006-01-22 02:01:17 +10:00
axel
b9b09babbe Swedish translation updates, including switch of quoting character
darcs-hash:20060121123932-ac50b-3017ec3eb550a60cb970f2410a067ee20cdeee75.gz
2006-01-21 22:39:32 +10:00
axel
ba261cbb55 Description tweak
darcs-hash:20060121123912-ac50b-7bbd6af7efc08adb5162daedfb7bd129caa76836.gz
2006-01-21 22:39:12 +10:00
axel
4eb3370edf Error message update
darcs-hash:20060121123828-ac50b-bb81b8cf34a09c750a02c15d92bcdae11f4b9bad.gz
2006-01-21 22:38:28 +10:00
axel
f7a5ca5f1f Fix minor spelling detail
darcs-hash:20060121025307-ac50b-8bfe0dba8292f53fe44655afb6a7a9cdf813d7e8.gz
2006-01-21 12:53:07 +10:00
axel
f3c93c1690 Fix two bugs which together caused descriptions to be interpreted as a part of the completion in some rare cases
darcs-hash:20060121025206-ac50b-2bda82d8a9acdcdc9298e9986fbd38696514249f.gz
2006-01-21 12:52:06 +10:00
axel
e55bd063eb Minor edits to the todo part of the fish documentation
darcs-hash:20060120171603-ac50b-d63052e2e6ddd82946946c8b88c3f8eebe1c5013.gz
2006-01-21 03:16:03 +10:00
axel
bdf4214b1f Add a few Doxygen function descriptions
darcs-hash:20060120163404-ac50b-db110c6aa590b9c717a9755071f74dabdb370c3c.gz
2006-01-21 02:34:04 +10:00
axel
9fd20e63cf Make sure _nl_msg_cat_cntr exists even if libintl doesn't, and use printf command if the gettext command isn't installed. Both of these are needed on systems without gettext support.
darcs-hash:20060120163156-ac50b-4b98e605f297bb435596fc2a66c413f0be5a5751.gz
2006-01-21 02:31:56 +10:00
axel
a47065f648 Add fallback implementations of wcstok, putwc and getwc. Move all fallbacks from common.c to wutil.c.
darcs-hash:20060120142721-ac50b-4b9850d889e2210e1d545339e29dcc038a3f2b04.gz
2006-01-21 00:27:21 +10:00
axel
70351b0e4f Add missing completion for the -b switch for function builtin
darcs-hash:20060119150041-ac50b-a8d27c60747a47c63f3d89e6bb94b70b9f976ee1.gz
2006-01-20 01:00:41 +10:00
axel
12a0f6d72b Swedish tranlations checkin
darcs-hash:20060119134518-ac50b-4a70b43bd613a5a6e9d08b280eb2814778f0e6ee.gz
2006-01-19 23:45:18 +10:00
axel
d2c12e760c Fix crash bugs in fg and bg builtins, and make sure bg doesn't consider background jobs when run without an argument
darcs-hash:20060119131515-ac50b-d080ffde013419e2a461cf860b4858b88404ff33.gz
2006-01-19 23:15:15 +10:00
axel
e0c2ce24fb Add missing includes in input_common.c
darcs-hash:20060119122322-ac50b-8d0c2bc21ec137d6cd5bf845156d0fc68b005440.gz
2006-01-19 22:23:22 +10:00
axel
1e7dd4f928 Check location of term.h header (updated)
darcs-hash:20060119122207-ac50b-c573f54cbe13a1592a20342ee331159be0306913.gz
2006-01-19 22:22:07 +10:00
axel
3259da8f4a Define a few additional signals
darcs-hash:20060118184046-ac50b-d5a4275af398d5a8bb8a82eca90e1b189b99a4c6.gz
2006-01-19 04:40:46 +10:00
axel
619f076958 Don't include intl headers in translate.h if we're not going to use gettext
darcs-hash:20060118183758-ac50b-ae3aef1154a9be6e39e154ad420d0881e7f86c85.gz
2006-01-19 04:37:58 +10:00
axel
588bc1103a Make it possible to manually rebuild an existing messages.pot using 'make messages'. Don't use the --no-wrap switch for xgettext, since it's not universally supported. Print an explanation if xgettext fails.
darcs-hash:20060118165917-ac50b-2bea9293231907ea373216dbd6097a359886a062.gz
2006-01-19 02:59:17 +10:00
axel
13e94c0617 Don't print error message in fg if the command didn't fail
darcs-hash:20060118164750-ac50b-af59573292b32b87d0257c501eb7989062503653.gz
2006-01-19 02:47:50 +10:00
axel
efd01ae6c6 Don't automatically rebuild messages.pot every time the source changes
darcs-hash:20060118155929-ac50b-8134050a43269c35d582fb4410449d64dbbebb52.gz
2006-01-19 01:59:29 +10:00
axel
9017df15a8 Add completions for a fex more darcs subcommands
darcs-hash:20060118143022-ac50b-01db2f5ef449a4667bef351b10543c3a6b6e8a22.gz
2006-01-19 00:30:22 +10:00
axel
5340d2a18a Corrections for the swedish translation
darcs-hash:20060118131236-ac50b-e3a02d965a44c68b5ad13a50f07cde62c02f4b40.gz
2006-01-18 23:12:36 +10:00
axel
e5298a99f8 Add friendly messages to Makefile commands
darcs-hash:20060118131143-ac50b-8141e527e8047d4551548b629e01c18eef5d411e.gz
2006-01-18 23:11:43 +10:00
axel
05736978bb Change the foregrounf/background code a bit, fixes bug where mulktiple jobs want foreground status. Is this fix enough or are there still corner cases?
darcs-hash:20060118124248-ac50b-cbbddb8c6dad1f44826050395cda647fa9348f0f.gz
2006-01-18 22:42:48 +10:00
axel
e15c7fd7e0 Optionally add intl library, needed by gettext on NetBSD. Also clean up configure.ac a bit.
darcs-hash:20060118124113-ac50b-ef767f474de5bc27edc986be7526bdeb814f855a.gz
2006-01-18 22:41:13 +10:00
axel
509b3598f7 Make manual and completions reflect the facty that any combination od set_color params are valid values for $fish_color_* variables
darcs-hash:20060117193450-ac50b-636c59494399d88151174ee28096d93c0bcdd16d.gz
2006-01-18 05:34:50 +10:00
axel
aa783fc657 Remove some GNU preprocessor magic from wgetopt.c, it only applies to regular getopt
darcs-hash:20060117172412-ac50b-a2dabf19abe158674674f98b3ce10464a6826b36.gz
2006-01-18 03:24:12 +10:00
axel
84bbbe4252 Remove accidental newline in error message
darcs-hash:20060117172312-ac50b-5c77d13f879e7da44a97f158d0372e7e536c2c81.gz
2006-01-18 03:23:12 +10:00
axel
90fbe5eb0b color ls support under FreeBSD and OS X
darcs-hash:20060117172005-ac50b-6fddf68de744cfe42cab7237325025ab27fc17ad.gz
2006-01-18 03:20:05 +10:00
axel
d5f4df15d4 Fix broken 'type' function, and clean up the ugly 'help' function. By Philip Ganchev.
darcs-hash:20060117165613-ac50b-b68c1b17708f01d9550dab242778f19590a3711d.gz
2006-01-18 02:56:13 +10:00
axel
fd78f67d35 Fix buggy error messages in expand.h and add missing translation commands
darcs-hash:20060117124830-ac50b-0981a49f5746ec951ddfb1a3097c5009c1eb0385.gz
2006-01-17 22:48:30 +10:00
axel
28c29f569b Set version to 1.20.0
darcs-hash:20060116165451-ac50b-63e3cc280cb7deedadcfd69b542d9e54a7bc99c7.gz
2006-01-17 02:54:51 +10:00
122 changed files with 9060 additions and 5424 deletions

31
INSTALL
View File

@@ -2,39 +2,38 @@
Known issues
============
Older versions of Doxygen has bugs in the man-page generation which
cause the builtin help to render incorrectly. Version 1.2.14 is known
to have this problem.
Fish currently requires a semi-modern GCC version to
compile. Specifically, GCC 2.95.* won't compile fish, but GCC 3.23
should work. Fish has not been coded with an C99- or GNU-specific
features in mind, so it is hoped that it should be possible to make
fish work with other compilers. Patches are welcome.
In version 1.9.2, the installation prefix for fish rpms and debs has
changed from /usr/local to /usr. The package should automatically
change any instances of /usr/local/bin/fish in /etc/passwd to
/usr/bin/fish, but some programs, like screen, may need to be
restarted to notice the changes. You may also run into problems when
switching between using a package and personal builds.
Older versions of Doxygen has bugs in the man-page generation which
cause the builtin help to render incorrectly. Doxygen 1.2.14 is known
to have this problem.
Prerequisites
=============
Fish requires the following packages to build:
Fish requires the following programs and libraries to build:
- Doxygen
- Curses or Ncurses
- GNU make
- GCC
fish also relies on standard unix tools such as cat, cut, grep, sed,
whoami and echo. Fish does not support cross-compilation, separate
build directories or any other fancy configure options. Use a recent
version of Doxygen, since older versions have bugs that make the
builtin help pages render incorrectly. Version 1.2.14 is known to be
broken.
whoami, bc and echo. Fish does not yet support cross-compilation,
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
autoconf.
the autoconf command first. Then use the following commands to compile
fish:
% ./configure
% make # Compile fish

View File

@@ -16,6 +16,10 @@
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
# @configure_input@
#
#
# Makefile for the fish shell. Can build fish and associated
# applications, install them, recalculate dependencies and also create
@@ -28,14 +32,16 @@
# hallucinations.
#
# Compiler flags
# Programs
CC := @CC@
CFLAGS := @CFLAGS@ @INCLUDEDIR@ -Wall -std=gnu99 -fno-strict-aliasing
CPPFLAGS=@CPPFLAGS@
LDFLAGS:= -l@CURSESLIB@ @LIBS@ @LDFLAGS@ @LIBDIR@
INSTALL:=@INSTALL@
# Compiler flags
CFLAGS:=@CFLAGS@ -Wall -std=gnu99 -fno-strict-aliasing
CPPFLAGS=@CPPFLAGS@
LDFLAGS:= @LIBS@ @LDFLAGS@
# Installation directories
prefix = @prefix@
exec_prefix = @exec_prefix@
datadir = @datadir@
@@ -47,6 +53,10 @@ fishfile = @fishfile@
fishinputfile = @fishinputfile@
docdir = @docdir@
#Init files to install
INIT_DIR_INSTALL = init/fish_interactive.fish init/fish_function.fish init/fish_complete.fish
# Set to 1 if we have gettext
HAVE_GETTEXT=@HAVE_GETTEXT@
# All objects used by fish, that are compiled from an ordinary .c file
@@ -55,31 +65,42 @@ COMMON_OBJS := function.o builtin.o common.o complete.o env.o exec.o \
expand.o highlight.o history.o kill.o parser.o proc.o reader.o \
sanity.o tokenizer.o util.o wildcard.o wgetopt.o wutil.o input.o \
output.o intern.o env_universal.o env_universal_common.o \
input_common.o event.o signal.o io.o translate.o
input_common.o event.o signal.o io.o translate.o parse_util.o \
halloc.o
# builtin_help.h exists, but builtin_help.c is autogenerated
COMMON_OBJS_WITH_HEADER := builtin_help.o
# main.c exists, but main.h does not, etc.
COMMON_OBJS_WITH_CODE := builtin_set.o builtin_commandline.o builtin_ulimit.c
COMMON_OBJS_WITH_CODE := builtin_set.o builtin_commandline.o \
builtin_ulimit.c builtin_complete.o
# All objects that the system needs to build fish
FISH_OBJS := $(COMMON_OBJS) $(COMMON_OBJS_WITH_CODE) $(COMMON_OBJS_WITH_HEADER) main.o
FISH_PAGER_OBJS := fish_pager.o common.o output.o util.o wutil.o tokenizer.o input_common.o env_universal.o env_universal_common.o translate.o
FISH_TESTS_OBJS := $(COMMON_OBJS) $(COMMON_OBJS_WITH_CODE) $(COMMON_OBJS_WITH_HEADER) fish_tests.o
FISH_OBJS := $(COMMON_OBJS) $(COMMON_OBJS_WITH_CODE) \
$(COMMON_OBJS_WITH_HEADER) main.o
# All objects that the system needs to build fish_pager
FISH_PAGER_OBJS := fish_pager.o common.o output.o util.o wutil.o \
tokenizer.o input_common.o env_universal.o env_universal_common.o \
translate.o halloc.o
# All objects that the system needs to build fish_tests
FISH_TESTS_OBJS := $(COMMON_OBJS) $(COMMON_OBJS_WITH_CODE) \
$(COMMON_OBJS_WITH_HEADER) fish_tests.o
# All objects that the system needs to build fishd
FISHD_OBJS := fishd.o env_universal_common.o common.o util.o wutil.o \
doc_src/fishd.o halloc.o
#All objects that the system needs to build mimedb
# All objects needed to build mimedb
MIME_OBJS := mimedb.o xdgmimealias.o xdgmime.o xdgmimeglob.o \
xdgmimeint.o xdgmimemagic.o xdgmimeparent.o wutil.o
xdgmimeint.o xdgmimemagic.o xdgmimeparent.o wutil.o halloc.o
#
# Files containing documentation for builtins. Should be listed
# alphabetically, since this is the order in which they will be written
# in the help file.
#
BUILTIN_DOC_SRC := doc_src/source.txt doc_src/and.txt \
doc_src/begin.txt doc_src/bg.txt doc_src/bind.txt \
doc_src/block.txt doc_src/break.txt doc_src/builtin.txt \
@@ -103,19 +124,22 @@ BUILTIN_DOC_HDR := $(BUILTIN_DOC_SRC:.txt=.doxygen)
# alphabetically, since this is the order in which they will be written
# in the help file.
#
CMD_DOC_SRC := doc_src/count.txt doc_src/dirh.txt doc_src/dirs.txt \
doc_src/fishd.txt doc_src/help.txt doc_src/mimedb.txt \
doc_src/nextd.txt doc_src/open.txt doc_src/popd.txt \
doc_src/prevd.txt doc_src/psub.txt doc_src/pushd.txt \
doc_src/set_color.txt doc_src/trap.txt doc_src/type.txt \
doc_src/umask.txt doc_src/vared.txt
CMD_DOC_SRC := doc_src/contains.txt doc_src/count.txt doc_src/dirh.txt \
doc_src/dirs.txt doc_src/fish_pager.txt doc_src/fishd.txt \
doc_src/help.txt doc_src/mimedb.txt doc_src/nextd.txt \
doc_src/open.txt doc_src/popd.txt doc_src/prevd.txt \
doc_src/psub.txt doc_src/pushd.txt doc_src/set_color.txt \
doc_src/trap.txt doc_src/type.txt doc_src/umask.txt \
doc_src/vared.txt
#
# Files generated by running doxygen on the files in $(CMD_DOC_SRC)
#
CMD_DOC_HDR := $(CMD_DOC_SRC:.txt=.doxygen)
#
# Files in the test directory
#
TEST_IN := $(wildcard tests/test*.in)
#
@@ -134,7 +158,7 @@ MAIN_DIR_FILES := Doxyfile Doxyfile.user Makefile.in configure \
$(COMMON_OBJS:.o=.h) $(COMMON_OBJS_WITH_CODE:.o=.c) \
$(COMMON_OBJS:.o=.c) builtin_help.hdr fish.spec.in INSTALL README \
user_doc.head.html xsel-0.9.6.tar ChangeLog config.sub \
config.guess fish_tests.c main.c fish_pager.c fishd.c
config.guess fish_tests.c main.c fish_pager.c fishd.c seq.in
# Files in ./init/
INIT_DIR_FILES :=init/fish.in init/fish_complete.fish.in \
@@ -148,13 +172,15 @@ TESTS_DIR_FILES := $(TEST_IN) $(TEST_IN:.in=.out) $(TEST_IN:.in=.err) \
COMPLETIONS_DIR_FILES := $(wildcard init/completions/*.fish)
# Programs to build
PROGRAMS:=fish set_color @XSEL@ mimedb count fish_pager fishd
PROGRAMS:=fish set_color @XSEL@ @SEQ_FALLBACK@ mimedb count fish_pager fishd
# Manuals to install
MANUALS:=doc_src/fish.1 @XSEL_MAN_PATH@ \
doc_src/builtin_doc/man/man1/mimedb.1 \
doc_src/builtin_doc/man/man1/set_color.1 \
doc_src/builtin_doc/man/man1/count.1
doc_src/builtin_doc/man/man1/count.1 \
doc_src/builtin_doc/man/man1/fishd.1 \
doc_src/builtin_doc/man/man1/fish_pager.1
#All translation message catalogs
TRANSLATIONS_SRC := $(wildcard po/*.po)
@@ -162,15 +188,19 @@ TRANSLATIONS := $(TRANSLATIONS_SRC:.po=.gmo)
#Make everything needed for installing fish
all: $(PROGRAMS) user_doc
@echo fish has now been built.
@echo Use \'make install\' to install fish.
.PHONY: all
debug:
make fish CFLAGS="-O0 -Wno-unused -Werror -g @INCLUDEDIR@ -Wall -std=gnu99 -fno-strict-aliasing"
make fish CFLAGS="-O0 -Wno-unused -Werror -g -Wall -std=gnu99 -fno-strict-aliasing"
.PHONY: debug
# User documentation, describing the features of the fish shell.
user_doc: doc.h Doxyfile.user user_doc.head.html
doxygen Doxyfile.user
#Source code documentation. Also includes user documentation.
# Source code documentation. Also includes user documentation.
doc: *.h *.c doc.h Doxyfile builtin_help.c
doxygen;
@@ -184,6 +214,7 @@ doc/refman.pdf: doc
test: $(PROGRAMS) fish_tests
./fish_tests; cd tests; ../fish <test.fish;
.PHONY: test
xsel-0.9.6:
tar -xf xsel-0.9.6.tar
@@ -215,26 +246,30 @@ doc.h:$(BUILTIN_DOC_SRC) $(CMD_DOC_SRC) doc_src/doc.hdr
echo "*/" >>$@
# Compile translation file
%.gmo:%.po
%.gmo:
if test $(HAVE_GETTEXT) = 1; then \
msgfmt $*.po -o $*.gmo; \
fi
# Update existing po file or copy messages.pot
%.po: messages.pot
%.po:messages.pot
if test $(HAVE_GETTEXT) = 1;then \
if test -f $*.po; then \
msgmerge -U --backup=existing --no-wrap $*.po messages.pot;\
msgmerge -U --backup=existing $*.po messages.pot;\
else \
cp messages.pot $*.po;\
fi; \
fi
# Create a template translation object
messages.pot: *.c *.h init/*.in init/*.fish init/completions/*.fish
messages.pot: *.c *.h init/*.in init/*.fish init/completions/*.fish seq
if test $(HAVE_GETTEXT) = 1;then \
xgettext -k_ -kN_ -kcomplete_desc --no-wrap *.c *.h -o messages.pot; \
xgettext -j -k_ -LShell --no-wrap init/*.in init/*.fish init/completions/*.fish -o messages.pot; \
xgettext -k_ -kN_ -kcomplete_desc *.c *.h -o messages.pot; \
if ! xgettext -j -k_ -LShell init/*.in init/*.fish init/completions/*.fish seq -o messages.pot; then \
echo "Your xgettext version is too old to build the messages.pot file"\
rm messages.pot\
false;\
fi; \
fi
# Generate the internal help functions by making doxygen create
@@ -272,6 +307,7 @@ messages.pot: *.c *.h init/*.in init/*.fish init/completions/*.fish
builtin_help.c: $(BUILTIN_DOC_HDR) doc_src/count.doxygen gen_hdr2 gen_hdr.sh builtin_help.hdr $(CMD_DOC_HDR)
cd doc_src; doxygen; cd ..;
cp builtin_help.hdr builtin_help.c;
chmod 755 gen_hdr.sh
for i in $(BUILTIN_DOC_HDR) doc_src/count.doxygen ; do \
echo ' hash_put( &tbl, L"'`basename $$i .doxygen`'",' >>$@; \
./gen_hdr.sh $$i >>$@; \
@@ -293,11 +329,16 @@ builtin_help.c: $(BUILTIN_DOC_HDR) doc_src/count.doxygen gen_hdr2 gen_hdr.sh bui
echo "void print_help()" >>$@
echo "{" >>$@
echo ' printf( "%s",' >>$@
chmod 755 gen_hdr.sh
./gen_hdr.sh $*.doxygen >>$@
echo ");" >>$@
echo "}" >>$@
#man -- doc_src/builtin_doc/man/man1/`basename $@ .c`.1 | cat -s | ./gen_hdr2 >>$@
#
# The build rules for installing/uninstalling
#
install: all install-translations
$(INSTALL) -m 755 -d $(DESTDIR)$(bindir)
for i in $(PROGRAMS); do\
@@ -306,7 +347,7 @@ install: all install-translations
$(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)$(fishdir)
$(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)$(fishdir)/completions
$(INSTALL) -m 644 init/fish $(DESTDIR)$(sysconfdir)$(fishfile)
for i in init/fish_interactive.fish init/fish_function.fish init/fish_complete.fish ; do \
for i in $(INIT_DIR_INSTALL); do \
$(INSTALL) -m 644 $$i $(DESTDIR)$(sysconfdir)$(fishdir); \
done;
for i in $(COMPLETIONS_DIR_FILES); do \
@@ -323,8 +364,15 @@ install: all install-translations
for i in $(MANUALS); do \
$(INSTALL) -m 644 $$i $(DESTDIR)$(mandir)/man1/; \
done;
@echo If you want to use fish as the default shell, remember to first
@echo add the line \'$(DESTDIR)$(bindir)/fish\' to the file \'/etc/shells\'.
@echo fish is now installed on your system.
@echo To run fish, type \'fish\' in your terminal.
@echo
@echo To use fish as your login shell:
@echo \* add the line \'$(DESTDIR)$(bindir)/fish\' to the file \'/etc/shells\'.
@echo \* use the command \'chsh -s $(DESTDIR)$(bindir)/fish\'.
@echo
@echo Have fun!
.PHONY: install
uninstall: uninstall-translations
for i in $(PROGRAMS); do \
@@ -335,34 +383,40 @@ uninstall: uninstall-translations
rm -f $(DESTDIR)$(sysconfdir)$(fishinputfile)
rm -r $(DESTDIR)$(sysconfdir)$(fishdir)
rm -r $(DESTDIR)$(docdir)
for i in fish.1* @XSEL_MAN@ mimedb.1* set_color.1* count.1*; do \
for i in fish.1* @XSEL_MAN@ mimedb.1* fishd.1* set_color.1* count.1*; do \
rm $(DESTDIR)$(mandir)/man1/$$i; \
done;
.PHONY: uninstall
install-translations: $(TRANSLATIONS)
if test $(HAVE_GETTEXT) = 1; then \
for i in $(TRANSLATIONS); do \
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/locale/$$(basename $$i .gmo)/LC_MESSAGES; \
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/locale/$$(basename $$i .gmo)/LC_MESSAGES/fish.mo; \
echo $(DESTDIR)$(datadir)/locale/$$(basename $$i .gmo)/LC_MESSAGES/fish.mo;\
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/locale/`basename $$i .gmo`/LC_MESSAGES; \
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/locale/`basename $$i .gmo`/LC_MESSAGES/fish.mo; \
echo $(DESTDIR)$(datadir)/locale/`basename $$i .gmo`/LC_MESSAGES/fish.mo;\
done; \
fi
.PHONY: install-translations
uninstall-translations:
if test $(HAVE_GETTEXT) = 1; then \
for i in $(TRANSLATIONS_SRC); do \
rm -f $(DESTDIR)$(datadir)/locale/$$(basename $$i .po)/LC_MESSAGES/fish.mo; \
rm -f $(DESTDIR)$(datadir)/locale/`basename $$i .po`/LC_MESSAGES/fish.mo; \
done; \
fi
.PHONY: uninstall-translations
#
# The build rules for all the commands
#
# The fish shell
fish: $(FISH_OBJS)
$(CC) $(FISH_OBJS) $(LDFLAGS) -o $@
fish_pager: $(FISH_PAGER_OBJS)
$(CC) $(FISH_PAGER_OBJS) $(LDFLAGS) -o $@
fishd: $(FISHD_OBJS)
fishd: $(FISHD_OBJS)
$(CC) $(FISHD_OBJS) $(LDFLAGS) -o $@
fish_tests: $(FISH_TESTS_OBJS)
@@ -379,11 +433,16 @@ set_color: set_color.o doc_src/set_color.c
tokenizer_test: tokenizer.c tokenizer.h util.o wutil.o common.o
$(CC) ${CFLAGS} tokenizer.c util.o wutil.o common.o -D TOKENIZER_TEST $(LDFLAGS) -o $@
# Neat little program to show output from terminal
key_reader: key_reader.o input_common.o common.o env_universal.o env_universal_common.o util.o wutil.o
$(CC) key_reader.o input_common.o common.o env_universal.o env_universal_common.o util.o wutil.o $(LDFLAGS) -o $@
#
# Update dependencies
#
depend:
makedepend -fMakefile.in -Y *.c
.PHONY: depend
# Copy all the source files into a new directory and use tar to create
# an archive from it. Simplest way I could think of to make an archive
@@ -391,7 +450,7 @@ depend:
#
# Uses install instead of mkdir so build won't fail if the directory
# exists
fish-@PACKAGE_VERSION@.tar: $(DOC_SRC_DIR_FILES) $(MAIN_DIR_FILES) $(INIT_DIR_FILES) $(TEST_DIR_FILES) $(COMPLETIONS_DIR_FILES) ChangeLog $(TRANSLATIONS_SRC)
fish-@PACKAGE_VERSION@.tar: $(DOC_SRC_DIR_FILES) $(MAIN_DIR_FILES) $(INIT_DIR_FILES) $(TEST_DIR_FILES) $(COMPLETIONS_DIR_FILES) ChangeLog
rm -rf fish-@PACKAGE_VERSION@
$(INSTALL) -d fish-@PACKAGE_VERSION@
$(INSTALL) -d fish-@PACKAGE_VERSION@/doc_src
@@ -422,11 +481,17 @@ rpm: fish-@PACKAGE_VERSION@.tar.bz2
rpmbuild -ba --clean /usr/src/redhat/SPECS/fish.spec
mv /usr/src/redhat/RPMS/*/fish*@PACKAGE_VERSION@*.rpm .
mv /usr/src/redhat/SRPMS/fish*@PACKAGE_VERSION@*.src.rpm .
.PHONY: rpm
#
# Cleanup targets
#
distclean: clean
rm -f fish.spec doc_src/fish.1 doc_src/Doxyfile
rm -f init/fish init/fish_interactive.fish init/fish_complete.fish
rm -f config.status config.log config.h Makefile
.PHONY: distclean
clean:
rm -f *.o doc.h doc_src/*.doxygen doc_src/*.c builtin_help.c
@@ -442,6 +507,7 @@ clean:
rm -rf fish-@PACKAGE_VERSION@
rm -rf xsel-0.9.6/
rm -f $(TRANSLATIONS)
.PHONY: clean
# DO NOT DELETE THIS LINE -- make depend depends on it.

2163
builtin.c

File diff suppressed because it is too large Load Diff

View File

@@ -47,8 +47,14 @@ enum
*/
#define BUILTIN_ERR_UNKNOWN _( L"%ls: Unknown option '%ls'\n" )
/**
Error message for invalid character in variable name
*/
#define BUILTIN_ERR_VARCHAR _( L"%ls: Invalid character '%lc' in variable name. Only alphanumerical characters and underscores are valid in a variable name.\n" )
/**
Error message for invalid (empty) variable name
*/
#define BUILTIN_ERR_VARNAME_ZERO _( L"%ls: Variable name can not be the empty string\n" )
/**
@@ -146,6 +152,15 @@ int builtin_commandline(wchar_t **argv);
*/
int builtin_ulimit(wchar_t **argv);
/**
The complete builtin. Used for specifying programmable
tab-completions. Calls the functions in complete.c for any heavy
lifting.
*/
int builtin_complete(wchar_t **argv);
const wchar_t *builtin_complete_get_temporary_buffer();
/**
This function works like wperror, but it prints its result into
the sb_err string_buffer_t instead of to stderr. Used by the builtin

View File

@@ -13,6 +13,7 @@ Functions used for implementing the commandline builtin.
#include "config.h"
#include "util.h"
#include "wutil.h"
#include "builtin.h"
#include "common.h"
#include "wgetopt.h"
@@ -23,6 +24,7 @@ Functions used for implementing the commandline builtin.
#include "input_common.h"
#include "input.h"
#include "translate.h"
#include "parse_util.h"
/**
Which part of the comandbuffer are we operating on
@@ -47,6 +49,26 @@ enum
}
;
/**
Returns the current commandline buffer.
*/
static const wchar_t *get_buffer()
{
const wchar_t *buff = builtin_complete_get_temporary_buffer();
if( !buff )
buff = reader_get_buffer();
return buff;
}
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();
}
/**
Replace/append/insert the selection with/at/after the specified string.
@@ -56,14 +78,14 @@ enum
\param insert the string to insert
\param append_mode can be one of REPLACE_MODE, INSERT_MODE or APPEND_MODE, affects the way the test update is performed
*/
static void replace_part( wchar_t *begin,
wchar_t *end,
static void replace_part( const wchar_t *begin,
const wchar_t *end,
wchar_t *insert,
int append_mode )
{
wchar_t *buff = reader_get_buffer();
const wchar_t *buff = get_buffer();
string_buffer_t out;
int out_pos=reader_get_cursor_pos();
int out_pos=get_cursor_pos();
sb_init( &out );
@@ -87,7 +109,7 @@ static void replace_part( wchar_t *begin,
}
case INSERT_MODE:
{
int cursor = reader_get_cursor_pos() -(begin-buff);
int cursor = get_cursor_pos() -(begin-buff);
sb_append_substring( &out, begin, cursor );
sb_append( &out, insert );
sb_append_substring( &out, begin+cursor, end-begin-cursor );
@@ -108,8 +130,8 @@ static void replace_part( wchar_t *begin,
\param cut_at_cursor whether printing should stop at the surrent cursor position
\param tokenize whether the string should be tokenized, printing one string token on every line and skipping non-string tokens
*/
static void write_part( wchar_t *begin,
wchar_t *end,
static void write_part( const wchar_t *begin,
const wchar_t *end,
int cut_at_cursor,
int tokenize )
{
@@ -118,7 +140,7 @@ static void write_part( wchar_t *begin,
wchar_t *buff;
int pos;
pos = reader_get_cursor_pos()-(begin-reader_get_buffer());
pos = get_cursor_pos()-(begin-get_buffer());
if( tokenize )
{
@@ -183,7 +205,7 @@ int builtin_commandline( wchar_t **argv )
int tokenize = 0;
if( !reader_get_buffer() )
if( !get_buffer() )
{
sb_append2( sb_err,
argv[0],
@@ -428,32 +450,42 @@ int builtin_commandline( wchar_t **argv )
buffer_part = STRING_MODE;
}
wchar_t *begin, *end;
const wchar_t *begin, *end;
switch( buffer_part )
{
case STRING_MODE:
{
begin = reader_get_buffer();
begin = get_buffer();
end = begin+wcslen(begin);
break;
}
case PROCESS_MODE:
{
reader_current_process_extent( &begin, &end );
parse_util_process_extent( get_buffer(),
get_cursor_pos(),
&begin,
&end );
break;
}
case JOB_MODE:
{
reader_current_job_extent( &begin, &end );
parse_util_job_extent( get_buffer(),
get_cursor_pos(),
&begin,
&end );
break;
}
case TOKEN_MODE:
{
reader_current_token_extent( &begin, &end, 0, 0 );
parse_util_token_extent( get_buffer(),
get_cursor_pos(),
&begin,
&end,
0, 0 );
break;
}

543
builtin_complete.c Normal file
View File

@@ -0,0 +1,543 @@
/** \file builtin_complete.c Functions defining the complete builtin
Functions used for implementing the complete builtin.
*/
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#include <wctype.h>
#include <sys/types.h>
#include <termios.h>
#include <signal.h>
#include "config.h"
#include "util.h"
#include "wutil.h"
#include "builtin.h"
#include "common.h"
#include "complete.h"
#include "wgetopt.h"
#include "parser.h"
#include "reader.h"
#include "translate.h"
const static wchar_t *temporary_buffer;
/*
builtin_complete_* are a set of rather silly looping functions that
make sure that all the proper combinations of complete_add or
complete_remove get called.
*/
static void builtin_complete_add2( const wchar_t *cmd,
int cmd_type,
const wchar_t *short_opt,
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 )
{
int i;
const wchar_t *s;
for( s=short_opt; *s; s++ )
{
complete_add( cmd,
cmd_type,
*s,
0,
0,
result_mode,
authorative,
condition,
comp,
desc );
}
for( i=0; i<al_get_count( gnu_opt ); i++ )
{
complete_add( cmd,
cmd_type,
0,
(wchar_t *)al_get(gnu_opt, i ),
0,
result_mode,
authorative,
condition,
comp,
desc );
}
for( i=0; i<al_get_count( old_opt ); i++ )
{
complete_add( cmd,
cmd_type,
0,
(wchar_t *)al_get(old_opt, i ),
1,
result_mode,
authorative,
condition,
comp,
desc );
}
if( al_get_count( old_opt )+al_get_count( gnu_opt )+wcslen(short_opt) == 0 )
{
complete_add( cmd,
cmd_type,
0,
0,
0,
result_mode,
authorative,
condition,
comp,
desc );
}
}
static void builtin_complete_add( array_list_t *cmd,
array_list_t *path,
const wchar_t *short_opt,
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 )
{
int i;
for( i=0; i<al_get_count( cmd ); i++ )
{
builtin_complete_add2( al_get( cmd, i ),
COMMAND,
short_opt,
gnu_opt,
old_opt,
result_mode,
authorative,
condition,
comp,
desc );
}
for( i=0; i<al_get_count( path ); i++ )
{
builtin_complete_add2( al_get( path, i ),
PATH,
short_opt,
gnu_opt,
old_opt,
result_mode,
authorative,
condition,
comp,
desc );
}
}
static void builtin_complete_remove3( wchar_t *cmd,
int cmd_type,
wchar_t short_opt,
array_list_t *long_opt )
{
int i;
for( i=0; i<al_get_count( long_opt ); i++ )
{
complete_remove( cmd,
cmd_type,
short_opt,
(wchar_t *)al_get( long_opt, i ) );
}
}
static void builtin_complete_remove2( wchar_t *cmd,
int cmd_type,
const wchar_t *short_opt,
array_list_t *gnu_opt,
array_list_t *old_opt )
{
const wchar_t *s = (wchar_t *)short_opt;
if( *s )
{
for( ; *s; s++ )
{
if( al_get_count( old_opt) + al_get_count( gnu_opt ) == 0 )
{
complete_remove(cmd,
cmd_type,
*s,
0 );
}
else
{
builtin_complete_remove3( cmd,
cmd_type,
*s,
gnu_opt );
builtin_complete_remove3( cmd,
cmd_type,
*s,
old_opt );
}
}
}
else
{
builtin_complete_remove3( cmd,
cmd_type,
0,
gnu_opt );
builtin_complete_remove3( cmd,
cmd_type,
0,
old_opt );
}
}
static void builtin_complete_remove( array_list_t *cmd,
array_list_t *path,
const wchar_t *short_opt,
array_list_t *gnu_opt,
array_list_t *old_opt )
{
int i;
for( i=0; i<al_get_count( cmd ); i++ )
{
builtin_complete_remove2( (wchar_t *)al_get( cmd, i ),
COMMAND,
short_opt,
gnu_opt,
old_opt );
}
for( i=0; i<al_get_count( path ); i++ )
{
builtin_complete_remove2( (wchar_t *)al_get( path, i ),
PATH,
short_opt,
gnu_opt,
old_opt );
}
}
const wchar_t *builtin_complete_get_temporary_buffer()
{
return temporary_buffer;
}
int builtin_complete( wchar_t **argv )
{
int res=0;
int argc=0;
int result_mode=SHARED;
int remove = 0;
int authorative = 1;
string_buffer_t short_opt;
array_list_t gnu_opt, old_opt;
wchar_t *comp=L"", *desc=L"", *condition=L"", *load=0;
wchar_t *do_complete = 0;
array_list_t cmd;
array_list_t path;
static int recursion_level=0;
if( !is_interactive_session )
{
debug( 1, _(L"%ls: Command only available in interactive sessions"), argv[0] );
}
al_init( &cmd );
al_init( &path );
sb_init( &short_opt );
al_init( &gnu_opt );
al_init( &old_opt );
argc = builtin_count_args( argv );
woptind=0;
while( res == 0 )
{
const static struct woption
long_options[] =
{
{
L"exclusive", no_argument, 0, 'x'
}
,
{
L"no-files", no_argument, 0, 'f'
}
,
{
L"require-parameter", no_argument, 0, 'r'
}
,
{
L"path", required_argument, 0, 'p'
}
,
{
L"command", required_argument, 0, 'c'
}
,
{
L"short-option", required_argument, 0, 's'
}
,
{
L"long-option", required_argument, 0, 'l' }
,
{
L"old-option", required_argument, 0, 'o'
}
,
{
L"description", required_argument, 0, 'd'
}
,
{
L"arguments", required_argument, 0, 'a'
}
,
{
L"erase", no_argument, 0, 'e'
}
,
{
L"unauthorative", no_argument, 0, 'u'
}
,
{
L"condition", required_argument, 0, 'n'
}
,
{
L"load", required_argument, 0, 'y'
}
,
{
L"do-complete", required_argument, 0, 'C'
}
,
{
0, 0, 0, 0
}
}
;
int opt_index = 0;
int opt = wgetopt_long( argc,
argv,
L"a:c:p:s:l:o:d:frxeun:y:C:",
long_options,
&opt_index );
if( opt == -1 )
break;
switch( opt )
{
case 0:
if(long_options[opt_index].flag != 0)
break;
sb_printf( sb_err,
BUILTIN_ERR_UNKNOWN,
argv[0],
long_options[opt_index].name );
sb_append( sb_err,
parser_current_line() );
// builtin_print_help( argv[0], sb_err );
res = 1;
break;
case 'x':
result_mode |= EXCLUSIVE;
break;
case 'f':
result_mode |= NO_FILES;
break;
case 'r':
result_mode |= NO_COMMON;
break;
case 'p':
al_push( &cmd, unescape( woptarg, 1));
break;
case 'c':
al_push( &cmd, unescape( woptarg, 1) );
break;
case 'd':
desc = woptarg;
break;
case 'u':
authorative=0;
break;
case 's':
sb_append( &short_opt, woptarg );
break;
case 'l':
al_push( &gnu_opt, woptarg );
break;
case 'o':
al_push( &old_opt, woptarg );
break;
case 'a':
comp = woptarg;
break;
case 'e':
remove = 1;
break;
case 'n':
condition = woptarg;
break;
case 'y':
load = woptarg;
break;
case 'C':
do_complete = woptarg?woptarg:reader_get_buffer();
break;
case '?':
// builtin_print_help( argv[0], sb_err );
res = 1;
break;
}
}
if( res != 0 )
{
}
else if( do_complete )
{
array_list_t comp;
int i;
const wchar_t *prev_temporary_buffer = temporary_buffer;
temporary_buffer = do_complete;
if( recursion_level < 1 )
{
recursion_level++;
al_init( &comp );
complete( do_complete, &comp );
for( i=0; i<al_get_count( &comp ); i++ )
{
wchar_t *next = (wchar_t *)al_get( &comp, i );
wchar_t *sep = wcschr( next, COMPLETE_SEP );
if( sep )
*sep = L'\t';
sb_printf( sb_out, L"%ls\n", next );
}
al_foreach( &comp, (void (*)(const void *))&free );
al_destroy( &comp );
recursion_level--;
}
temporary_buffer = prev_temporary_buffer;
}
else if( woptind != argc )
{
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;
}
else if( load )
{
complete_load( load, 1 );
}
else if( (al_get_count( &cmd) == 0 ) && (al_get_count( &path) == 0 ) )
{
/* No arguments specified, meaning we print the definitions of
* all specified completions to stdout.*/
complete_print( sb_out );
}
else
{
if( remove )
{
builtin_complete_remove( &cmd,
&path,
(wchar_t *)short_opt.buff,
&gnu_opt,
&old_opt );
}
else
{
builtin_complete_add( &cmd,
&path,
(wchar_t *)short_opt.buff,
&gnu_opt,
&old_opt,
result_mode,
authorative,
condition,
comp,
desc );
}
}
al_foreach( &cmd, (void (*)(const void *))&free );
al_foreach( &path, (void (*)(const void *))&free );
al_destroy( &cmd );
al_destroy( &path );
sb_destroy( &short_opt );
al_destroy( &gnu_opt );
al_destroy( &old_opt );
return res;
}

View File

@@ -13,6 +13,7 @@ Functions used for implementing the set builtin.
#include "config.h"
#include "util.h"
#include "wutil.h"
#include "builtin.h"
#include "env.h"
#include "expand.h"
@@ -508,9 +509,6 @@ int builtin_set( wchar_t **argv )
!erase &&
!list )
{
/*
Only update the variable scope
*/
env_set( name, 0, scope );
finished = 1;
}

367
common.c
View File

@@ -45,8 +45,11 @@ parts of fish.
#include <termio.h>
#endif
#if HAVE_TERM_H
#include <term.h>
#elif HAVE_NCURSES_TERM_H
#include <ncurses/term.h>
#endif
#include "util.h"
#include "wutil.h"
@@ -55,11 +58,7 @@ parts of fish.
#include "proc.h"
#include "wildcard.h"
#include "parser.h"
/**
Error message to show on string convertion error
*/
#define STR2WCS_MSG "fish: Invalid multibyte sequence \'"
#include "halloc.h"
/**
The maximum number of minor errors to report. Further errors will be omitted.
@@ -85,8 +84,6 @@ int error_max=1;
wchar_t ellipsis_char;
static int c1=0, c2=0, c3=0, c4=0, c5;
char *profile=0;
wchar_t *program_name;
@@ -104,6 +101,9 @@ static struct winsize termsize;
*/
static int block_count=0;
/**
String buffer used by the wsetlocale function
*/
static string_buffer_t *setlocale_buff=0;
@@ -114,22 +114,22 @@ void common_destroy()
sb_destroy( setlocale_buff );
free( setlocale_buff );
}
debug( 3, L"Calls: wcsdupcat %d, wcsdupcat2 %d, wcsndup %d, str2wcs %d, wcs2str %d", c1, c2, c3, c4, c5 );
}
wchar_t **list_to_char_arr( array_list_t *l )
wchar_t **list_to_char_arr( void *context, array_list_t *l )
{
wchar_t ** res = malloc( sizeof(wchar_t *)*(al_get_count( l )+1) );
wchar_t ** res = halloc( context, sizeof(wchar_t *)*(al_get_count( l )+1) );
int i;
if( res == 0 )
{
die_mem();
}
for( i=0; i<al_get_count( l ); i++ )
{
res[i] = (wchar_t *)al_get(l,i);
if( context )
halloc_register( context, res[i] );
}
res[i]='\0';
return res;
}
@@ -253,40 +253,51 @@ void sort_list( array_list_t *comp )
wchar_t *str2wcs( const char *in )
{
c4++;
wchar_t *out;
size_t res=0;
int in_pos=0;
int out_pos = 0;
size_t len = strlen(in);
mbstate_t state;
wchar_t *res;
out = malloc( sizeof(wchar_t)*(len+1) );
memset( &state, 0, sizeof(state) );
res = malloc( sizeof(wchar_t)*(strlen(in)+1) );
if( !res )
if( !out )
{
die_mem();
}
if( (size_t)-1 == mbstowcs( res, in, sizeof(wchar_t)*(strlen(in)) +1) )
while( in[in_pos] )
{
error_count++;
if( error_count <=error_max )
res = mbrtowc( &out[out_pos], &in[in_pos], len-in_pos, &state );
switch( res )
{
fflush( stderr );
write( 2,
STR2WCS_MSG,
strlen(STR2WCS_MSG) );
write( 2,
in,
strlen(in ));
write( 2,
"\'\n",
2 );
case (size_t)(-2):
case (size_t)(-1):
{
out[out_pos] = ENCODE_DIRECT_BASE + (unsigned char)in[in_pos];
in_pos++;
memset( &state, 0, sizeof(state) );
break;
}
case 0:
{
return out;
}
default:
{
in_pos += res;
break;
}
}
free(res);
return 0;
}
return res;
out_pos++;
}
out[out_pos] = 0;
return out;
}
void error_reset()
@@ -296,21 +307,51 @@ void error_reset()
char *wcs2str( const wchar_t *in )
{
c5++;
char *out;
size_t res=0;
int in_pos=0;
int out_pos = 0;
mbstate_t state;
out = malloc( MAX_UTF8_BYTES*wcslen(in)+1 );
memset( &state, 0, sizeof(state) );
char *res = malloc( MAX_UTF8_BYTES*wcslen(in)+1 );
if( res == 0 )
if( !out )
{
die_mem();
}
wcstombs( res,
in,
MAX_UTF8_BYTES*wcslen(in)+1 );
// res = realloc( res, strlen( res )+1 );
return res;
while( in[in_pos] )
{
if( ( in[in_pos] >= ENCODE_DIRECT_BASE) &&
( in[in_pos] < ENCODE_DIRECT_BASE+256) )
{
out[out_pos++] = in[in_pos]- ENCODE_DIRECT_BASE;
}
else
{
res = wcrtomb( &out[out_pos], in[in_pos], &state );
switch( res )
{
case (size_t)(-1):
{
debug( 1, L"Wide character has no narrow representation" );
memset( &state, 0, sizeof(state) );
break;
}
default:
{
out_pos += res;
break;
}
}
}
in_pos++;
}
out[out_pos] = 0;
return out;
}
char **wcsv2strv( const wchar_t **in )
@@ -337,15 +378,11 @@ char **wcsv2strv( const wchar_t **in )
wchar_t *wcsdupcat( const wchar_t *a, const wchar_t *b )
{
c1++;
return wcsdupcat2( a, b, 0 );
}
wchar_t *wcsdupcat2( const wchar_t *a, ... )
{
c2++;
int len=wcslen(a);
int pos;
va_list va, va2;
@@ -401,87 +438,6 @@ wchar_t **strv2wcsv( const char **in )
}
#ifndef HAVE_WCSNDUP
wchar_t *wcsndup( const wchar_t *in, int c )
{
c3++;
wchar_t *res = malloc( sizeof(wchar_t)*(c+1) );
if( res == 0 )
{
die_mem();
}
wcsncpy( res, in, c );
res[c] = L'\0';
return res;
}
#endif
long convert_digit( wchar_t d, int base )
{
long res=-1;
if( (d <= L'9') && (d >= L'0') )
{
res = d - L'0';
}
else if( (d <= L'z') && (d >= L'a') )
{
res = d + 10 - L'a';
}
else if( (d <= L'Z') && (d >= L'A') )
{
res = d + 10 - L'A';
}
if( res >= base )
{
res = -1;
}
return res;
}
long wcstol(const wchar_t *nptr,
wchar_t **endptr,
int base)
{
long long res=0;
int is_set=0;
if( base > 36 )
{
errno = EINVAL;
return 0;
}
while( 1 )
{
long nxt = convert_digit( *nptr, base );
if( endptr != 0 )
*endptr = (wchar_t *)nptr;
if( nxt < 0 )
{
if( !is_set )
{
errno = EINVAL;
}
return res;
}
res = (res*base)+nxt;
is_set = 1;
if( res > LONG_MAX )
{
errno = ERANGE;
return LONG_MAX;
}
if( res < LONG_MIN )
{
errno = ERANGE;
return LONG_MIN;
}
nptr++;
}
}
/*$OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $*/
/*
@@ -583,75 +539,6 @@ wcslcpy(wchar_t *dst, const wchar_t *src, size_t siz)
/* count does not include NUL */
}
#ifndef HAVE_WCSDUP
wchar_t *wcsdup( const wchar_t *in )
{
size_t len=wcslen(in);
wchar_t *out = malloc( sizeof( wchar_t)*(len+1));
if( out == 0 )
{
die_mem();
}
memcpy( out, in, sizeof( wchar_t)*(len+1));
return out;
}
#endif
#ifndef HAVE_WCSLEN
size_t wcslen(const wchar_t *in)
{
const wchar_t *end=in;
while( *end )
end++;
return end-in;
}
#endif
#ifndef HAVE_WCSCASECMP
int wcscasecmp( const wchar_t *a, const wchar_t *b )
{
if( *a == 0 )
{
return (*b==0)?0:-1;
}
else if( *b == 0 )
{
return 1;
}
int diff = towlower(*a)-towlower(*b);
if( diff != 0 )
return diff;
else
return wcscasecmp( a+1,b+1);
}
#endif
#ifndef HAVE_WCSNCASECMP
int wcsncasecmp( const wchar_t *a, const wchar_t *b, int count )
{
if( count == 0 )
return 0;
if( *a == 0 )
{
return (*b==0)?0:-1;
}
else if( *b == 0 )
{
return 1;
}
int diff = towlower(*a)-towlower(*b);
if( diff != 0 )
return diff;
else
return wcsncasecmp( a+1,b+1, count-1);
}
#endif
int wcsvarname( wchar_t *str )
{
while( *str )
@@ -667,23 +554,6 @@ int wcsvarname( wchar_t *str )
}
#if !HAVE_WCWIDTH
/**
Return the number of columns used by a character.
In locales without a native wcwidth, Unicode is probably so broken
that it isn't worth trying to implement a real wcwidth. This
wcwidth assumes any printing character takes up one column.
*/
int wcwidth( wchar_t c )
{
if( c < 32 )
return 0;
if ( c == 127 )
return 0;
return 1;
}
#endif
/**
The glibc version of wcswidth seems to hang on some strings. fish uses this replacement.
@@ -706,25 +576,7 @@ int my_wcswidth( const wchar_t *c )
wchar_t *quote_end( const wchar_t *in )
{
switch( *in )
{
case '"':
{
while(1)
{
in = wcschr( in+1, L'"' );
if( !in )
return 0;
if( *(in-1) != L'\\' )
return (wchar_t *)in;
}
}
case '\'':
{
return wcschr( in+1, L'\'' );
}
}
return 0;
return wcschr( in+1, *in );
}
@@ -924,6 +776,26 @@ wchar_t *escape( const wchar_t *in,
while( *in != 0 )
{
if( ( *in >= ENCODE_DIRECT_BASE) &&
( *in < ENCODE_DIRECT_BASE+256) )
{
int val = *in - ENCODE_DIRECT_BASE;
int tmp;
*(pos++) = L'\\';
*(pos++) = L'X';
tmp = val/16;
*pos++ = tmp > 9? L'a'+(tmp-10):L'0'+tmp;
tmp = val%16;
*pos++ = tmp > 9? L'a'+(tmp-10):L'0'+tmp;
}
else
{
switch( *in )
{
case L'\t':
@@ -992,6 +864,8 @@ wchar_t *escape( const wchar_t *in,
*pos++ = *in;
break;
}
}
in++;
}
*pos = 0;
@@ -1064,6 +938,7 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
break;
}
case L'X':
case L'u':
case L'U':
case L'x':
@@ -1073,7 +948,9 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
wchar_t res=0;
int chars=2;
int base=16;
int byte = 0;
switch( in[in_pos] )
{
case L'u':
@@ -1097,6 +974,14 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
break;
}
case L'X':
{
byte=1;
base=16;
chars=2;
break;
}
case L'o':
{
base=8;
@@ -1119,7 +1004,7 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
}
in[out_pos] = res;
in[out_pos] = (byte?ENCODE_DIRECT_BASE:0)+res;
break;
}

View File

@@ -8,6 +8,8 @@
*/
#define FISH_COMMON_H
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#include <termios.h>
@@ -42,6 +44,11 @@ typedef char tputs_arg_t;
*/
#define FISH_COLOR_RESET -2
/**
This is in the unicode private use area.
*/
#define ENCODE_DIRECT_BASE 0xf000
/**
Save the shell mode on startup so we can restore them on exit
*/
@@ -76,9 +83,12 @@ extern wchar_t *program_name;
/**
Take an array_list_t containing wide strings and converts them to a
single null-terminated wchar_t **.
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().
*/
wchar_t **list_to_char_arr( array_list_t *l );
wchar_t **list_to_char_arr( void *context, array_list_t *l );
/**
Read a line from the stream f into the buffer buff of length len. If
@@ -134,31 +144,6 @@ wchar_t *wcsdupcat( const wchar_t *a, const wchar_t *b );
*/
wchar_t *wcsdupcat2( const wchar_t *a, ... );
/**
Returns a newly allocated wide character string wich is a copy of
the string in, but of length c or shorter. The returned string is
always null terminated, and the null is not included in the string
length.
*/
wchar_t *wcsndup( const wchar_t *in, int c );
/**
Converts from wide char to digit in the specified base. If d is not
a valid digit in the specified base, return -1.
*/
long convert_digit( wchar_t d, int base );
/**
Convert a wide character string to a number in the specified
base. This functions is the wide character string equivalent of
strtol. For bases of 10 or lower, 0..9 are used to represent
numbers. For bases below 36, a-z and A-Z are used to represent
numbers higher than 9. Higher bases than 36 are not supported.
*/
long wcstol(const wchar_t *nptr,
wchar_t **endptr,
int base);
/**
Appends src to string dst of size siz (unlike wcsncat, siz is the
@@ -183,53 +168,12 @@ size_t wcslcat( wchar_t *dst, const wchar_t *src, size_t siz );
*/
size_t wcslcpy( wchar_t *dst, const wchar_t *src, size_t siz );
/**
Create a duplicate string. Wide string version of strdup. Will
automatically exit if out of memory.
*/
wchar_t *wcsdup(const wchar_t *in);
size_t wcslen(const wchar_t *in);
/**
Case insensitive string compare function. Wide string version of
strcasecmp.
This implementation of wcscasecmp does not take into account
esoteric locales where uppercase and lowercase do not cleanly
transform between each other. Hopefully this should be fine since
fish only uses this function with one of the strings supplied by
fish and guaranteed to be a sane, english word. Using wcscasecmp on
a user-supplied string should be considered a bug.
*/
int wcscasecmp( const wchar_t *a, const wchar_t *b );
/**
Case insensitive string compare function. Wide string version of
strncasecmp.
This implementation of wcsncasecmp does not take into account
esoteric locales where uppercase and lowercase do not cleanly
transform between each other. Hopefully this should be fine since
fish only uses this function with one of the strings supplied by
fish and guaranteed to be a sane, english word. Using wcsncasecmp on
a user-supplied string should be considered a bug.
*/
int wcsncasecmp( const wchar_t *a, const wchar_t *b, int count );
/**
Test if the given string is a valid variable name
*/
int wcsvarname( wchar_t *str );
/**
The prototype for this function is missing in some libc
implementations. Fish has a fallback implementation in case the
implementation is missing altogether.
*/
int wcwidth( wchar_t c );
/**
A wcswidth workalike. Fish uses this since the regular wcswidth seems flaky.
@@ -238,8 +182,8 @@ int my_wcswidth( const wchar_t *c );
/**
This functions returns the end of the quoted substring beginning at
\c in. It can handle both single and double quotes. Returns 0 on
error.
\c in. The type of quoting character is detemrined by examining \c
in. Returns 0 on error.
\param in the position of the opening quote
*/

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,51 @@
# Process this file with autoconf to produce a configure script.
AC_INIT(fish,1.19.0,fish-users@lists.sf.net)
AC_INIT(fish,1.20.2,fish-users@lists.sf.net)
# Run autoheader automatically, it's quick, and saves people the hassle of remembering to run it manually
autoheader
for i in /usr/pkg /sw /opt /opt/local; do
AC_MSG_CHECKING([for $i/include include directory])
if test -d $i/include; then
AC_MSG_RESULT(yes)
CPPFLAGS="$CPPFLAGS -I$i/include/"
else
AC_MSG_RESULT(no)
fi
AC_MSG_CHECKING([for $i/lib library directory])
if test -d $i/lib; then
AC_MSG_RESULT(yes)
LDFLAGS="$LDFLAGS -L$i/lib/ -R$i/lib/"
else
AC_MSG_RESULT(no)
fi
AC_MSG_CHECKING([for $i/bin command directory])
if test -d $i/bin; then
AC_MSG_RESULT(yes)
optbindirs="$optbindirs $i/bin"
else
AC_MSG_RESULT(no)
fi
done
AC_SUBST( optbindirs, $optbindirs )
# If needed, run autoheader 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
else
AC_MSG_ERROR( [cannot find the autoheader program in your path.
This program is needed because the configure.ac file has been modified.
Please install it and try again.])
fi
else
AC_MSG_RESULT([no])
fi
# Tell autoconf to create config.h header
AC_CONFIG_HEADERS(config.h)
@@ -12,16 +55,18 @@ AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
# Check for doxygen, needed to build
# Check for doxygen, which is needed to build
AC_CHECK_PROG( has_doxygen, [doxygen], "true")
if ! test $has_doxygen = "true"; then
echo Could not find the Doxygen program in your path.
echo This program is needed to build fish.
echo Please install it and try again.
exit 1
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 program. If missing, install fallback shellscript implementation
AC_CHECK_PROG( SEQ_FALLBACK, seq, [ ], [seq])
# Optionally drop xsel
AC_ARG_WITH( xsel,
AC_HELP_STRING([--without-xsel],
@@ -49,7 +94,7 @@ fi
AC_DEFINE_UNQUOTED([CPU],[L"$target_cpu"],[CPU type])
# Set up install locations
# Set up installation directories
if [[ "$prefix" = NONE ]]; then
AC_DEFINE_UNQUOTED( [PREFIX], L"/usr/local", [Installation directory])
AC_SUBST( PREFIX, /usr/local)
@@ -80,10 +125,6 @@ AC_SUBST( [LOCALEDIR], [$datadir/locale])
# See if Linux procfs is present
AC_CHECK_FILES([/proc/self/stat])
# See if NetBSD pkgsrc is installed
AC_CHECK_FILE([/usr/pkg/lib],[AC_SUBST(LIBDIR,[-L/usr/pkg/lib\ -R/usr/pkg/lib])])
AC_CHECK_FILE([/usr/pkg/include],[AC_SUBST(INCLUDEDIR,[-I/usr/pkg/include])])
# Check for RLIMIT_AS in sys/resource.h.
AC_MSG_CHECKING([for RLIMIT_AS in sys/resource.h])
AC_TRY_COMPILE([#include <sys/resource.h>],
@@ -133,28 +174,69 @@ else
AC_MSG_RESULT(no)
fi
# 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 );])],
[have_realpath_null=yes],
[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.])
else
AC_MSG_RESULT(no)
fi
# Check for libraries
AC_CHECK_LIB(socket, connect)
AC_CHECK_LIB(rt, nanosleep)
AC_CHECK_LIB(intl, gettext)
# Check for various header files
AC_CHECK_HEADERS([getopt.h termio.h sys/resource.h])
AC_CHECK_HEADERS([getopt.h termio.h sys/resource.h term.h ncurses/term.h libintl.h])
# Check for various function
AC_CHECK_FUNCS(wcsdup wcsndup wcslen wcscasecmp wcsncasecmp gettext wprintf futimes wcwidth wcswidth getopt_long )
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 again for gettext library, so we can insert information
# Check for various functions, and insert results into config.h
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 )
AC_DEFINE([HAVE_TRANSLATE_H], [1],
[Define to 1 if the wgettext function should be used for translating strings.])
# Check again for gettext library, and insert results into the Makefile
AC_CHECK_FUNC(gettext, AC_SUBST(HAVE_GETTEXT,1), AC_SUBST(HAVE_GETTEXT,0) )
# 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)
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.])
else
AC_MSG_RESULT(no)
fi
# Check if we have ncurses, and use it rather than curses if possible.
AC_CHECK_HEADERS([ncurses.h],[AC_SUBST(CURSESLIB,[ncurses]) AC_DEFINE(HAVE_NCURSES_H)],[AC_SUBST(CURSESLIB,[curses])])
AC_SEARCH_LIBS( setupterm, [ncurses curses], [ AC_MSG_NOTICE([Found curses implementation])], [AC_MSG_ERROR([Could not find a curses implementation, needed to build fish])] )
# Force use of ncurses if it is avialable via NetBSD pkgsrc. This is an
# ugly kludge to force NetBSD to use ncurses, since NetBSDs own version
# does not properly support terminfo.
AC_CHECK_FILE([/usr/pkg/include/ncurses.h],[AC_SUBST(CURSESLIB,[ncurses]) AC_DEFINE(HAVE_NCURSES_H)])
AC_CONFIG_FILES([Makefile fish.spec doc_src/fish.1 doc_src/Doxyfile init/fish init/fish_interactive.fish init/fish_complete.fish])
AC_CONFIG_FILES([Makefile fish.spec doc_src/fish.1 doc_src/Doxyfile init/fish init/fish_interactive.fish init/fish_complete.fish seq])
AC_OUTPUT
echo "Now run 'make' and 'make install'"
echo "Now run 'make' and 'make install' to built and install fish."
echo "Good luck!"

View File

@@ -10,7 +10,7 @@ The \c and builtin is used to execute a command if the current exit status (as s
\subsection and-example Example
The following code runs the \c make command to build a program, and if it suceeds, it runs <tt>make install</tt>, which installs the program.
The following code runs the \c make command to build a program, and if it succeeds, it runs <tt>make install</tt>, which installs the program.
<pre>
make; and make install
</pre>

View File

@@ -7,10 +7,10 @@
\subsection begin-description Description
The \c begin builtin is used to create a new block of code. The block
is unconditionally erxecuted. Begin is equivalent to <tt>if
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 ot output of this set of
variable scope or to redirect the input to output of this set of
commands as a group.
\subsection begin-example Example

View File

@@ -8,7 +8,7 @@
The \c break builtin is used to halt a 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 break-example Example
The following code searches all .c files for smurfs, and halts at the first occurance.
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;

View File

@@ -23,7 +23,7 @@ switch $animal
echo evil
case wolf dog human moose dolphin whale
echo mammal
case duck goose albatros
case duck goose albatross
echo bird
case shark trout stingray
echo fish

View File

@@ -25,14 +25,14 @@ 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
- \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
- \c -o or \c --tokenize tokenize the selection and print one string-type token per line
Other switches
@@ -43,6 +43,10 @@ Other switches
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
specified string to be the current contents of the commandline.
\subsection commandline-example Example
<tt>commandline -j $history[3]</tt>

View File

@@ -1,4 +1,4 @@
\section complete complete - edit command specific tab-completions.
\section complete complete - edit command specific tab-completions.
\subsection complete-synopsis Synopsis
<tt>complete (-c|--command|-p|--path) COMMAND [(-s|--short-option) SHORT_OPTION] [(-l|--long-option|-o|--old-option) LONG_OPTION [(-a||--arguments) OPTION_ARGUMENTS] [(-d|--description) DESCRIPTION] </tt>
@@ -14,10 +14,11 @@ the fish manual.
- <tt>LONG_OPTION</tt> is a multi character option for the command
- <tt>OPTION_ARGUMENTS</tt> is parameter containing a space-separated list of possible option-arguments, which may contain subshells
- <tt>DESCRIPTION</tt> is a description of what the option and/or option arguments do
- <tt>-C STRING</tt> or <tt>--do-complete=STRING</tt> makes complete try to find all possible completions for the specified string
- <tt>-e</tt> or <tt>--erase</tt> implies that the specified completion should be deleted
- <tt>-f</tt> or <tt>--no-files</tt> specifies that the option specified by this completion may not be followed by a filename
- <tt>-n</tt> or <tt>--condition</tt> specides a shell command that must return 0 if the completion is to be used. This makes it possible to specify completions that should only be used in some cases.
- <tt>-o</tt> or <tt>--old-option</tt> implies that the command uses old long style options with only one dash
- <tt>-n</tt> or <tt>--condition</tt> specifies a shell command that must return 0 if the completion is to be used. This makes it possible to specify completions that should only be used in some cases.
- <tt>-o</tt> or <tt>--old-option</tt> implies that the command uses old long style options with only one dash
- <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
@@ -30,13 +31,14 @@ that do not begin with a hyphen. Fish recognizes three styles of
options, the same styles as the GNU version of the getopt
library. These styles are:
- Short options, like '-a'. Short options are a single character long, are preceeded by a single hyphen and may ge grouped together (like '-la', which is equivalent to '-l -a'). Option arguments may be specified in the following parameter ('-w 32') or by appending the option with the value ('-w32').
- Old style long options, like '-Wall'. Old style long options are more than one character long, are preceeded by a single hyphen and may not be grouped together. Option arguments are specified in the following parameter ('-ao null').
- GNU style long options, like '--colors'. GNU style long options are more than one character long, are preceeded by two hyphens, and may not be grouped together. Option arguments may be specified in the following parameter ('--quoting-style shell') or by appending the option with a '=' and the value ('--quoting-style=shell'). GNU style long options may be abbrevated so long as the abbrevation is unique ('--h' is equivalent to '--help' if help is the only long option beginning with an 'h').
- Short options, like '-a'. Short options are a single character long, are preceded by a single hyphen and may be grouped together (like '-la', which is equivalent to '-l -a'). Option arguments may be specified in the following parameter ('-w 32') or by appending the option with the value ('-w32').
- Old style long options, like '-Wall'. Old style long options can be more than one character long, are preceded by a single hyphen and may not be grouped together. Option arguments are specified in the following parameter ('-ao null').
- GNU style long options, like '--colors'. GNU style long options can be more than one character long, are preceded by two hyphens, and may not be grouped together. Option arguments may be specified in the following parameter ('--quoting-style shell') or by appending the option with a '=' and the value ('--quoting-style=shell'). GNU style long options may be abbreviated so long as the abbreviation is unique ('--h' is equivalent to '--help' if help is the only long option beginning with an 'h').
\c complete only allows one of old style long options and GNU style
long options to be used on a specific command, but short options can
always be specified.
The options for specifying command name, command path, or command
switches may all be used multiple times to specify multiple commands
which have the same completion or multiple switches accepted by a
command.
When erasing completions, it is possible to either erase all
completions for a specific command by specifying <tt>complete -e -c
@@ -70,5 +72,5 @@ This can be written as:
"Don't check dependencies"</tt>
where \c __fish_contains_opt is a function that checks the commandline
buffer for the presense of a specified set of options.
buffer for the presence of a specified set of options.

24
doc_src/contains.txt Normal file
View File

@@ -0,0 +1,24 @@
\section contains contains - Test if a word is present in a list
\subsection contains-synopsis Synopsis
<code>contains [OPTIONS] KEY [VALUES...]</code>
\subsection contains-description Description
- \c -h or \c --help display this message
Test if the set VALUES contains the string KEY. Return status is 0 if
yes, 1 otherwise
\subsection contains-example Example
<pre>
for i in ~/bin /usr/local/bin
if not contains \$i \$PATH
set PATH \$PATH i
end
end
</pre>
The above code tests if ~/bin and /usr/local/bin are in the path and if they are not, they are added.

View File

@@ -6,7 +6,7 @@ This is the documentation for \c fish, the friendly interactive
shell. \c fish is a user friendly commandline shell intended
mostly for interactive use. A shell is a program used to execute other
programs. For the latest information on \c fish, please visit the <a
href="http://roo.no-ip.org/fish/"><tt>fish</tt> homepage</a>.
href="http://roo.no-ip.org/fish/"><code>fish</code> homepage</a>.
\section syntax Syntax overview
@@ -18,7 +18,7 @@ any arguments.
Example:
<tt>echo hello world</tt>
<code>echo hello world</code>
calls the \c echo command. \c echo is a command which will write its
arguments to the screen. In the example above, the output will be
@@ -31,7 +31,7 @@ syntax.
If you wish to find out more about the echo command used above, read
the manual page for the echo command by writing:
<tt>man echo</tt>
<code>man echo</code>
\c man is a command for displaying a manual page on a given
topic. There are manual pages for almost every command on most
@@ -76,11 +76,11 @@ and vice versa.
Example:
<tt>rm "cumbersome filename.txt"</tt>
<code>rm "cumbersome filename.txt"</code>
Will remove the file 'cumbersome filename.txt', while
<tt>rm cumbersome filename.txt</tt>
<code>rm cumbersome filename.txt</code>
would remove the two files 'cumbersome' and 'filenmae.txt'.
@@ -89,31 +89,32 @@ would remove the two files 'cumbersome' and 'filenmae.txt'.
Some characters can not be written directly on the command line. For
these characters, so called escape sequences are provided. These are:
- <tt>'\\n'</tt>, escapes a newline character
- <tt>'\\t'</tt>, escapes the tab character
- <tt>'\\b'</tt>, escapes the backspace character
- <tt>'\\r'</tt>, escapes the carriage return character
- <tt>'\\e'</tt>, escapes the escape character
- <tt>'\\ '</tt>, escapes the space character
- <tt>'\\$'</tt>, escapes the dollar character
- <tt>'\\\\'</tt>, escapes the backslash character
- <tt>'\\*'</tt>, escapes the star character
- <tt>'\\?'</tt>, escapes the question mark character
- <tt>'\\~'</tt>, escapes the tilde character
- <tt>'\\#'</tt>, escapes the hash character
- <tt>'\\('</tt>, escapes the left parenthesis character
- <tt>'\\)'</tt>, escapes the right parenthesis character
- <tt>'\\{'</tt>, escapes the left curly bracket character
- <tt>'\\}'</tt>, escapes the right curly bracket character
- <tt>'\\['</tt>, escapes the left bracket character
- <tt>'\\]'</tt>, escapes the right bracket character
- <tt>'\\\<'</tt>, escapes the less than character
- <tt>'\\\>'</tt>, escapes the more than character
- <tt>'\\^'</tt>, escapes the circumflex character
- <tt>'\\x<i>xx</i>'</tt>, where <tt><i>xx</i></tt> is a hexadecimal number, escapes the ascii character with the specified value
- <tt>'\\o<i>ooo</i>'</tt>, where <tt><i>ooo</i></tt> is an octal number, escapes the ascii character with the specified value
- <tt>'\\u<i>xxxx</i>'</tt>, where <tt><i>xxxx</i></tt> is a hexadecimal number, escapes the 16-bit unicode character with the specified value
- <tt>'\\U<i>xxxxxxxx</i>'</tt>, where <tt><i>xxxxxxxx</i></tt> is a hexadecimal number, escapes the 32-bit unicode character with the specified value
- <code>'\\n'</code>, escapes a newline character
- <code>'\\t'</code>, escapes the tab character
- <code>'\\b'</code>, escapes the backspace character
- <code>'\\r'</code>, escapes the carriage return character
- <code>'\\e'</code>, escapes the escape character
- <code>'\\ '</code>, escapes the space character
- <code>'\\$'</code>, escapes the dollar character
- <code>'\\\\'</code>, escapes the backslash character
- <code>'\\*'</code>, escapes the star character
- <code>'\\?'</code>, escapes the question mark character
- <code>'\\~'</code>, escapes the tilde character
- <code>'\\#'</code>, escapes the hash character
- <code>'\\('</code>, escapes the left parenthesis character
- <code>'\\)'</code>, escapes the right parenthesis character
- <code>'\\{'</code>, escapes the left curly bracket character
- <code>'\\}'</code>, escapes the right curly bracket character
- <code>'\\['</code>, escapes the left bracket character
- <code>'\\]'</code>, escapes the right bracket character
- <code>'\\\<'</code>, escapes the less than character
- <code>'\\\>'</code>, escapes the more than character
- <code>'\\^'</code>, escapes the circumflex character
- <code>'\\x<i>xx</i>'</code>, where <code><i>xx</i></code> is a hexadecimal number, escapes the ascii character with the specified value
- <code>'\\X<i>xx</i>'</code>, where <code><i>xx</i></code> is a hexadecimal number, escapes a byte of data with the specified value. If you are using a mutibyte encoding, this can be used to enter invalid strings. Only use this if you know what you are doing.
- <code>'\\o<i>ooo</i>'</code>, where <code><i>ooo</i></code> is an octal number, escapes the ascii character with the specified value
- <code>'\\u<i>xxxx</i>'</code>, where <code><i>xxxx</i></code> is a hexadecimal number, escapes the 16-bit unicode character with the specified value
- <code>'\\U<i>xxxxxxxx</i>'</code>, where <code><i>xxxxxxxx</i></code> is a hexadecimal number, escapes the 32-bit unicode character with the specified value
\subsection redirects IO redirection
@@ -124,41 +125,41 @@ a number called a file descriptor (FD). These are:
- Standard output, FD 1, for writing, defaults to writing to the screen.
- Standard error, FD 2, for writing errors and warnings, defaults to writing to the screen.
The reason for providing for two methods of output is that errors and
warnings can be separated from regular program output.
The reason for providing for two output file descriptors is to allow
separation of errors and warnings from regular program output.
Any file descriptor can be directed to a different output than it's
default through a simple mechanism called a redirection.
An example of a file redirection is <tt> echo hello \>output.txt</tt>,
An example of a file redirection is <code> echo hello \>output.txt</code>,
which directs the output of the echo command to the file error.txt.
- To redirect standard input, write <tt>\<SOURCE_FILE</tt>
- To redirect standard output, write <tt>\>DESTINATION</tt>
- To redirect standard error, write <tt>^DESTINATION</tt>
- To redirect standard output to a file which will be appended, write <tt>\>\>DESTINATION_FILE</tt>
- To redirect standard error to a file which will be appended, write <tt>^^DESTINATION_FILE</tt>
- To redirect standard input, write <code>\<SOURCE_FILE</code>
- To redirect standard output, write <code>\>DESTINATION</code>
- To redirect standard error, write <code>^DESTINATION</code>
- To redirect standard output to a file which will be appended, write <code>\>\>DESTINATION_FILE</code>
- To redirect standard error to a file which will be appended, write <code>^^DESTINATION_FILE</code>
<tt>DESTINATION</tt> can be one of the following:
<code>DESTINATION</code> can be one of the following:
- A filename. The output will be written to the specified file.
- An ampersand (\&) followed by the number of another file descriptor. The file descriptor will be a duplicate of the specified file descriptor.
- A minus sign (-). The file descriptor will be closed.
- An ampersand followed by a minus sign (\&-). The file descriptor will be closed.
Example:
To redirect both standard output and standard error to the file
all_output.txt, you can write <tt>echo Hello \>all_output.txt
^\&1</tt>.
all_output.txt, you can write <code>echo Hello \>all_output.txt
^\&1</code>.
Any FD can be redirected in an arbitrary way by prefixing the
redirection with the number of the FD.
- To redirect input of FD number N, write <tt>N\<DESTINATION</tt>
- To redirect output of FD number N, write <tt>N\>DESTINATION</tt>
- To redirect output of FD number N to a file which will be appended, write <tt>N\>\>DESTINATION_FILE</tt>
- To redirect input of FD number N, write <code>N\<DESTINATION</code>
- To redirect output of FD number N, write <code>N\>DESTINATION</code>
- To redirect output of FD number N to a file which will be appended, write <code>N\>\>DESTINATION_FILE</code>
Example: <tt>echo Hello 2\>-</tt> and <tt>echo Hello ^-</tt> are
Example: <code>echo Hello 2\>-</code> and <code>echo Hello ^-</code> are
equivalent.
\subsection piping Piping
@@ -168,7 +169,7 @@ pipeline. This means that the standard output of one command will be read
in as standard input into the next command. This is done by separating
the commands by the pipe character (|). For example
<tt>cat foo.txt | head</tt>
<code>cat foo.txt | head</code>
will call the 'cat' program with the parameter 'foo.txt', which will
print the contents of the file 'foo.txt'. The contents of foo.txt will
@@ -176,7 +177,7 @@ then be filtered through the program 'head', which will pass on the
first ten lines of the file to the screen. For more information on how
to combine commands through pipes, read the manual pages of the
commands you want to use using the 'man' command. If you want to find
out more about the 'cat' program, type <tt>man cat</tt>.
out more about the 'cat' program, type <code>man cat</code>.
Pipes usually connect file descriptor 1 (standard output) of the first
process to file descriptor 0 (standard input) of the second
@@ -184,7 +185,7 @@ process. It is possible use a different output file descriptor by
prepending the desired FD number and then output redirect symbol to
the pipe. For example:
<tt>make fish 2>|less</tt>
<code>make fish 2>|less</code>
will attempt to build the fish program, and any errors will be shown
using the less pager.
@@ -199,7 +200,6 @@ your command. This will tell fish to run the job in the background.
\subsection syntax-job-control Job control
Most programs allow you to suspend the programs execution and return
control to \c fish by Pressing ^Z (Press and hold the Control key and
press 'z'). Once back at the \c fish commandline, you can start other
@@ -219,7 +219,7 @@ href="builtins.html#jobs">jobs</a> command.
This is a short explanation of some of the commonly used words in fish.
- argument, a parameter given to a command
- builtin, a command that is implemented as part of the shell
- builtin, a command that is implemented in the shell
- command, a program
- function, a block of one or more fish commands that can be called as a single command. By using functions, it is possible to string together multiple smaller commands into one more advanced command.
- job, a running pipeline or command
@@ -229,14 +229,14 @@ This is a short explanation of some of the commonly used words in fish.
\section help Help
\c fish has an extensive help system. Use the <a
href="commands.html#help"><tt>help</tt></a> command to obtain help on
a specific subject or command. For instance, writing <tt>help
syntax</tt> displays the <a href="#syntax">syntax section</a> of this
href="commands.html#help"><code>help</code></a> command to obtain help on
a specific subject or command. For instance, writing <code>help
syntax</code> displays the <a href="#syntax">syntax section</a> of this
documentation.
Help on a specific builtin can also be obtained with the <tt>-h</tt>
Help on a specific builtin can also be obtained with the <code>-h</code>
parameter. For instance, to obtain help on the \c fg builtin, either
type <tt>fg -h</tt> or <tt>help fg</tt>.
type <code>fg -h</code> or <code>help fg</code>.
\section completion Tab completion
@@ -282,11 +282,11 @@ Specifying your own completions is not complicated. To specify a
completion, use the \c complete command. \c complete takes
as a parameter the name of the command to specify a completion
for. For example, to add a completion for the program \c myprog, one
would start the completion command with <tt>complete -c myprog
...</tt>. To provide a list of possible completions for myprog, use
would start the completion command with <code>complete -c myprog
...</code>. To provide a list of possible completions for myprog, use
the \c -a switch. If \c myprog accepts the arguments start and stop,
this can be specified as <tt>complete -c myprog -a 'start
stop'</tt>. The argument to the \c -a switch is always a single
this can be specified as <code>complete -c myprog -a 'start
stop'</code>. The argument to the \c -a switch is always a single
string. At completion time, it will be tokenized on spaces and tabs,
and variable expansion, command substitution and other forms of
parameter expansion will take place.
@@ -299,7 +299,7 @@ respectively. If the command 'myprog' has an option '-o' which can
also be written as '--output', and which can take an additional value
of either 'yes' or 'no', this can be specified by writing:
<tt>complete -c myprog -s o -l output -a "yes no"</tt>
<code>complete -c myprog -s o -l output -a "yes no"</code>
There are also special switches for specifying that a switch requires
an argument, to disable filename completion, to create completions
@@ -359,8 +359,8 @@ Example:
The command <code>echo (basename image.jpg .jpg).png</code> will
output 'image.png'.
The command <tt>for i in *.jpg; convert $i (basename $i .jpg).png;
end</tt> will convert all Jpeg files in the current directory to the
The command <code>for i in *.jpg; convert $i (basename $i .jpg).png;
end</code> will convert all Jpeg files in the current directory to the
PNG format.
@@ -371,9 +371,9 @@ expanded so each element of the list becomes a new parameter.
Example:
<tt>echo input.{c,h,txt}</tt> outputs 'input.c input.h input.txt'
<code>echo input.{c,h,txt}</code> outputs 'input.c input.h input.txt'
The command <tt>mv *.{c,h} src/</tt> moves all files with the suffix
The command <code>mv *.{c,h} src/</code> moves all files with the suffix
'.c' or '.h' to the subdirectory src.
\subsection expand-variable Variable expansion
@@ -385,12 +385,12 @@ href="#variables"> Environment variables</a> section.
Example:
<tt> echo \$HOME</tt> prints the home directory of the current
<code> echo \$HOME</code> prints the home directory of the current
user.
If you wish to combine environment variables with text, you can
encase the variables within braces to embed a variable inside running
text like <tt>echo Konnichiwa {$USER}san</tt>, which will print a
text like <code>echo Konnichiwa {$USER}san</code>, which will print a
personalized Japanese greeting.
The {$USER}san syntax might need a bit of an elaboration. Posix
@@ -451,11 +451,11 @@ take the process ids as an argument.
Example:
<tt>fg \%ema</tt> will search for a process whose command line begins
<code>fg \%ema</code> will search for a process whose command line begins
with the letters 'ema', such as emacs, and if found, put it in the
foreground.
<tt>kill -s SIGINT \%3</tt> will send the SIGINT signal to the job
<code>kill -s SIGINT \%3</code> will send the SIGINT signal to the job
with job id 3.
\subsection combine Combining different expansions
@@ -467,7 +467,7 @@ created.
Example:
If the current directory contains the files 'foo' and 'bar', the command
<tt>echo a(ls){1,2,3} </tt>
<code>echo a(ls){1,2,3} </code>
will output 'abar1 abar2 abar3 afoo1 afoo2 afoo3'.
@@ -485,7 +485,7 @@ command</a>.
Example:
To set the variable \c smurf to the value \c blue, use the command
<tt>set smurf blue</tt>.
<code>set smurf blue</code>.
After a variable has been set, you can use the value of a variable in
the shell through <a href="expand-variable">variable expansion</a>.
@@ -493,8 +493,8 @@ the shell through <a href="expand-variable">variable expansion</a>.
Example:
To use the value of a the variable \c smurf, write $ (dollar symbol)
followed by the name of the variable, like <tt>echo Smurfs are
$smurf</tt>, which would print the result 'Smurfs are blue'.
followed by the name of the variable, like <code>echo Smurfs are
$smurf</code>, which would print the result 'Smurfs are blue'.
\subsection variables-scope Variable scope
@@ -503,7 +503,7 @@ local variables. Universal variables are shared between all fish
sessions a user is running on one computer. Global variables are
specific to the current fish session, but are not associated with any
specific block scope, and will never be erased unless the user
explicitly requests it using <tt>set -e</tt>. Local variables are
explicitly requests it using <code>set -e</code>. Local variables are
specific to the current fish session, and associated with a specific
block of commands, and is automatically erased when a specific block
goes out of scope. A block of commands is a series of commands that
@@ -550,8 +550,8 @@ value once, and it will be automatically updated for all sessions, and
preserved across computer reboots and login/logout.
To see universal variables in action, start two fish sessions side by
side, and issue the following command in one of them <tt>set
fish_color_cwd blue</tt>. Since \c fish_color_cwd is a universal
side, and issue the following command in one of them <code>set
fish_color_cwd blue</code>. Since \c fish_color_cwd is a universal
variable, the color of the current working directory listing in the
prompt will instantly change to blue on both terminals.
@@ -748,7 +748,7 @@ builtins or shellscript functions, and can only be used inside fish.
- <a href="commands.html#umask">umask</a>, set or get the file creation mask
- <a href="builtins.html#while">while</a>, perform a block of commands while a condition is met
For more information about these commands, use the <tt>--help</tt>
For more information about these commands, use the <code>--help</code>
option of the command to display a longer explanation.
\section editor Command Line editor
@@ -781,7 +781,7 @@ You can change these key bindings by making an inputrc file. To do
this, copy the file /etc/fish_inputrc to your home directory and
rename it to '.fish_inputrc'. Now you can edit the file .fish_inputrc,
to change your key bindings. The fileformat of this file is described
in the manual page for readline. Use the command <tt>man readline</tt>
in the manual page for readline. Use the command <code>man readline</code>
to read up on this syntax. Please note that the list of key binding
functions in fish is different to that offered by readline. Currently,
the following functions are available:
@@ -863,7 +863,7 @@ fish will be stopped until the program finishes. Sometimes this is not
desirable. For example, you may wish to start an application with a
graphical user interface from the terminal, and then be able to
continue using the shell. In such cases, there are several ways in
which the user can change <tt>fish</tt>'s behaviour.
which the user can change <code>fish</code>'s behaviour.
-# By ending a command with the \& (ampersand) symbol, the user tells \c fish to put the specified command into the background. A background process will be run simultaneous with \c fish. \c fish will retain control of the terminal, so the program will not be able to read from the keyboard.
-# By pressing ^Z, the user stops a currently running foreground program and returns control to \c fish. Some programs do not support this feature, or remap it to another key. Gnu emacs uses ^X z to stop running.
@@ -875,13 +875,13 @@ On startup, \c fish evaluates the file /etc/fish (Or ~/etc/fish if you
installed fish in your home directory) and ~/.fish, in that order. If
you want to run a command only on starting an interactive shell, use
the exit status of the command 'status --is-interactive' to determine
if the shell is interactive. If you want to run a command only on
starting a login shell, use 'status --is-login' instead.
if the shell is interactive. If you want to run a command only when
using a login shell, use 'status --is-login' instead.
Example:
Examples:
If you want to add the directory ~/linux/bin to your PATH variable
when loging in, add the following to your ~/.fish file:
when using a login shell, add the following to your ~/.fish file:
<pre>if status --is-login
set PATH $PATH ~/linux/bin
@@ -891,7 +891,7 @@ If you want to run a set of commands when \c fish exits, use an <a
href='#event'>event handler</a> that is triggered by the exit of the
shell:
<pre>function on_exit --on-process %self
<pre>function on_exit --on-process \%self
echo fish is now exiting
end</pre>
@@ -925,11 +925,15 @@ fish_color_substitution, \c fish_color_redirection, \c fish_color_end,
\c fish_color_error, \c fish_color_param, \c fish_color_comment, \c
fish_color_match, \c fish_color_search_match, \c fish_color_cwd, \c
fish_pager_color_prefix, \c fish_pager_color_completion, \c
fish_pager_color_description and \c fish_pager_color_progress. Valid
values are \c black, \c red, \c green, \c brown, \c yellow, \c blue,
\c magenta, \c purple, \c cyan, \c white or \c normal. Setting one of
the above variables to normal will mean that the text color will be
set to the default foreground color for the terminal.
fish_pager_color_description and \c
fish_pager_color_progress. Usually, the value of these variables will
be one of \c black, \c red, \c green, \c brown, \c yellow, \c blue, \c
magenta, \c purple, \c cyan, \c white or \c normal, but they can be an
array containing any color options for the set_color command.
Issuing <code>set fish_color_error black --background=red
--bold</code> will make all commandline errors be written in a black,
bold font, with a red background.
\subsection prompt Programmable prompt
@@ -1052,10 +1056,10 @@ might become:
<pre>
msgid "%ls: No suitable job\n"
msgstr "%ls: Inget jobb matchar\n"
msgstr "%ls: Inget passande jobb\n"
</pre>
%s, %ls, %d and other tokens beginning with a '%' are
\%s, \%ls, \%d and other tokens beginning with a '\%' are
placeholders. These will be replaced by a value by fish at
runtime. You must always take care to use exactly the same
placeholders in the same order in your translation. (Actually, there
@@ -1072,18 +1076,19 @@ href='fish-users@lists.sf.net'>fish-users@lists.sf.net</a>.
- Complete vi-mode key bindings
- next-history-complete
- builtin wait command
- More completions (for example xterm, vim,
konsole, gnome-terminal, dcop, cdrecord, cron, xargs
rlogin, telnet, rsync, arch, finger, nice, locate,
bibtex, patch, aspell, xpdf,
zip, compress, wine, xmms, dig, wine, batch, cron,
compress, wine, xmms, dig, wine, batch, cron,
g++, javac, java, gcj, lpr, doxygen, whois, find)
- Undo support
- Check keybinding commands for output - if non has happened, don't repaint to reduce flicker
- Check keybinding commands for output - if nothing has happened, don't repaint to reduce flicker
- The jobs builtin should be able to give information on a specific job, such as the pids of the processes in the job
- Syntax highlighting should mark cd to non-existing directories as an error
- wait shellscript
- Signal handler to save the history file before exiting from a signal
\subsection todo-possible Possible features
@@ -1095,7 +1100,6 @@ g++, javac, java, gcj, lpr, doxygen, whois, find)
- mouse support like zsh has with http://stchaz.free.fr/mouse.zsh
installed would be awesome
- suggest a completion on unique matches by writing it out in an understated color
- Maybe some functions should only be available from key-bindings. That way one could implement a large part of all the key-binding functions as regular fish functions without worrying about cluttering up the function name space.
- With a bit of tweakage, quite a few of the readline key-binding functions could be implemented in shellscript.
- Highlight beginning/end of block when moving over a block command
- Inclusion guards for the init files to make them evaluate only once, even if the user has installed fish both in /etc and in $HOME
@@ -1108,18 +1112,18 @@ g++, javac, java, gcj, lpr, doxygen, whois, find)
- Descriptions for variables using 'set -d'.
- Parse errors should when possible honor IO redirections
\subsection bugs Known bugs
- Completion for gcc -\#\#\# option doesn't work.
- Many completions are made specifically for the GNU version of a POSIX command
- Yanking weird characters from clipboard prints Unicode escapes
- Suspending and then resuming pipelines containing a builtin seems to be broken.
- Interactive input seems broken inside blocks. Is local echo and other terminal values not restored when in an interactive block?
- Suspending and then resuming pipelines containing a builtin is broken. How should this be handled?
If you think you have found a bug not described here, please send a
report to <a href="mailto:axel@liljencrantz.se"> axel@liljencrantz.se
</a>.
\subsection issues Known issues
Older versions of Doxygen has bugs in the man-page generation which
@@ -1134,6 +1138,7 @@ changes when upgrading from pre1.9.2 to 1.9.2 or later. You may also
run into such problems when switching between using a package and
personal builds.
*/
/** \page design Design document
@@ -1406,7 +1411,7 @@ between different shell sessions and applications.
The open command uses the mimetype database (Also used by both Gnome
or KDE) to launch the default application for a file. Just type
<tt>open *.html</tt> and all the HTML files in your current directory
<code>open *.html</code> and all the HTML files in your current directory
will be opened in your default browser. No longer will you have to
convert your filenames to URLS, remember clunky Open Office command
names, worry about absolute paths or any the other common pitfalls when
@@ -1416,10 +1421,10 @@ opening files from the commandline.
\c fish is heavily commented. Both the source code and the
program in general features a great deal of easily accessible
documentation. The <tt>help</tt> command is used to display HTML-based
help files. Just type <tt>help</tt> and a subject, and the help system
documentation. The <code>help</code> command is used to display HTML-based
help files. Just type <code>help</code> and a subject, and the help system
will try to fill your needs. To view the page you are reading right
now, you could simply type <tt>help difference</tt>. <tt>help</tt>
now, you could simply type <code>help difference</code>. <code>help</code>
also works great together with tab completion. Write \c help and
double tap on tab, a list of all help sections will be displayed, with
a description of the content of each section.
@@ -1470,9 +1475,9 @@ information.
\subsection difference-simple Simplicity
\c fish has a simple syntax. There is only one form of
alias/function/whatever, accessed through the <tt>function</tt>
alias/function/whatever, accessed through the <code>function</code>
builtin. The are very few builtins, \c fish relies on normal commands
like <tt>echo</tt>, <tt>kill</tt>, <tt>printf</tt> and <tt>time</tt>
like <code>echo</code>, <code>kill</code>, <code>printf</code> and <code>time</code>
instead of reimplementing them as builtins.
Token separation is performed before variable expansion. This means
@@ -1480,13 +1485,13 @@ that even if a variable contains spaces, it will never be separated
into multiple arguments. If you want to tokenize a string, you can use
the <a href="commands.html#tokenize">tokenize</a> command.
Command substitution is specified using parenthesis, as in <tt>set name (whoami)</tt>.
Command substitution is specified using parenthesis, as in <code>set name (whoami)</code>.
There is no math mode, use bc.
The POSIX way of setting variables is <i>lame</i>. Whitespace
sensitive languages are awful. "foo=bar" and "foo = bar" should not
mean different things. \c fish uses a builtin, <tt>set</tt> to set and
mean different things. \c fish uses a builtin, <code>set</code> to set and
remove environment variables. While this may seem a bit obscure, this
makes for a very consistent language. In fish, everything, including
the loops, assignments and switch/case statements is a command.

View File

@@ -7,8 +7,8 @@
\subsection exec-description Description
The \c exec builtin is used to replace the currently running shells
process image with a new command. On sucessfull completion, exec never
returns. exec can not be used inside a pipeline.
process image with a new command. On successful completion, exec never
returns. exec can not be used inside a pipeline.
\subsection exec-example Example

View File

@@ -2,50 +2,24 @@
\section fishd fishd - Universal variable daemon
\subsection fishd-synopsis Synopsis
<tt>fishd [SECTION]</tt>
<tt>fishd [(-h|--help|-v|--version)]</tt>
\subsection fishd-description Description
The \c fishd daemon is used to load, save and distribute universal
variable information. fish automtically connects to fishd via a socket
variable information. fish automatically connects to fishd via a socket
on startup. If no instance of fishd is running, fish spawns a new
fishd instance. fishd will create a socket in /tmp, and wait for
incoming connections from universal variable clents, such as fish,
incoming connections from universal variable clients, such as fish,
When no clients are connected, fishd will automatically shut down.
\subsection fishd-commands Commands
Fishd works by sending and recieving sommands. Each command is ended
with a newline. These are the commands supported by fishd:
<pre>set KEY:VALUE
set_export KEY:VALUE
</pre>
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.
<pre>erase KEY
</pre>
Erase the variable with the specified name.
<pre>barrier
barrier_reply
</pre>
A \c barrier command will result in a barrier_reply beeing added to
the end of the senders queue of unsent messages. These commands are
used to synchronize clients, since once the reply for a barrier
message returns, the sender can know that any updates available at the
time the original barrier request was sent have been recieved.
- <tt>-h</tt> or <tt>--help</tt> displays this help message and then exits
- <tt>-v</tt> or <tt>--version</tt> displays the current fish version and then exits
\subsection fishd-files Files
~/.fishd.HOSTNAME permenent storage location for universal variale
~/.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.
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.

View File

@@ -5,22 +5,22 @@
\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.
- \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.
- <tt>-d DESCRIPTION</tt> or \c --description=DESCRIPTION is a description of what the function does, suitable as a completion description
- <tt>-j PID</tt> or <tt> --on-job-exit PID</tt> tells fish to run this function when the job with group id PID exits
- <tt>-p PID</tt> or <tt> --on-process-exit PID</tt> tells fish to run this function when the fish child process with process id PID exits
- <tt>-s</tt> or <tt>--on-signal SIGSPEC</tt> tells fish to run this function when the signal SIGSPEC is delivered. SIGSPEC can be a singal number, or the signal name, such as SIGHUP (or just HUP)
- <tt>-s</tt> or <tt>--on-signal SIGSPEC</tt> 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)
- <tt>-v</tt> or <tt>--on-variable VARIABLE_NAME</tt> 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
list of commands that will be executed when the name of the function
is entered. The function
is entered. The function
<pre>
function hi
echo hello
end
</pre>
</pre>
will write <tt>hello</tt> whenever the user enters \c hi.
@@ -29,7 +29,7 @@ are inserted into the environment variable <a href="index.html#variables-arrays"
\subsection function-example Example
<pre>function ll
<pre>function ll
ls -l $argv
end
</pre>
@@ -39,18 +39,18 @@ will run the \c ls command, using the \c -l option, while passing on any additio
<pre>
function mkdir -d "Create a directory and set CWD"
mkdir $argv
if test $status = 0
if test $status = 0
switch $argv[(count $argv)]
case '-*'
case '*'
cd $argv[(count $argv)]
return
end
end
end
</pre>
</pre>
will run the mkdir command, and if it is succesfull, change the
will run the mkdir command, and if it is successful, change the
current working directory to the one just created.

View File

@@ -1,5 +1,5 @@
\section help help - Display fish documantation
\section help help - Display fish documentation
\subsection help-synopsis Synopsis
<tt>help [SECTION]</tt>

View File

@@ -5,14 +5,14 @@
\subsection jobs-description Description
The <tt>jobs</tt> builtin causes fish to print a list of the currently
running jobs and their status.
running jobs and their status.
jobs accepts the following switches:
- <tt>-c</tt> or <tt>--command</tt> print the command name for each process in jobs
- <tt>-g</tt> or <tt>--group</tt> only print the group id of each job
- <tt>-l</tt> or <tt>--last</tt> only the last job to be started is printed
- <tt>-p</tt> or <tt>--process</tt> print the procces id for each process in all jobs
- <tt>-p</tt> or <tt>--process</tt> print the process id for each process in all jobs
On systems that supports this feature, jobs will print the CPU usage
of each job since the last command was executed. The CPU usage is

View File

@@ -1,9 +1,10 @@
\section nextd nextd
\subsection nextd-synopsis Synopsis
<tt>nextd [-l] [pos]</tt>
<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 <tt>-l></tt> flag is
specified, the current history is also displayed.
\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,9 +1,10 @@
\section prevd prevd
\subsection prevd-synopsis Synopsis
<tt>prevd [-l] [pos]</tt>
<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 <tt>-l</tt> 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

@@ -3,11 +3,11 @@
\subsection set-synopsis Synopsis
<code>set [OPTIONS] [VARIABLE_NAME [VALUES...]]</code>
The <code>set</code> builtin causes fish to assign the variable <code>VARIABLE_NAME</code> the values <code>VALUES...</code>.
The <code>set</code> builtin causes fish to assign the variable <code>VARIABLE_NAME</code> the values <code>VALUES...</code>.
\subsection set-description Description
- <code>-e</code> or <code>--erase</code> causes the specified environment variable to be erased
- <code>-g</code> or <code>--global</code> causes the specified environment variable to be made global. If this option is not supplied, the specified variable will dissapear when the current block ends
- <code>-g</code> or <code>--global</code> causes the specified environment variable to be made global. If this option is not supplied, the specified variable will disappear when the current block ends
- <code>-l</code> or <code>--local</code> forces the specified environment variable to be made local to the current block, even if the variable already exists and is non-local
- <code>-n</code> or <code>--names</code> List only the names of all defined variables
- <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.
@@ -18,7 +18,7 @@ The <code>set</code> builtin causes fish to assign the variable <code>VARIABLE_N
If set is called with no arguments, the names and values of all
environment variables are printed. If some of the scope or export
flags have been given, only the variables matching the specified scope
are printed.
are printed.
If the \c -e or \c --erase option is specified, the variable
specified by the following arguments will be erased
@@ -27,8 +27,14 @@ If a variable is set to more than one value, the variable will be an
array with the specified elements. If a variable is set to zero
elements, it will become an array with zero elements.
If the variable name is one or more array elements, such as <code>PATH[1
3 7]</code>, only those array elements specified will be changed.
If the variable name is one or more array elements, such as
<code>PATH[1 3 7]</code>, only those array elements specified will be
changed.
The set command requires all switch arguments to come before any
non-switch arguments. For example, <code>set flags -l</code> will have
the effect of setting the value of the variable <code>flags</code> to
'-l', not making the variable local.
\subsection set-example Example

View File

@@ -20,3 +20,8 @@ purple, cyan, white and normal.
Calling <tt>set_color normal</tt> will set the terminal color to
whatever is the default color of the terminal.
Some terminals use the --bold escape sequence to switch to a brighter
color set. On such terminals, <code>set_color white</code> will result
in a grey font color, while <code>set_color --bold white</code> will
result in a white font color.

View File

@@ -5,7 +5,7 @@
<tt>status [OPTION]</tt>
\subsection status-description Description
- <tt>-c</tt> or <tt>--is-command-substitution</tt> returns 0 if fish is currently executing a command usbstitution
- <tt>-c</tt> or <tt>--is-command-substitution</tt> returns 0 if fish is currently executing a command substitution
- <tt>-b</tt> or <tt>--is-block</tt> returns 0 if fish is currently executing a block of code
- <tt>-i</tt> or <tt>--is-interactive</tt> returns 0 if fish is interactive, i.e.connected to a keyboard
- <tt>-l</tt> or <tt>--is-login</tt> returns 0 if fish is a login shell, i.e. if fish should perform login tasks such as setting up the PATH.
- <tt>-l</tt> or <tt>--is-login</tt> returns 0 if fish is a login shell, i.e. if fish should perform login tasks such as setting up the PATH.

View File

@@ -12,7 +12,7 @@ wildcarded values.
\subsection switch-example Example
If the variable \$animal contins the name of an animal, the
If the variable \$animal contains the name of an animal, the
following code would attempt to classify it:
<p>
@@ -22,7 +22,7 @@ switch $animal
echo evil
case wolf dog human moose dolphin whale
echo mammal
case duck goose albatros
case duck goose albatross
echo bird
case shark trout stingray
echo fish
@@ -32,6 +32,6 @@ end
<p>
If the above code was run with \$animal set to \c whale, the output
would be \c mammal.
would be \c mammal.
</p>

View File

@@ -1,5 +1,5 @@
\section trap trap - perform an action when the shell recives a signal
\section trap trap - perform an action when the shell receives a signal
\subsection trap-synopsis Synopsis
<tt>trap [OPTIONS] [[ARG] SIGSPEC ... ]</tt>
@@ -8,10 +8,10 @@
Trap is a shellscript wrapper around the fish event delivery
framework. IT is defined for backwards compatibility reasons. For
other uses, it is recomended to define a <a
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 delivary
- ARG is the command to be executed on signal delivery
- SIGSPEC is the name of the signal to trap
- \c -h or \c --help Display help and exit
- \c -l or \c --list-signals print a list of signal names

View File

@@ -6,11 +6,11 @@
\subsection type-description Description
With no options, indicate how each name would be interpreted if used as a command name.
With no options, indicate how each name would be interpreted if used as a command name.
- \c -h or \c --help print this message
- \c -a or \c --all print all of possible definitions of the specified names
- \c -f or \c --no-functions supresses function and builtin lookup
- \c -f or \c --no-functions suppresses function and builtin lookup
- \c -t or \c --type print a string which is one of alias, keyword, function, builtin, or file if name is an alias, shell reserved word, function, builtin, or disk file, respectively
- \c -p or \c --path either return the name of the disk file that would be executed if name were specified as a command name, or nothing if 'type -t name' would not return 'file'
- \c -P or \c --force-path either return the name of the disk file that would be executed if name were specified as a command name, or nothing no file with the specified name could be found in the PATH

View File

@@ -1,5 +1,5 @@
\section ulimit ulimit - Set or get the shells resurce usage limits
\section ulimit ulimit - Set or get the shells resource usage limits
\subsection ulimit-synopsis Synopsis
<tt>ulimit [OPTIONS] [LIMIT]</tt>
@@ -38,7 +38,7 @@ 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:
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.

View File

@@ -1,5 +1,5 @@
\section umask umask - Set or get the shells resurce usage limits
\section umask umask - Set or get the shells resource usage limits
\subsection umask-synopsis Synopsis
<code>umask [OPTIONS] [MASK]</code>
@@ -10,7 +10,7 @@ With no argument, the current file-creation mask is printed, if an
argument is specified, it is the new file creation mask. The mask may
be specified as an octal number, in which case it is interpreted as
the rights that should be masked away, i.e. it is the inverse of the
file permissions any new files will have.
file permissions any new files will have.
If a symbolic mask is specified, the actual file permission bits, and
not the inverse, should be specified. A symbolic mask is a comma
@@ -19,7 +19,7 @@ separated list of rights. Each right consists of three parts:
- The first part specifies to whom this set of right applies, and can
be one of \c u, \c g, \c o or \c a, where \c u specifies the user who
owns the file, \c g specifies the group owner of the file, \c o
specifiec other users rights and \c a specifies all three should be
specific other users rights and \c a specifies all three should be
changed.
- The second part of a right specifies the mode, and can be one of \c
=, \c + or \c -, where \c = specifies that the rights should be set to
@@ -27,7 +27,7 @@ the new value, \c + specifies that the specified right should be added
to those previously specified and \c - specifies that the specified
rights should be removed from those previously specified.
- The third part of a right specifies what rights should be changed
and can be any compination of \c r, \c w and \c x, representing
and can be any combination of \c r, \c w and \c x, representing
read, write and execute rights.
If the first and second parts are skipped, they are assumed to be \c a

259
env.c
View File

@@ -25,7 +25,12 @@
#include <termio.h>
#endif
#if HAVE_TERM_H
#include <term.h>
#elif HAVE_NCURSES_TERM_H
#include <ncurses/term.h>
#endif
#include <errno.h>
#include "util.h"
@@ -143,19 +148,6 @@ static buffer_t export_buffer;
*/
static int has_changed = 1;
/**
Free hash key and hash value
*/
static void clear_hash_entry( const void *key, const void *data )
{
var_entry_t *entry = (var_entry_t *)data;
if( entry->export )
has_changed = 1;
free( (void *)key );
free( (void *)data );
}
/**
This stringbuffer is used to store the value of dynamically
generated variables, such as history.
@@ -173,6 +165,36 @@ static int get_names_show_exported;
*/
static int get_names_show_unexported;
/**
List of all locale variable names
*/
static const wchar_t *locale_variable[] =
{
L"LANG",
L"LC_ALL",
L"LC_COLLATE",
L"LC_CTYPE",
L"LC_MESSAGES",
L"LC_MONETARY",
L"LC_NUMERIC",
L"LC_TIME",
(void *)0
}
;
/**
Free hash key and hash value
*/
static void clear_hash_entry( const void *key, const void *data )
{
var_entry_t *entry = (var_entry_t *)data;
if( entry->export )
has_changed = 1;
free( (void *)key );
free( (void *)data );
}
/**
When fishd isn't started, this function is provided to
env_universal as a callback, it tries to start up fishd. It's
@@ -184,7 +206,7 @@ static void start_fishd()
{
string_buffer_t cmd;
struct passwd *pw;
sb_init( &cmd );
pw = getpwuid(getuid());
@@ -215,15 +237,6 @@ static mode_t get_umask()
return res;
}
/**
List of all locale variable names
*/
static const wchar_t *locale_variable[] =
{
L"LANG", L"LC_ALL", L"LC_COLLATE", L"LC_CTYPE", L"LC_MESSAGES", L"LC_MONETARY", L"LC_NUMERIC", L"LC_TIME", (void *)0
}
;
/**
Checks if the specified variable is a locale variable
*/
@@ -251,7 +264,14 @@ static void handle_locale()
*/
static const int cat[] =
{
0, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME
0,
LC_ALL,
LC_COLLATE,
LC_CTYPE,
LC_MESSAGES,
LC_MONETARY,
LC_NUMERIC,
LC_TIME
}
;
@@ -277,18 +297,23 @@ static void handle_locale()
if( wcscmp( wsetlocale( LC_MESSAGES, (void *)0 ), old ) != 0 )
{
/* Make change known to gettext. */
/* Try to make change known to gettext. */
#ifdef HAVE__NL_MSG_CAT_CNTR
{
extern int _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
if( is_interactive )
{
complete_destroy();
complete_init();
debug( 0, _(L"Changing language to english") );
debug( 0, _(L"Changing language to English") );
}
}
free( old );
@@ -339,22 +364,99 @@ static void universal_callback( int type,
}
}
/**
Make sure the PATH variable contains the essaential directories
*/
static void setup_path()
{
wchar_t *path;
int i, j;
array_list_t l;
const wchar_t *path_el[] =
{
L"/bin",
L"/usr/bin",
PREFIX L"/bin",
0
}
;
path = env_get( L"PATH" );
if( !path )
{
env_set( L"PATH", 0, ENV_EXPORT | ENV_GLOBAL );
path=0;
}
al_init( &l );
if( path )
expand_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) )
{
has_el = 1;
}
}
if( !has_el )
{
string_buffer_t b;
debug( 3, L"directory %ls was missing", path_el[j] );
sb_init( &b );
if( path )
{
sb_append( &b, path );
}
sb_append2( &b,
ARRAY_SEP_STR,
path_el[j],
(void *)0 );
env_set( L"PATH", (wchar_t *)b.buff, ENV_GLOBAL | ENV_EXPORT );
sb_destroy( &b );
al_foreach( &l, (void (*)(const void *))&free );
path = env_get( L"PATH" );
al_truncate( &l, 0 );
expand_variable_array( path, &l );
}
}
al_foreach( &l, (void (*)(const void *))&free );
al_destroy( &l );
}
void env_init()
{
char **p;
struct passwd *pw;
wchar_t *uname, *path;
wchar_t *uname;
sb_init( &dyn_var );
b_init( &export_buffer );
/*
These variables can not be altered directly by the user
*/
hash_init( &env_read_only, &hash_wcs_func, &hash_wcs_cmp );
hash_put( &env_read_only, L"status", L"" );
hash_put( &env_read_only, L"history", L"" );
hash_put( &env_read_only, L"_", L"" );
@@ -387,6 +489,11 @@ 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
*/
/*
Import environment variables
@@ -424,77 +531,14 @@ void env_init()
free(key);
}
path = env_get( L"PATH" );
if( !path )
{
env_set( L"PATH", L"/bin" ARRAY_SEP_STR L"/usr/bin", ENV_EXPORT | ENV_GLOBAL );
path = env_get( L"PATH" );
}
else
{
int i, j;
array_list_t l;
al_init( &l );
expand_variable_array( path, &l );
/*
Set up the PATH variable
*/
setup_path();
debug( 3, L"PATH is %ls", path );
const wchar_t *path_el[] =
{
L"/bin",
L"/usr/bin",
PREFIX L"/bin",
0
}
;
for( j=0; path_el[j]; j++ )
{
int has_el=0;
debug( 3, L"Check directory %ls", path_el[j] );
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) )
{
has_el = 1;
}
}
if( !has_el )
{
string_buffer_t b;
debug( 3, L"directory %ls was missing", path_el[j] );
sb_init( &b );
sb_append2( &b, path,
ARRAY_SEP_STR,
path_el[j],
(void *)0 );
env_set( L"PATH", (wchar_t *)b.buff, ENV_GLOBAL | ENV_EXPORT );
sb_destroy( &b );
path = env_get( L"PATH" );
}
}
debug( 3, L"After: PATH is %ls", path );
al_foreach( &l, (void (*)(const void *))&free );
al_destroy( &l );
}
/*
Set up the USER variable
*/
pw = getpwuid( getuid() );
if( pw )
{
@@ -609,7 +653,7 @@ void env_set( const wchar_t *key,
/*
Zero element arrays are internaly not coded as null but as this placeholder string
*/
if( !val && ( var_mode & ENV_USER ) )
if( !val )
{
val = ENV_NULL;
}
@@ -696,7 +740,8 @@ void env_set( const wchar_t *key,
else
{
/*
New variable with unspecified scope. The default scope is the innermost scope that is shadowing
New variable with unspecified scope. The default
scope is the innermost scope that is shadowing
*/
node = top;
while( node->next && !node->new_scope )
@@ -765,8 +810,6 @@ void env_set( const wchar_t *key,
}
/**
Attempt to remove/free the specified key/value pair from the
specified hash table.
@@ -1038,7 +1081,9 @@ static void add_key_to_hash( const void *key,
var_entry_t *e = (var_entry_t *)data;
if( ( e->export && get_names_show_exported) ||
( !e->export && get_names_show_unexported) )
{
hash_put( (hash_table_t *)aux, key, 0 );
}
}
/**

View File

@@ -11,12 +11,19 @@
#include <pwd.h>
#include <errno.h>
#include <fcntl.h>
#if HAVE_NCURSES_H
#include <ncurses.h>
#else
#include <curses.h>
#endif
#if HAVE_TERM_H
#include <term.h>
#elif HAVE_NCURSES_TERM_H
#include <ncurses/term.h>
#endif
#include <signal.h>
#include "util.h"

View File

@@ -5,6 +5,8 @@
client library and by the daemon.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -186,7 +188,7 @@ void read_message( connection_t *src )
}
else
{
sb_printf( &src->input, L"%lc", res );
sb_append_char( &src->input, res );
}
}
}

94
event.c
View File

@@ -13,6 +13,7 @@
#include "config.h"
#include "util.h"
#include "wutil.h"
#include "function.h"
#include "proc.h"
#include "parser.h"
@@ -73,11 +74,15 @@ static array_list_t *killme;
*/
static array_list_t *blocked;
/**
String buffer used for formating event descriptions in event_get_desc()
*/
static string_buffer_t *get_desc_buff=0;
/**
Tests if one event instance matches the definition of a event
class. If the class defines a function name, that will also be a
match criterion.
class. If both the class and the instance name a function,
they must name the same function.
*/
static int event_match( event_t *class, event_t *instance )
@@ -154,7 +159,9 @@ static event_t *event_copy( event_t *event, int copy_arguments )
return e;
}
/**
Test if specified event is blocked
*/
static int event_is_blocked( event_t *e )
{
block_t *block;
@@ -183,6 +190,63 @@ static int event_is_blocked( event_t *e )
return 0;
}
const wchar_t *event_get_desc( event_t *e )
{
if( !get_desc_buff )
{
get_desc_buff=malloc(sizeof(string_buffer_t) );
if( !get_desc_buff )
die_mem();
sb_init( get_desc_buff );
}
else
{
sb_clear( get_desc_buff );
}
switch( e->type )
{
case EVENT_SIGNAL:
sb_printf( get_desc_buff, _(L"signal handler for %ls (%ls)"), sig2wcs(e->param1.signal ), signal_get_desc( e->param1.signal ) );
break;
case EVENT_VARIABLE:
sb_printf( get_desc_buff, _(L"handler for variable '%ls'"), e->param1.variable );
break;
case EVENT_EXIT:
if( e->param1.pid > 0 )
{
sb_printf( get_desc_buff, _(L"exit handler for process %d"), e->param1.pid );
}
else
{
job_t *j = job_get_from_pid( -e->param1.pid );
if( j )
sb_printf( get_desc_buff, _(L"exit handler for job %d, '%ls'"), j->job_id, j->command );
else
sb_printf( get_desc_buff, _(L"exit handler for job with process group %d"), -e->param1.pid );
}
break;
case EVENT_JOB_ID:
{
job_t *j = job_get( e->param1.job_id );
if( j )
sb_printf( get_desc_buff, _(L"exit handler for job %d, '%ls'"), j->job_id, j->command );
else
sb_printf( get_desc_buff, _(L"exit handler for job with job id %d"), j->job_id );
break;
}
}
return (const wchar_t *)get_desc_buff->buff;
}
void event_add_handler( event_t *event )
{
@@ -324,8 +388,7 @@ static void event_fire_internal( event_t *event )
string_buffer_t *b=0;
array_list_t *fire=0;
int was_subshell = is_subshell;
// int was_interactive = is_interactive;
int was_interactive = is_interactive;
/*
First we free all events that have been removed
@@ -401,17 +464,18 @@ 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
*/
is_subshell=1;
// is_interactive=0;
is_interactive=0;
parser_push_block( EVENT );
current_block->param1.event = event;
eval( (wchar_t *)b->buff, 0, TOP );
parser_pop_block();
}
/*
Restore interactivity flags
*/
is_subshell = was_subshell;
// is_interactive = was_interactive;
is_interactive = was_interactive;
if( b )
{
@@ -531,7 +595,6 @@ void event_fire( event_t *event )
sig_list[active_list].signal[sig_list[active_list].count++]=event->param1.signal;
else
sig_list[active_list].overflow=1;
}
else
{
@@ -565,6 +628,7 @@ void event_init()
void event_destroy()
{
if( events )
{
al_foreach( events, (void (*)(const void *))&event_free );
@@ -572,6 +636,7 @@ void event_destroy()
free( events );
events=0;
}
if( killme )
{
al_foreach( killme, (void (*)(const void *))&event_free );
@@ -579,6 +644,13 @@ void event_destroy()
free( killme );
killme=0;
}
if( get_desc_buff )
{
sb_destroy( get_desc_buff );
free( get_desc_buff );
}
}
void event_free( event_t *e )

View File

@@ -112,7 +112,6 @@ int event_get( event_t *criterion, array_list_t *out );
dispatched.
\param event the specific event whose handlers should fire
\param arguments the argument string to send to the event handler function
*/
void event_fire( event_t *event );
@@ -131,4 +130,10 @@ void event_destroy();
*/
void event_free( event_t *e );
/**
Returns a string describing the specified event. The string should
not be freed.
*/
const wchar_t *event_get_desc( event_t *e );
#endif

189
exec.c
View File

@@ -37,6 +37,7 @@
#include "signal.h"
#include "env_universal.h"
#include "translate.h"
#include "halloc.h"
/**
Prototype for the getpgid library function. The prototype for this
@@ -67,6 +68,8 @@ pid_t getpgid( pid_t pid );
*/
static array_list_t *open_fds=0;
static int set_child_group( job_t *j, process_t *p, int print_errors );
void exec_close( int fd )
{
@@ -238,7 +241,7 @@ void free_fd( io_data_t *io, int fd )
\param io the list of IO redirections for the child
\param exit_on_error whether to call exit() on errors
\return 1 on sucess, 0 on failiure
\return 0 on sucess, -1 on failiure
*/
static int handle_child_io( io_data_t *io, int exit_on_error )
{
@@ -283,7 +286,7 @@ static int handle_child_io( io_data_t *io, int exit_on_error )
}
else
{
return 0;
return -1;
}
}
else if( tmp != io->fd)
@@ -302,7 +305,7 @@ static int handle_child_io( io_data_t *io, int exit_on_error )
}
else
{
return 0;
return -1;
}
}
exec_close( tmp );
@@ -326,7 +329,7 @@ static int handle_child_io( io_data_t *io, int exit_on_error )
}
else
{
return 0;
return -1;
}
}
break;
@@ -349,7 +352,7 @@ static int handle_child_io( io_data_t *io, int exit_on_error )
}
else
{
return 0;
return -1;
}
}
@@ -373,7 +376,7 @@ static int handle_child_io( io_data_t *io, int exit_on_error )
if( env_universal_server.fd >= 0 )
exec_close( env_universal_server.fd );
return 1;
return 0;
}
@@ -385,43 +388,26 @@ static int handle_child_io( io_data_t *io, int exit_on_error )
IO redirections and other file descriptor actions are performed.
\param j the job to set up the IO for
\param exit_on_error whether to call exit() on errors
\param p the child process to set up
\return 1 on sucess, 0 on failiure
\return 0 on sucess, -1 on failiure
*/
static int setup_child_process( job_t *j, process_t *p )
{
int res;
int res=0;
if( is_interactive && p->type==EXTERNAL )
{
pid_t pid;
/*
Put the process into the process group and give the process
group the terminal, if appropriate. This has to be done
both by the shell and in the individual child processes
because of potential race conditions.
*/
pid = getpid ();
if (j->pgid == 0)
j->pgid = pid;
/* Wait till shell puts os in our own group */
while( getpgrp() != j->pgid )
sleep(0);
/* Wait till shell gives us stdin */
if ( j->fg )
{
while( tcgetpgrp( 0 ) != j->pgid )
sleep(0);
}
if( p )
{
res = set_child_group( j, p, 1 );
}
if( !res )
{
res = handle_child_io( j->io, (p==0) );
}
res = handle_child_io( j->io, (p==0) );
/* Set the handling for job control signals back to the default. */
if( res )
if( !res )
{
signal_reset_handlers();
}
@@ -442,6 +428,7 @@ static int setup_child_process( job_t *j, process_t *p )
*/
static void launch_process( process_t *p )
{
// debug( 1, L"exec '%ls'", p->argv[0] );
execve (wcs2str(p->actual_cmd), wcsv2strv( (const wchar_t **) p->argv), env_export_arr( 0 ) );
debug( 0,
@@ -594,14 +581,22 @@ static void internal_exec_helper( const wchar_t *def,
}
/**
This function should be called by the parent process right after
fork() has been called. If job control is enabled, the child is put
in the jobs group.
This function should be called by both the parent process and the
child right after fork() has been called. If job control is
enabled, the child is put in the jobs group, and if the child is
also in the foreground, it is also given control of the
terminal. When called in the parent process, this function may
fail, since the child might have already finished and called
exit. The parent process may safely ignore the exit status of this
call.
Returns 0 on sucess, -1 on failiure.
*/
static int handle_new_child( job_t *j, process_t *p )
static int set_child_group( job_t *j, process_t *p, int print_errors )
{
int res = 0;
if( is_interactive && p->type==EXTERNAL )
if( j->job_control )
{
int new_pgid=0;
@@ -613,7 +608,7 @@ static int handle_new_child( job_t *j, process_t *p )
if( setpgid (p->pid, j->pgid) )
{
if( getpgid( p->pid) != j->pgid )
if( getpgid( p->pid) != j->pgid && print_errors )
{
debug( 1,
_( L"Could not send process %d from group %d to group %d" ),
@@ -621,38 +616,28 @@ static int handle_new_child( job_t *j, process_t *p )
getpgid( p->pid),
j->pgid );
wperror( L"setpgid" );
res = -1;
}
}
if( j->fg )
{
if( tcsetpgrp (0, j->pgid) )
{
debug( 1, _( L"Could not send job %d ('%ls') to foreground" ),
j->job_id,
j->command );
wperror( L"tcsetpgrp" );
return -1;
}
}
if( j->fg && new_pgid)
{
if( tcsetpgrp (0, j->pgid) )
{
debug( 1, _( L"Could not send job %d ('%ls') to foreground" ),
j->job_id,
j->command );
wperror( L"tcsetpgrp" );
return -1;
}
}
}
else
{
j->pgid = getpid();
}
return 0;
if( j->terminal && j->fg )
{
if( tcsetpgrp (0, j->pgid) && print_errors )
{
debug( 1, _( L"Could not send job %d ('%ls') to foreground" ),
j->job_id,
j->command );
wperror( L"tcsetpgrp" );
res = -1;
}
}
return res;
}
@@ -678,7 +663,7 @@ void exec( job_t *j )
int exec_error=0;
debug( 4, L"Exec job %ls with id %d", j->command, j->job_id );
debug( 4, L"Exec job '%ls' with id %d", j->command, j->job_id );
if( j->first_process->type==INTERNAL_EXEC )
{
@@ -688,9 +673,10 @@ void exec( job_t *j )
signal_block();
/*
setup_child_process make sure signals are propelry set up
setup_child_process make sure signals are properly set
up. It will also call signal_unblock
*/
if( setup_child_process( j, 0 ) )
if( !setup_child_process( j, 0 ) )
{
/*
launch_process never returns
@@ -704,8 +690,7 @@ void exec( job_t *j )
return;
}
}
}
pipe_read.fd=0;
pipe_write.fd=1;
@@ -722,9 +707,9 @@ void exec( job_t *j )
if( block_io )
{
if( j->io )
j->io = io_add( io_duplicate(block_io), j->io );
j->io = io_add( io_duplicate( j, block_io), j->io );
else
j->io=io_duplicate(block_io);
j->io=io_duplicate( j, block_io);
}
j->io = io_add( j->io, &pipe_write );
@@ -806,16 +791,20 @@ void exec( job_t *j )
wchar_t **arg;
int i;
string_buffer_t sb;
const wchar_t * def = function_get_definition( p->argv[0] );
// fwprintf( stderr, L"run function %ls\n", argv[0] );
wchar_t * def = halloc_register( j, wcsdup( function_get_definition( p->argv[0] )));
//fwprintf( stderr, L"run function %ls\n", argv[0] );
if( def == 0 )
{
debug( 0, _( L"Unknown function '%ls'" ), p->argv[0] );
break;
}
parser_push_block( FUNCTION_CALL );
current_block->param2.function_call_process = p;
current_block->param1.function_name = halloc_register( current_block, wcsdup( p->argv[0] ) );
if( builtin_count_args(p->argv)>1 )
{
sb_init( &sb );
@@ -830,6 +819,11 @@ void exec( job_t *j )
env_set( L"argv", (wchar_t *)sb.buff, ENV_LOCAL );
sb_destroy( &sb );
}
else
{
env_set( L"argv", 0, ENV_LOCAL );
}
parser_forbid_function( p->argv[0] );
if( p->next )
@@ -996,7 +990,7 @@ void exec( job_t *j )
if( !io_buffer )
{
/*
No buffer, se we exit directly. This means we
No buffer, so we exit directly. This means we
have to manually set the exit status.
*/
if( p->next == 0 )
@@ -1014,6 +1008,7 @@ void exec( job_t *j )
if( io_buffer->param2.out_buffer->used != 0 )
{
pid = fork();
if( pid == 0 )
{
/*
@@ -1041,12 +1036,19 @@ void exec( job_t *j )
it control over the terminal.
*/
p->pid = pid;
if( handle_new_child( j, p ) )
exit(1);
set_child_group( j, p, 0 );
}
}
else
{
if( p->next == 0 )
{
proc_set_last_status( j->negate?(status?0:1):status);
}
p->completed = 1;
}
io_buffer_destroy( io_buffer );
@@ -1133,9 +1135,8 @@ void exec( job_t *j )
*/
p->pid = pid;
if( handle_new_child( j, p ) )
exit( 1 );
set_child_group( j, p, 0 );
}
break;
@@ -1173,20 +1174,16 @@ void exec( job_t *j )
*/
p->pid = pid;
if( handle_new_child( j, p ) )
exit( 1 );
set_child_group( j, p, 0 );
}
break;
}
}
if( p->type == INTERNAL_BUILTIN )
builtin_pop_io();
builtin_pop_io();
/*
Close the pipe the current process uses to read from the previous process_t
@@ -1291,15 +1288,8 @@ int exec_subshell( const wchar_t *cmd,
{
wchar_t *el;
*end=0;
el = str2wcs( begin );
if( !el )
{
debug( 0, _( L"Subshell '%ls' returned illegal string, discarded one entry" ), cmd );
}
else
{
al_push( l, el );
}
el = str2wcs( begin );
al_push( l, el );
begin = end+1;
break;
}
@@ -1309,5 +1299,6 @@ int exec_subshell( const wchar_t *cmd,
}
io_buffer_destroy( io_buffer );
return status;
}

810
expand.c

File diff suppressed because it is too large Load Diff

View File

@@ -143,31 +143,6 @@ int expand_string( wchar_t *in, array_list_t *out, int flag );
*/
wchar_t *expand_one( wchar_t *in, int flag );
/**
Expand backslashed escapes and substitute them with their unescaped
counterparts. Also optionally change the wildcards, the tilde
character and a few more into constants which are defined in a
private use area of Unicode. This assumes wchar_t is a unicode
character. character set.
The result must be free()d. The original string is not modified. If
an invalid sequence is specified, 0 is returned.
*/
wchar_t *expand_unescape( const wchar_t * in, int escape_special );
/**
Replace special characters with escape sequences. Newline is
replaced with \n, etc.
The result must be free()d. The original string is not modified.
\param in The string to be escaped
\param escape_all Whether all characters wich hold special meaning in fish (Pipe, semicolon, etc,) should be escaped, or only unprintable characters
\return The escaped string
*/
wchar_t *expand_escape( const wchar_t *in, int escape_all );
/**
Convert the variable value to a human readable form, i.e. escape things, handle arrays, etc. Suitable for pretty-printing.
*/
@@ -182,20 +157,6 @@ wchar_t *expand_escape_variable( const wchar_t *in );
*/
wchar_t *expand_tilde(wchar_t *in);
/**
Locate the first subshell in the specified string.
\param in the string to search for subshells
\param begin the starting paranthesis of the subshell
\param end the ending paranthesis of the subshell
\param flags set this variable to ACCEPT_INCOMPLETE if in tab_completion mode
\return -1 on syntax error, 0 if no subshells exist and 1 on sucess
*/
int expand_locate_subshell( wchar_t *in,
wchar_t **begin,
wchar_t **end,
int flags );
/**
Tokenize the specified string into the specified array_list_t.

View File

@@ -52,6 +52,8 @@ fi
%_mandir/man1/mimedb.1*
%_mandir/man1/set_color.1*
%_mandir/man1/count.1*
%_mandir/man1/fishd.1*
%_mandir/man1/fish_pager.1*
%attr(0755,root,root) %_bindir/fish
%attr(0755,root,root) %_bindir/fishd
%attr(0755,root,root) %_bindir/fish_pager

View File

@@ -27,7 +27,12 @@
#include <termio.h>
#endif
#if HAVE_TERM_H
#include <term.h>
#elif HAVE_NCURSES_TERM_H
#include <ncurses/term.h>
#endif
#include <signal.h>
#include "util.h"
@@ -407,54 +412,68 @@ static void printed_length( wchar_t *str,
int has_description = 0;
while( *str != 0 )
{
switch( *str )
if( ( *str >= ENCODE_DIRECT_BASE) &&
( *str < ENCODE_DIRECT_BASE+256) )
{
case L'\n':
case L'\b':
case L'\r':
case L'\e':
case L'\t':
case L'\\':
case L'&':
case L'$':
case L' ':
case L'#':
case L'^':
case L'<':
case L'>':
case L'(':
case L')':
case L'[':
case L']':
case L'{':
case L'}':
case L'?':
case L'*':
case L'|':
case L';':
case L':':
case L'\'':
case L'"':
case L'%':
case L'~':
if( has_description )
desc_len++;
else
comp_len+=2;
break;
if( has_description )
desc_len+=4;
else
comp_len+=4;
case COMPLETE_SEP:
has_description = 1;
break;
default:
if( has_description )
desc_len+= wcwidth(*str);
else
comp_len+= wcwidth(*str);
break;
}
else
{
switch( *str )
{
case L'\n':
case L'\b':
case L'\r':
case L'\e':
case L'\t':
case L'\\':
case L'&':
case L'$':
case L' ':
case L'#':
case L'^':
case L'<':
case L'>':
case L'(':
case L')':
case L'[':
case L']':
case L'{':
case L'}':
case L'?':
case L'*':
case L'|':
case L';':
case L':':
case L'\'':
case L'"':
case L'%':
case L'~':
if( has_description )
desc_len++;
else
comp_len+=2;
break;
case COMPLETE_SEP:
has_description = 1;
break;
default:
if( has_description )
desc_len+= wcwidth(*str);
else
comp_len+= wcwidth(*str);
break;
}
}
str++;
}
if( has_description )
@@ -545,7 +564,7 @@ static int completion_try_print( int cols,
memset( pref_width, 0, sizeof(pref_width) );
memset( min_width, 0, sizeof(min_width) );
/* Calculated how wide the list would be */
/* Calculate how wide the list would be */
for( j = 0; j < cols; j++ )
{
for( i = 0; i<rows; i++ )
@@ -795,7 +814,7 @@ static void mangle_descriptions( array_list_t *l )
{
wchar_t *next = (wchar_t *)al_get(l, i);
wchar_t *in, *out;
skip=0;
skip=1;
while( *next != COMPLETE_SEP && *next )
next++;
@@ -846,7 +865,11 @@ static void init()
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 )
@@ -858,6 +881,10 @@ static void init()
}
}
out_file = fdopen( out, "w" );
/**
Init the stringbuffer used to keep any output in
*/
sb_init( &out_buff );
output_init();
@@ -875,33 +902,6 @@ static void init()
exit(1);
}
/* Loop until we are in the foreground. */
while (tcgetpgrp( 0 ) != getpid())
{
kill (- getpid(), SIGTTIN);
}
/* Put ourselves in our own process group. */
if( getpgrp() != getpid() )
{
if (setpgid (getpid(), getpid()) < 0)
{
debug( 1,
L"Couldn't put the shell in its own process group");
wperror( L"setpgid" );
exit (1);
}
}
/* Grab control of the terminal. */
if( tcsetpgrp (STDIN_FILENO, getpid()) )
{
debug( 1,
L"Couldn't grab control of terminal" );
wperror( L"tcsetpgrp" );
exit(1);
}
handle_winch( 0 ); /* Set handler for window change events */
tcgetattr(0,&pager_modes); /* get the current terminal modes */
@@ -963,7 +963,11 @@ int main( int argc, char **argv )
for( i=3; i<argc; i++ )
{
al_push( &comp, str2wcs( argv[i] ) );
wchar_t *wcs = str2wcs( argv[i] );
if( wcs )
{
al_push( &comp, wcs );
}
}
mangle_descriptions( &comp );

118
fishd.c
View File

@@ -2,11 +2,45 @@
The universal variable server. fishd is automatically started by fish
if a fishd server isn't already running. fishd reads any saved
variables from ~/.fishd, and takes care of commonication between fish
variables from ~/.fishd, and takes care of communication between fish
instances. When no clients are running, fishd will automatically shut
down and save.
\subsection fishd-commands Commands
Fishd works by sending and receiving commands. Each command is ended
with a newline. These are the commands supported by fishd:
<pre>set KEY:VALUE
set_export KEY:VALUE
</pre>
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.
<pre>erase KEY
</pre>
Erase the variable with the specified name.
<pre>barrier
barrier_reply
</pre>
A \c barrier command will result in a barrier_reply being added to
the end of the senders queue of unsent messages. These commands are
used to synchronize clients, since once the reply for a barrier
message returns, the sender can know that any updates available at the
time the original barrier request was sent have been received.
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
@@ -19,6 +53,10 @@ down and save.
#include <pwd.h>
#include <fcntl.h>
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif
#include <errno.h>
#include <locale.h>
#include <signal.h>
@@ -35,6 +73,15 @@ down and save.
#define UNIX_PATH_MAX 100
#endif
/**
Fallback if MSG_DONTWAIT isn't defined. That's actually prerry bad,
and may lead to strange fishd behaviour, but at least it should
work most of the time.
*/
#ifndef MSG_DONTWAIT
#define MSG_DONTWAIT 0
#endif
/**
Small greeting to show that fishd is running
*/
@@ -75,6 +122,11 @@ 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
*/
@@ -396,11 +448,9 @@ static void save()
*/
static void init()
{
program_name=L"fishd";
sock = get_socket();
daemonize();
wsetlocale( LC_ALL, L"" );
env_universal_common_init( &broadcast );
load();
@@ -419,8 +469,68 @@ int main( int argc, char ** argv )
fd_set read_fd, write_fd;
init();
program_name=L"fishd";
wsetlocale( LC_ALL, L"" );
/*
Parse options
*/
while( 1 )
{
#ifdef HAVE_GETOPT_LONG
static struct option
long_options[] =
{
{
"help", no_argument, 0, 'h'
}
,
{
"version", no_argument, 0, 'v'
}
,
{
0, 0, 0, 0
}
}
;
int opt_index = 0;
int opt = getopt_long( argc,
argv,
"hv",
long_options,
&opt_index );
#else
int opt = getopt( argc,
argv,
"hv" );
#endif
if( opt == -1 )
break;
switch( opt )
{
case 0:
break;
case 'h':
print_help();
exit(0);
case 'v':
debug( 0, L"%ls, version %s\n", program_name, PACKAGE_VERSION );
exit( 0 );
case '?':
return 1;
}
}
init();
while(1)
{
connection_t *c;

View File

@@ -9,6 +9,7 @@
#include <signal.h>
#include "config.h"
#include "wutil.h"
#include "util.h"
#include "function.h"
#include "proc.h"
@@ -16,6 +17,8 @@
#include "common.h"
#include "intern.h"
#include "event.h"
#include "reader.h"
#include "parse_util.h"
/**
@@ -27,6 +30,8 @@ typedef struct
wchar_t *cmd;
/** Function description */
wchar_t *desc;
const wchar_t *definition_file;
int definition_offset;
int is_binding;
}
function_data_t;
@@ -61,6 +66,7 @@ void function_destroy()
hash_destroy( &function );
}
void function_add( const wchar_t *name,
const wchar_t *val,
const wchar_t *desc,
@@ -69,23 +75,26 @@ void function_add( const wchar_t *name,
{
int i;
wchar_t *cmd_end;
function_data_t *d;
if( function_exists( name ) )
function_remove( name );
function_remove( name );
function_data_t *d = malloc( sizeof( function_data_t ) );
d = malloc( sizeof( function_data_t ) );
d->definition_offset = parse_util_lineno( parser_get_buffer(), current_block->tok_pos );
d->cmd = wcsdup( val );
cmd_end = d->cmd + wcslen(d->cmd)-1;
while( (cmd_end>d->cmd) && wcschr( L"\n\r\t ", *cmd_end ) )
{
*cmd_end--=0;
*cmd_end-- = 0;
}
d->desc = desc?wcsdup( desc ):0;
d->is_binding = is_binding;
d->definition_file = intern(reader_current_filename());
hash_put( &function, intern(name), d );
for( i=0; i<al_get_count( events ); i++ )
{
event_add_handler( (event_t *)al_get( events, i ) );
@@ -102,20 +111,20 @@ void function_remove( const wchar_t *name )
{
void *key;
function_data_t *d;
event_t ev;
ev.type=EVENT_ANY;
ev.function_name=name;
event_remove( &ev );
hash_remove( &function,
name,
(const void **) &key,
(const void **)&d );
if( !d )
if( !key )
return;
ev.type=EVENT_ANY;
ev.function_name=name;
event_remove( &ev );
clear_function_entry( key, d );
}
@@ -135,7 +144,7 @@ const wchar_t *function_get_desc( const wchar_t *argv )
if( data == 0 )
return 0;
return data->desc?data->desc:data->cmd;
return data->desc;
}
void function_set_desc( const wchar_t *name, const wchar_t *desc )
@@ -171,3 +180,26 @@ void function_get_names( array_list_t *list, int get_hidden )
}
const wchar_t *function_get_definition_file( const wchar_t *argv )
{
function_data_t *data =
(function_data_t *)hash_get( &function, argv );
if( data == 0 )
return 0;
return data->definition_file;
}
int function_get_definition_offset( const wchar_t *argv )
{
function_data_t *data =
(function_data_t *)hash_get( &function, argv );
if( data == 0 )
return -1;
return data->definition_offset;
}

View File

@@ -69,4 +69,8 @@ int function_exists( const wchar_t *name );
void function_get_names( array_list_t *list,
int get_hidden );
const wchar_t *function_get_definition_file( const wchar_t *name );
int function_get_definition_offset( const wchar_t *name );
#endif

78
halloc.c Normal file
View File

@@ -0,0 +1,78 @@
/** \file halloc.c
A hierarchical memory allocation system. Works just like talloc
used in Samba, except that an arbitrary block allocated with
malloc() can be registered to be freed by halloc_free.
*/
#include "config.h"
#include <stdlib.h>
#include <unistd.h>
#include "util.h"
#include "common.h"
#include "halloc.h"
typedef struct halloc
{
array_list_t children;
array_list_t hchildren;
long long data[0];
}
halloc_t;
static halloc_t *halloc_from_data( void *data )
{
return (halloc_t *)(data - sizeof( halloc_t ) );
}
void *halloc( void *context, size_t size )
{
halloc_t *me, *parent;
me = (halloc_t *)calloc( 1, sizeof(halloc_t) + size );
if( !me )
return 0;
al_init( &me->children );
if( context )
{
parent = halloc_from_data( context );
al_push( &parent->hchildren, &me->data );
}
return &me->data;
}
void *halloc_register( void *context, void *data )
{
halloc_t *me;
if( !context )
return data;
me = halloc_from_data( context );
al_push( &me->children, data );
return data;
}
void halloc_free( void *context )
{
halloc_t *me;
if( !context )
return;
me = halloc_from_data( context );
al_foreach( &me->hchildren, (void (*)(const void *))&halloc_free );
al_foreach( &me->children, (void (*)(const void *))&free );
al_destroy( &me->children );
al_destroy( &me->hchildren );
free(me);
}

35
halloc.h Normal file
View File

@@ -0,0 +1,35 @@
/** \file halloc.h
A hierarchical memory allocation system. Works just like talloc
used in Samba, except that an arbitrary block allocated with
malloc() can be registered to be freed by halloc_free.
*/
/**
Allocate new memory using specified parent memory context. If \c
context is null, a new root context is created. Context _must_ be
either 0 or the result of a previous call to halloc.
If \c context is null, the resulting block must be freed with a
call to halloc_free().
If \c context is not null, the resulting memory block must never be
explicitly freed, it will be automatically freed whenever the
parent context is freed.
*/
void *halloc( void *context, size_t size );
/**
Free memory context and all children contexts. Only root contexts
may be freed explicitly.
*/
void halloc_free( void *context );
/**
Free the memory pointed to by \c data when the memory pointed to by
\c context is free:d. Note that this will _not_ turn the specified
memory area into a valid halloc context. Only memory areas created
using a call to halloc() can be used as a context.
*/
void *halloc_register( void *context, void *data );

View File

@@ -18,6 +18,7 @@
#include "tokenizer.h"
#include "proc.h"
#include "parser.h"
#include "parse_util.h"
#include "builtin.h"
#include "function.h"
#include "env.h"
@@ -365,11 +366,11 @@ void highlight_shell( wchar_t * buff,
while( 1 )
{
wchar_t *begin, *end;
if( expand_locate_subshell( subpos,
&begin,
&end,
1) <= 0)
if( parse_util_locate_cmdsubst( subpos,
(const wchar_t **)&begin,
(const wchar_t **)&end,
1) <= 0)
{
break;
}

View File

@@ -45,6 +45,8 @@ typedef struct
The last item loaded from file
*/
ll_node_t *last_loaded;
int is_loaded;
}
history_data;
@@ -82,25 +84,31 @@ static wchar_t *mode_name;
*/
static hash_table_t history_table;
/**
Flag, set to 1 once the history file has been loaded
*/
static int is_loaded;
/**
Load history from ~/.fish_history
Load history from file
*/
static void history_load( wchar_t *name )
static void history_load()
{
wchar_t *fn;
wchar_t *buff=0;
int buff_len=0;
FILE *in_stream;
hash_table_t used;
is_loaded = 1;
block();
hash_init2( &used,
&hash_wcs_func,
&hash_wcs_cmp,
4096 );
fn = wcsdupcat2( env_get(L"HOME"), L"/.", name, L"_history", 0 );
fn = wcsdupcat2( env_get(L"HOME"), L"/.", mode_name, L"_history", 0 );
in_stream = wfopen( fn, "r" );
@@ -111,7 +119,7 @@ static void history_load( wchar_t *name )
int buff_read = fgetws2( &buff, &buff_len, in_stream );
if( buff_read == -1 )
{
debug( 1, L"The following non-fatal error occurred while reading command history from \'%ls\':", name );
debug( 1, L"The following non-fatal error occurred while reading command history from \'%ls\':", mode_name );
wperror( L"fgetws2" );
fclose( in_stream );
free( fn );
@@ -161,7 +169,7 @@ static void history_load( wchar_t *name )
{
if( errno != ENOENT )
{
debug( 1, L"The following non-fatal error occurred while reading command history from \'%ls\':", name );
debug( 1, L"The following non-fatal error occurred while reading command history from \'%ls\':", mode_name );
wperror( L"fopen" );
}
@@ -198,6 +206,7 @@ static void history_to_hash()
d->last=history_last;
d->last_loaded=last_loaded;
d->count=history_count;
d->is_loaded = is_loaded;
hash_put( &history_table,
mode_name,
@@ -223,13 +232,14 @@ void history_set_mode( wchar_t *name )
history_current = history_last = curr->last;
last_loaded = curr->last_loaded;
history_count = curr->count;
is_loaded = curr->is_loaded;
}
else
{
history_count=0;
history_last = history_current = last_loaded=0;
mode_name = wcsdup( name );
history_load( name );
is_loaded = 0;
}
past_end=1;
@@ -259,6 +269,9 @@ static void history_save()
/* First we save this sessions history in local variables */
ll_node_t *real_pos = history_last, *real_first = last_loaded;
if( !is_loaded )
return;
if( !real_first )
{
real_first = history_current;
@@ -390,6 +403,9 @@ void history_destroy()
*/
static ll_node_t *history_find( ll_node_t *n, const wchar_t *s )
{
if( !is_loaded )
history_load();
if( n == 0 )
return 0;
@@ -406,6 +422,9 @@ void history_add( const wchar_t *str )
{
ll_node_t *old_node;
if( !is_loaded )
history_load();
if( wcslen( str ) == 0 )
return;
@@ -460,6 +479,9 @@ static int history_test( const wchar_t *needle, const wchar_t *haystack )
const wchar_t *history_prev_match( const wchar_t *str )
{
if( !is_loaded )
history_load();
if( history_current == 0 )
return str;
@@ -481,6 +503,9 @@ const wchar_t *history_prev_match( const wchar_t *str )
const wchar_t *history_next_match( const wchar_t *str)
{
if( !is_loaded )
history_load();
if( history_current == 0 )
return str;
@@ -507,15 +532,21 @@ void history_reset()
*/
void history_first()
{
while( history_current->prev )
history_current = history_current->prev;
if( is_loaded )
while( history_current->prev )
history_current = history_current->prev;
}
wchar_t *history_get( int idx )
{
ll_node_t *n=history_last;
ll_node_t *n;
int i;
if( !is_loaded )
history_load();
n = history_last;
if( idx<0)
{
debug( 1, L"Tried to access negative history index %d", idx );

View File

@@ -8,7 +8,8 @@
#include <wchar.h>
/**
Load history from file.
Init history library. The history file won't actually be loaded
until the first time a history search is performed.
*/
void history_init();

View File

@@ -2,7 +2,7 @@
complete -c apt-listchanges -l help -d (_ "Display help and exit")
complete -c apt-listchanges -l apt -d (_ "Read filenames from pipe")
complete -f -c apt-listchanges -s v -l verbose -d (_ "Verbose mode")
complete -f -c apt-listchanges -s f -l frontend -a "pager browser xterm-pager xterm-browser text mail none" -d (_ "Select fronend interface")
complete -f -c apt-listchanges -s f -l frontend -a "pager browser xterm-pager xterm-browser text mail none" -d (_ "Select frontend interface")
complete -r -f -c apt-listchanges -l email-address -d (_ "Specify email address")
complete -f -c apt-listchanges -s c -l confirm -d (_ "Ask confirmation")
complete -f -c apt-listchanges -s a -l all -d (_ "Display all changelogs")

View File

@@ -12,7 +12,7 @@ complete -f -c apt-move -a mirror -d (_ "Download package missing from mirror")
complete -f -c apt-move -a sync -d (_ "Sync packages installed")
complete -f -c apt-move -a exclude -d 'test $LOCALDIR/.exclude file'
complete -c apt-move -a movefile -d (_ "Move file specified on commandline")
complete -f -c apt-move -a listbin -d (_ "List packags that may serve as input to mirrorbin or mirrorsource" )
complete -f -c apt-move -a listbin -d (_ "List packages that may serve as input to mirrorbin or mirrorsource" )
complete -f -c apt-move -a mirrorbin -d (_ "Fetch package from STDIN")
complete -f -c apt-move -a mirrorsrc -d (_ "Fetch source package from STDIN")
complete -f -c apt-move -s a -d (_ "Process all packages")

View File

@@ -1,6 +1,6 @@
#apt-rdepends
complete -c apt-rdepends -l help -d (_ "Display help and exit")
complete -f -c apt-rdepends -s b -l build-depends -d (_ "Show bulid dependencies")
complete -f -c apt-rdepends -s b -l build-depends -d (_ "Show build dependencies")
complete -f -c apt-rdepends -s d -l dotty -d (_ "Generate a dotty graph")
complete -f -c apt-rdepends -s p -l print-state -d (_ "Show state of dependencies")
complete -f -c apt-rdepends -s r -l reverse -d (_ "List packages depending on")

View File

@@ -1,6 +1,6 @@
#apt-spy
complete -c apt-spy -s h -d (_ "Display help and exit")
complete -f -c apt-spy -s d -a "stable testing unstable" -d (_ "Debian distribtion")
complete -f -c apt-spy -s d -a "stable testing unstable" -d (_ "Debian distribution")
complete -f -c apt-spy -s a -a "Africa Asia Europe North-America Oceania South-America" -d (_ "Servers in the areas")
complete -c apt-spy -s c -d (_ "Conf file")
complete -f -c apt-spy -s e -d (_ "Finish after number of servers")

View File

@@ -11,3 +11,4 @@ complete -c complete -s d -l description -d (_ "Description of this completions"
complete -c complete -s u -l unauthorative -d (_ "Option list is not complete")
complete -c complete -s e -l erase -d (_ "Remove completion")
complete -c complete -s h -l help -d (_ "Display help and exit")
complete -c complete -s C -l do-complete -d (_ "Print all completions for the specified commandline")

View File

@@ -1,4 +1,4 @@
complete -c cut -s b -l bytes -x -d (_ "Ouput byte range")
complete -c cut -s b -l bytes -x -d (_ "Output byte range")
complete -c cut -s c -l characters -x -d (_ "Output character range")
complete -c cut -s d -l delimiter -x -d (_ "Select field delimiter")
complete -c cut -s d -l fields -x -d (_ "Select fields")

View File

@@ -39,7 +39,7 @@ complete -c cvs -x -s Q -d (_ "Cause CVS to be really quiet")
complete -c cvs -x -s q -d (_ "Cause CVS to be somewhat quiet")
complete -c cvs -x -s r -d (_ "Make checked-out files read-only")
complete -c cvs -x -s w -d (_ "Make checked-out files read-write (default)")
complete -c cvs -x -s n -d (_ "Do not execute anything that will change the disk")
complete -c cvs -x -s n -d (_ "Do not change any files")
complete -c cvs -x -s t -d (_ "Show trace of program execution -- try with -n")
complete -c cvs -x -s v -d (_ "Display version and exit")
complete -c cvs -x -s T -r -d (_ "Use "tmpdir" for temporary files")

View File

@@ -62,19 +62,19 @@ complete -c darcs -s h -l help -d (_ "Shows brief description of command and its
complete -c darcs -l disable -d (_ "Disable this command")
complete -c darcs -l repodir -d (_ "Specify the repository directory in which to run") -x -a '(__fish_complete_directory (commandline -ct))'
complete -c darcs -s v -l verbose -d (_ "Verbose mode")
complete -c darcs -l standard-verbosity -d (_ "Neither verbose nor quiet output")
#
# Here follows a huge list of subcommand-specific completions
# Here follows a huge list of subcommand-specific completions. These are incomplete.
#
set -- record_opt -c darcs -n 'contains record (commandline -poc)'
set -l record_opt -c darcs -n 'contains record (commandline -poc)'
complete $record_opt -s m -l patch-name -d (_ "Name of patch") -x
complete $record_opt -s A -l author -d (_ "Specify author id") -x
complete $record_opt -l logfile -d (_ "Give patch name and comment in file") -r
complete $record_opt -s a -l all -d (_ "Answer yes to all patches")
complete $record_opt -s l -l look-for-adds -d (_ "In addition to modifications, look for files that are not boring, and thus are potentially pending addition")
complete $record_opt -l delete-logfile -d (_ "Delete the logfile when done")
complete $record_opt -l standard-verbosity -d (_ "Don't give verbose output")
complete $record_opt -l no-test -d (_ "Don't run the test script")
complete $record_opt -l test -d (_ "Run the test script")
complete $record_opt -l leave-test-directory -d (_ "Don't remove the test directory")
@@ -90,10 +90,9 @@ complete $record_opt -l skip-long-comment -d (_ "Don't give a long comment")
complete $record_opt -l prompt-long-comment -d (_ "Prompt for whether to edit the long comment")
complete $record_opt -l ignore-times -d (_ "Don't trust the file modification times")
complete $record_opt -l dont-look-for-adds -d (_ "Don't look for any files or directories that could be added, and don't add them automatically")
set -e record_opt
set -- pull_opt -c darcs -n 'contains pull (commandline -poc)'
set -l pull_opt -c darcs -n 'contains pull (commandline -poc)'
complete $pull_opt -s p -l patches -d (_ "Select patches matching REGEXP") -x
complete $pull_opt -s t -l tags -d (_ "Select tags matching REGEXP") -x
complete $pull_opt -s a -l all -d (_ "Answer yes to all patches")
@@ -108,26 +107,23 @@ complete $pull_opt -l test -d (_ "Run the test script")
complete $pull_opt -l no-test -d (_ "Don't run the test script")
complete $pull_opt -l dry-run -d (_ "Don't actually take the action")
complete $pull_opt -l no-summary -d (_ "Don't summarize changes")
complete $pull_opt -l standard-verbosity -d (_ "Neither verbose nor quiet output")
complete $pull_opt -l ignore-times -d (_ "Don't trust the file modification times")
complete $pull_opt -l no-deps -d (_ "Don't automatically fulfill dependencies")
complete $pull_opt -l set-default -d (_ "Set default repository [DEFAULT]")
complete $pull_opt -l no-set-default -d (_ "Don't set default repository")
complete $pull_opt -l set-scripts-executable -d (_ "Make scripts executable")
complete $pull_opt -l dont-set-scripts-executable -d (_ "Don't make scripts executable")
set -e pull_opt
set -- apply_opt -c darcs -n 'contains apply (commandline -poc)'
set -l apply_opt -c darcs -n 'contains apply (commandline -poc)'
complete $apply_opt -s a -l all -d (_ "Answer yes to all patches")
complete $apply_opt -l verify -d (_ "Verify that the patch was signed by a key in PUBRING") -r
complete $apply_opt -l verify-ssl -d (_ "Verify using openSSL with authorized keys from file 'KEYS'") -r
complete $apply_opt -l verify-ssl -d (_ "Verify using openSSL with authorized keys from specified file") -r
complete $apply_opt -l sendmail-command -d (_ "Specify sendmail command") -r
complete $apply_opt -l reply -d (_ "Reply to email-based patch using FROM address") -x
complete $apply_opt -l cc -d (_ "Mail results to additional EMAIL(s). Requires --reply") -x
complete $apply_opt -l external-merge -d (_ "Use external tool to merge conflicts") -r
complete $apply_opt -l no-verify -d (_ "Don't verify patch signature")
complete $apply_opt -l standard-verbosity -d (_ "Don't give verbose output")
complete $apply_opt -l ignore-times -d (_ "Don't trust the file modification times")
complete $apply_opt -l compress -d (_ "Create compressed patches")
complete $apply_opt -l dont-compress -d (_ "Don't create compressed patches")
@@ -142,27 +138,25 @@ complete $apply_opt -l leave-test-directory -d (_ "Don't remove the test directo
complete $apply_opt -l remove-test-directory -d (_ "Remove the test directory")
complete $apply_opt -l set-scripts-executable -d (_ "Make scripts executable")
complete $apply_opt -l dont-set-scripts-executable -d (_ "Don't make scripts executable")
set -e apply_opt
set -- check_opt -c darcs -n 'contains check (commandline -poc)'
set -l check_opt -c darcs -n 'contains check (commandline -poc)'
complete $check_opt -s v -l verbose -d (_ "Verbose mode")
complete $check_opt -s q -l quiet -d (_ "Suppress informational output")
complete $check_opt -l complete -d (_ "Check the entire repository")
complete $check_opt -l partial -d (_ "Check patches since latest checkpoint")
complete $check_opt -l standard-verbosity -d (_ "Neither verbose nor quiet output")
complete $check_opt -l no-test -d (_ "Don't run the test script")
complete $check_opt -l test -d (_ "Run the test script")
complete $check_opt -l leave-test-directory -d (_ "Don't remove the test directory")
complete $check_opt -l remove-test-directory -d (_ "Remove the test directory")
set -e check_opt
set -- mv_opt -c darcs -n 'contains mv (commandline -poc)'
set -l mv_opt -c darcs -n 'contains mv (commandline -poc)'
complete $mv_opt -s v -l verbose -d (_ "Verbose mode")
complete $mv_opt -l case-ok -d (_ "Don't refuse to add files differing only in case")
complete $mv_opt -l standard-verbosity -d (_ "Don't give verbose output")
set -e mv_opt
set -- send_opt -c darcs -n 'contains send (commandline -poc)'
set -l send_opt -c darcs -n 'contains send (commandline -poc)'
complete $send_opt -s v -l verbose -d (_ "Verbose mode")
complete $send_opt -s q -l quiet -d (_ "Suppress informational output")
complete $send_opt -xs p -l patches -d (_ "Select patches matching REGEXP")
@@ -172,7 +166,6 @@ complete $send_opt -xs A -l author -d (_ "Specify author id")
complete $send_opt -rs o -l output -d (_ "Specify output filename")
complete $send_opt -s u -l unified -d (_ "Output patch in a darcs-specific format similar to diff -u")
complete $send_opt -s s -l summary -d (_ "Summarize changes")
complete $send_opt -l standard-verbosity -d (_ "Neither verbose nor quiet output")
complete $send_opt -xl matches -d (_ "Select patches matching PATTERN")
complete $send_opt -l interactive -d (_ "Prompt user interactively")
complete $send_opt -xl from -d (_ "Specify email address")
@@ -189,10 +182,55 @@ complete $send_opt -l edit-description -d (_ "Edit the patch bundle description"
complete $send_opt -l set-default -d (_ "Set default repository [DEFAULT]")
complete $send_opt -l no-set-default -d (_ "Don't set default repository")
complete $send_opt -rl sendmail-command -d (_ "Specify sendmail command")
set -e send_opt
set -- init_opt -c darcs -n 'contains initialize (commandline -poc)'
set -l init_opt -c darcs -n 'contains initialize (commandline -poc)'
complete $init_opt -l plain-pristine-tree -d (_ "Use a plain pristine tree [DEFAULT]")
complete $init_opt -l no-pristine-tree -d (_ "Use no pristine tree")
set -e init_opt
set -l annotate_opt -c darcs -n 'contains annotate (commandline -poc)'
complete $annotate_opt -s s -l summary -d (_ "Summarize changes")
complete $annotate_opt -l no-summary -d (_ "Don't summarize changes")
complete $annotate_opt -s u -l unified -d (_ "Output patch in a darcs-specific format similar to diff -u")
complete $annotate_opt -l human-readable -d (_ "Give human readable output")
complete $annotate_opt -l xml-output -d (_ "Generate XML formatted output")
complete $annotate_opt -l match -x -d (_ "Select patch matching PATTERN")
complete $annotate_opt -s p -l patch -x -d (_ "Select patch matching REGEXP")
complete $annotate_opt -s t -l tag -x -d (_ "Select tag matching REGEXP")
complete $annotate_opt -l creator-hash -x -d (_ "Specify hash of creator patch (see docs)")
set -l changes_opt -c darcs -n 'contains changes (commandline -poc)'
complete $changes_opt -l to-match -x -d (_ "Select changes up to a patch matching PATTERN")
complete $changes_opt -l to-patch -x -d (_ "Select changes up to a patch matching REGEXP")
complete $changes_opt -l to-tag -x -d (_ "Select changes up to a tag matching REGEXP")
complete $changes_opt -l from-match -x -d (_ "Select changes starting with a patch matching PATTERN")
complete $changes_opt -l from-patch -x -d (_ "Select changes starting with a patch matching REGEXP")
complete $changes_opt -l from-tag -x -d (_ "Select changes starting with a tag matching REGEXP")
complete $changes_opt -l last -x -d (_ "Select the last NUMBER patches")
complete $changes_opt -l matches -x -d (_ "Select patches matching PATTERN")
complete $changes_opt -s p -l patches -x -d (_ "Select patches matching REGEXP")
complete $changes_opt -s t -l tags -x -d (_ "Select tags matching REGEXP")
complete $changes_opt -l context -d (_ "Give output suitable for get --context")
complete $changes_opt -l xml-output -d (_ "Generate XML formatted output")
complete $changes_opt -l human-readable -d (_ "Give human-readable output")
complete $changes_opt -s s -l summary -d (_ "Summarize changes")
complete $changes_opt -l no-summary -d (_ "Don't summarize changes")
complete $changes_opt -s q -l quiet -d (_ "Suppress informational output")
complete $changes_opt -l reverse -d (_ "Show changes in reverse order")
complete $changes_opt -l repo -x -d (_ "Specify the repository URL")
set -l add_opt -c darcs -n 'contains add (commandline -poc)'
complete $add_opt -l boring -d (_ "Don't skip boring files")
complete $add_opt -l case-ok -d (_ "Don't refuse to add files differing only in case")
complete $add_opt -s r -l recursive -d (_ "Add contents of subdirectories")
complete $add_opt -l not-recursive -d (_ "Don't add contents of subdirectories")
complete $add_opt -l date-trick -d (_ "Add files with date appended to avoid conflict. [EXPERIMENTAL]")
complete $add_opt -l no-date-trick -d (_ "Don't use experimental date appending trick. [DEFAULT]")
complete $add_opt -s q -l quiet -d (_ "Suppress informational output")
complete $add_opt -l dry-run -d (_ "Don't actually take the action")
complete $add_opt -s q -l quiet -d (_ "Suppress informational output")

View File

@@ -0,0 +1,68 @@
#Completions for emerge
function __fish_emerge_use_package -d (_ 'Test if emerge command should have packages as potential completion')
for i in (commandline -opc)
if contains -- $i -a --ask -p --pretend --oneshot -O --nodeps -f --fetchonly
return 0
end
end
return 1
end
function __fish_emerge_manipulate_package -d (_ 'Tests if emerge command should have package as potential completion for removal')
for i in (commandline -opc)
if contains -- $i -u --update -C --unmerge -P --prune
return 0
end
end
return 1
end
function __fish_emerge_print_installed_pkgs -d (_ 'Prints completions for installed packages on the system from /var/db/pkg')
if test -d /var/db/pkg
find /var/db/pkg/ -type d | cut -d'/' -f6 | sort | uniq | sed 's/-[0-9]\{1,\}\..*$//'
return
end
end
complete -f -c emerge -n '__fish_emerge_use_package' -a '(__fish_print_packages)' -d (_ 'Package')
complete -f -c emerge -n '__fish_emerge_manipulate_package' -a '(__fish_emerge_print_installed_pkgs)' -d (_ 'Package')
complete -c emerge -s h -l help -d (_ "Display help and exit")
complete -c emerge -s c -l clean -d (_ "Cleans the system by removing outdated packages")
complete -c emerge -l depclean -d (_ "Cleans the system by removing packages that are not associated with explicitly merged packages")
complete -c emerge -l info -d (_ "Displays important portage variables that will be exported to ebuild.sh when performing merges")
complete -c emerge -l metadata -d (_ "Causes portage to process all the metacache files as is normally done on the tail end of an rsync update using emerge --sync")
complete -c emerge -s P -l prune -d (_ "Removes all but the most recently installed version of a package from your system")
complete -c emerge -l regen -d (_ "Causes portage to check and update the dependency cache of all ebuilds in the portage tree")
complete -c emerge -s s -l search -d (_ "Searches for matches of the supplied string in the current local portage tree")
complete -c emerge -s C -l unmerge -d (_ "Removes all matching packages completely from your system")
complete -c emerge -s a -l ask -d (_ "Before performing the merge, display what ebuilds and tbz2s will be installed, in the same format as when using --pretend")
complete -c emerge -s b -l buildpkg -d (_ "Tell emerge to build binary packages for all ebuilds processed in addition to actually merging the packages")
complete -c emerge -s B -l buildpkgonly -d (_ "Creates a binary package, but does not merge it to the system")
complete -c emerge -s l -l changelog -d (_ "When pretending, also display the ChangeLog entries for packages that will be upgraded")
complete -c emerge -l columns -d (_ "Display the pretend output in a tabular form")
complete -c emerge -s d -l debug -d (_ "Tell emerge to run the ebuild command in --debug mode")
complete -c emerge -s D -l deep -d (_ "When used in conjunction with --update, this flag forces emerge to consider the entire dependency tree of packages, instead of checking only the immediate dependencies of the packages")
complete -c emerge -s e -l emptytree -d (_ "Virtually tweaks the tree of installed packages to contain nothing")
complete -c emerge -s f -l fetchonly -d (_ "Instead of doing any package building, just perform fetches for all packages (main package as well as all dependencies)")
complete -c emerge -l fetch-all-uri -d (_ "Same as --fetchonly except that all package files, including those not required to build the package, will be processed")
complete -c emerge -s g -l getbinpkg -d (_ "Using the server and location defined in PORTAGE_BINHOST, portage will download the information from each binary file there and it will use that information to help build the dependency list")
complete -c emerge -s G -l getbinpkgonly -d (_ "This option is identical to -g, except it will not use ANY information from the local machine")
complete -c emerge -s N -l newuse -d (_ "Tells emerge to include installed packages where USE flags have changed since installation")
complete -c emerge -l noconfmem -d (_ "Merge files in CONFIG_PROTECT to the live fs instead of silently dropping them")
complete -c emerge -s O -l nodeps -d (_ "Merge specified packages, but don't merge any dependencies")
complete -c emerge -s n -l noreplace -d (_ "Skip the packages specified on the command-line that have already been installed")
complete -c emerge -l nospinner -d (_ "Disables the spinner regardless of terminal type")
complete -c emerge -l oneshot -d (_ "Emerge as normal, but don't add packages to the world profile")
complete -c emerge -s o -l onlydeps -d (_ "Only merge (or pretend to merge) the dependencies of the specified packages, not the packages themselves")
complete -c emerge -s p -l pretend -d (_ "Do not merge, display what ebuilds and tbz2s would have been installed")
complete -c emerge -s q -l quiet -d (_ "Reduced output from portage's displays")
complete -c emerge -l resume -d (_ "Resumes the last merge operation")
complete -c emerge -s S -l searchdesc -d (_ "Matches the search string against the description field as well the package's name")
complete -c emerge -l skipfirst -d (_ "Remove the first package in the resume list so that a merge may continue in the presence of an uncorrectable or inconsequential error")
complete -c emerge -s t -l tree -d (_ "Shows the dependency tree using indentation for dependencies")
complete -c emerge -s u -l update -d (_ "Updates packages to the best version available")
complete -c emerge -s k -l usepkg -d (_ "Tell emerge to use binary packages (from $PKGDIR) if they are available, thus possibly avoiding some time-consuming compiles")
complete -c emerge -s K -l usepkgonly -d (_ "Like --usepkg, except this only allows the use of binary packages, and it will abort the emerge if the package is not available at the time of dependency calculation")
complete -c emerge -s v -l verbose -d (_ "Increased or expanded display of content in portage's displays")
complete -c emerge -s V -l version -d (_ "Displays the currently installed version of portage along with other information useful for quick reference on a system")

View File

@@ -2,4 +2,5 @@ complete -c fish -s c -l "command" -d (_ "Run fish with this command")
complete -c fish -s h -l help -d (_ "Display help and exit")
complete -c fish -s v -l version -d (_ "Display version and exit")
complete -c fish -s i -l interactive -d (_ "Run in interactive mode")
complete -c fish -s l -l login -d (_ "Run in login mode")
complete -c fish -s p -l profile -d (_ "Output profiling information to specified file") -f

View File

@@ -5,3 +5,4 @@ complete -c function -s j -l on-job-exit -d (_ "Make the function a job exit eve
complete -c function -s p -l on-process-exit -d (_ "Make the function a process exit event handler") -x
complete -c function -s s -l on-signal -d (_ "Make the function a signal event handler") -x
complete -c function -s v -l on-variable -d (_ "Make the function a variable update event handler") -x
complete -c function -s b -l key-binding -d (_ "Allow dash (-) in function name")

View File

@@ -0,0 +1,17 @@
#
# Completions for fusermount
#
# Find mount points, borrowed from umount.fish
#
complete -c fusermount -d (_ "Mount point") -x -a '
(
cat /etc/mtab | grep "^sshfs" | cut -d " " -f 1-2|tr " " \n|sed -e "s/[0-9\.]*:\//\//"|grep "^/"
)
'
complete -c fusermount -s h -d (_ "Display help and exit")
complete -c fusermount -s v -d (_ "Display version and exit")
complete -c fusermount -s o -x -d (_ "Mount options")
complete -c fusermount -s u -d (_ "Unmount")
complete -c fusermount -s q -d (_ "Quiet")
complete -c fusermount -s z -d (_ "Lazy unmount")

View File

@@ -23,7 +23,7 @@ complete -c gcc -s x -d (_ "Language") -x -a '
complete -c gcc -o pass-exit-codes -d (_ "Pass program exit codes")
complete -c gcc -s c -d (_ "Stop after assembler")
complete -c gcc -s S -d (_ "Stop after compile")
complete -c gcc -s E -d (_ "Stop after preprocesswor")
complete -c gcc -s E -d (_ "Stop after preprocessor")
complete -c gcc -s o -r -d (_ "Output file")
complete -c gcc -s v -d (_ "Print commands to stderr")
complete -c gcc -o \#\#\# -d (_ "Print quoted commands to stderr, do not run")

View File

@@ -270,7 +270,7 @@ complete -c gpg -l allow-freeform-uid -d (_ "Disable all checks on the form of t
complete -c gpg -l ignore-time-conflict -d (_ "Do not fail if signature is older than key")
complete -c gpg -l ignore-valid-from -d (_ "Allow subkeys that have a timestamp from the future")
complete -c gpg -l ignore-crc-error -d (_ "Ignore CRC errors")
complete -c gpg -l ignore-mdc-error -d (_ "Do not fail on MDC integrity protection failiure")
complete -c gpg -l ignore-mdc-error -d (_ "Do not fail on MDC integrity protection failure")
complete -c gpg -l lock-once -d (_ "Lock the databases the first time a lock is requested and do not release the lock until the process terminates")
complete -c gpg -l lock-multiple -d (_ "Release the locks every time a lock is no longer needed")

View File

@@ -15,7 +15,7 @@ complete -c gprof -l function-ordering -d (_ "Suggest function ordering")
complete -rc gprof -l file-ordering -d (_ "Suggest file ordering")
complete -c gprof -s T -l traditional -d (_ "Traditional mode")
complete -xc gprof -s w -l width -d (_ "Set width of output")
complete -c gprof -s x -l all-lines -d (_ "Anotate every line")
complete -c gprof -s x -l all-lines -d (_ "Annotate every line")
complete -xc gprof -l demangle -d (_ "Set demangling style")
complete -c gprof -l no-demangle -d (_ "Turn of demangling")
complete -xc gprof -s a -l no-static -d (_ "Supress static functions")

View File

@@ -32,5 +32,5 @@ complete -c help -x -a expand-variable -d (_ "Help on variable expansion \$VARNA
complete -c help -x -a expand-home -d (_ "Help on home directory expansion ~USER")
complete -c help -x -a expand-brace -d (_ "Help on brace expansion {a,b,c}")
complete -c help -x -a expand-wildcard -d (_ "Help on wildcard expansion *.*")
complete -c help -x -a expand-command-substitution -d (_ "Help on command substututions (SUBCOMMAND)")
complete -c help -x -a expand-command-substitution -d (_ "Help on command substitution (SUBCOMMAND)")
complete -c help -x -a expand-process -d (_ "Help on process expansion %JOB")

View File

@@ -7,7 +7,7 @@ if kill -L ^/dev/null >/dev/null
complete -c kill -s L -d "List codes and names of available signals"
set -- signals (kill -L | sed -e 's/\([0-9][0-9]*\) *([A-Z,0-9][A-Z,0-9]*\)/\1 \2\n/g;s/ +/ /g' | sed -e 's/^ //' | grep -E '^[^ ]+')
set -- signals (kill -L | sed -e 's/\([0-9][0-9]*\) *\([A-Z,0-9][A-Z,0-9]*\)/\1 \2\n/g;s/ +/ /g' | sed -e 's/^ //' | grep -E '^[^ ]+')
for i in $signals
set -- number (echo $i | cut -d " " -f 1)
set -- name (echo $i | cut -d " " -f 2)

View File

@@ -24,7 +24,7 @@ complete -c less -s n -l line-numbers -d (_ "Display line number")
complete -c less -s N -l LINE-NUMBERS -d (_ "Display line number for each line")
complete -c less -s o -l log-file -d (_ "Log input to file") -r
complete -c less -s O -l LOG-FILE -d (_ "Log to file, overwrite") -r
complete -c less -s p -l pattern -d (_ "Start at first occorance of pattern") -r
complete -c less -s p -l pattern -d (_ "Start at first occurrence of pattern") -r
complete -c less -s P -l prompt -d (_ "Prompt string") -r
complete -c less -s q -l quiet -d (_ "Silent mode")
complete -c less -l silent -d (_ "Silent mode")

View File

@@ -7,100 +7,99 @@
set -l is_gnu
ls --version >/dev/null ^/dev/null; and set is_gnu --is-gnu
for i in ls ll la
set -l cmds -c ls -c ll -c la
# Shared ls switches
# Shared ls switches
__fish_gnu_complete -c $i -s a -l all -d (_ "Show hidden") $is_gnu
__fish_gnu_complete -c $i -s A -l almost-all -d (_ "Show hidden except . and ..") $is_gnu
__fish_gnu_complete -c $i -s F -l classify -d (_ "Append filetype indicator") $is_gnu
__fish_gnu_complete -c $i -s H -l dereference-command-line -d (_ "Follow symlinks") $is_gnu
__fish_gnu_complete -c $i -s L -l dereference -d (_ "Follow symlinks") $is_gnu
__fish_gnu_complete -c $i -s R -l recursive -d (_ "List subdirectory recursively") $is_gnu
__fish_gnu_complete -c $i -s b -l escape -d (_ "Octal escapes for non graphic characters") $is_gnu
__fish_gnu_complete -c $i -s d -l directory -d (_ "List directories, not their content") $is_gnu
__fish_gnu_complete -c $i -s h -l human-readable -d (_ "Human readable sizes") $is_gnu
__fish_gnu_complete -c $i -s i -l inode -d (_ "Print inode number of files") $is_gnu
__fish_gnu_complete -c $i -s n -l numeric-uid-gid -d (_ "Long format, numeric IDs") $is_gnu
__fish_gnu_complete -c $i -s p -l file-type -d (_ "Append filetype indicator") $is_gnu
__fish_gnu_complete -c $i -s q -l hide-control-chars -d (_ "Replace non-graphic characters with '?'") $is_gnu
__fish_gnu_complete -c $i -s r -l reverse -d (_ "Reverse sort order") $is_gnu
__fish_gnu_complete -c $i -s s -l size -d (_ "Print size of files") $is_gnu
__fish_gnu_complete $cmds -s a -l all -d (_ "Show hidden") $is_gnu
__fish_gnu_complete $cmds -s A -l almost-all -d (_ "Show hidden except . and ..") $is_gnu
__fish_gnu_complete $cmds -s F -l classify -d (_ "Append filetype indicator") $is_gnu
__fish_gnu_complete $cmds -s H -l dereference-command-line -d (_ "Follow symlinks") $is_gnu
__fish_gnu_complete $cmds -s L -l dereference -d (_ "Follow symlinks") $is_gnu
__fish_gnu_complete $cmds -s R -l recursive -d (_ "List subdirectory recursively") $is_gnu
__fish_gnu_complete $cmds -s b -l escape -d (_ "Octal escapes for non graphic characters") $is_gnu
__fish_gnu_complete $cmds -s d -l directory -d (_ "List directories, not their content") $is_gnu
__fish_gnu_complete $cmds -s h -l human-readable -d (_ "Human readable sizes") $is_gnu
__fish_gnu_complete $cmds -s i -l inode -d (_ "Print inode number of files") $is_gnu
__fish_gnu_complete $cmds -s n -l numeric-uid-gid -d (_ "Long format, numeric IDs") $is_gnu
__fish_gnu_complete $cmds -s p -l file-type -d (_ "Append filetype indicator") $is_gnu
__fish_gnu_complete $cmds -s q -l hide-control-chars -d (_ "Replace non-graphic characters with '?'") $is_gnu
__fish_gnu_complete $cmds -s r -l reverse -d (_ "Reverse sort order") $is_gnu
__fish_gnu_complete $cmds -s s -l size -d (_ "Print size of files") $is_gnu
complete -c $i -s C -d (_ "List by columns")
complete -c $i -s S -d (_ "Sort by size")
complete -c $i -s c -d (_ "Show and sort by ctime")
complete -c $i -s f -d (_ "Don't sort")
complete -c $i -s g -d (_ "Long format without owner")
complete -c $i -s k -d (_ "Set blocksize to 1kB")
complete -c $i -s l -d (_ "Long format")
complete -c $i -s m -d (_ "Comma separated format")
complete -c $i -s t -d (_ "Sort by modification time")
complete -c $i -s u -d (_ "Show access time")
complete -c $i -s x -d (_ "List entries by lines")
complete -c $i -s 1 -d (_ "List one file per line")
complete $cmds -s C -d (_ "List by columns")
complete $cmds -s S -d (_ "Sort by size")
complete $cmds -s c -d (_ "Show and sort by ctime")
complete $cmds -s f -d (_ "Don't sort")
complete $cmds -s g -d (_ "Long format without owner")
complete $cmds -s k -d (_ "Set blocksize to 1kB")
complete $cmds -s l -d (_ "Long format")
complete $cmds -s m -d (_ "Comma separated format")
complete $cmds -s t -d (_ "Sort by modification time")
complete $cmds -s u -d (_ "Show access time")
complete $cmds -s x -d (_ "List entries by lines")
complete $cmds -s 1 -d (_ "List one file per line")
if test -n "$is_gnu"
if test -n "$is_gnu"
# GNU specific features
# GNU specific features
complete -c $i -l author -d (_ "Print author")
complete -c $i -l blocksize -x -d (_ "Set block size")
complete -c $i -s B -l ignore-backups -d (_ "Ignore files ending with ~")
complete -c $i -l color -f -a "never always auto" -d (_ "Use colors")
complete -c $i -s D -l dired -d (_ "Generate dired output")
complete -c $i -l format -x -a "across commas horizontal long single-column verbose vertical" -d (_ "List format")
complete -c $i -l full-time -d (_ "Long format, full-iso time")
complete -c $i -s G -l no-group -d (_ "Don't print group information")
complete -c $i -l si -d (_ "Human readable sizes, powers of 1000")
complete -c $i -l dereference-command-line-symlink-to-dir #-d (_ "Follow directory symlinks from command line")
complete -c $i -l indicator-style -x -a "none classify file-type" -d (_ "Append filetype indicator")
complete -c $i -s I -l ignore -r -d (_ "Skip entries matching pattern")
complete -c $i -s N -l literal -d (_ "Print raw entry names")
complete -c $i -s o -d (_ "Long format without groups")
complete -c $i -l show-control-chars -d (_ "Non graphic as-is")
complete -c $i -s Q -l quote-name -d (_ "Enclose entry in quotes")
complete -c $i -l quoting-style -x -a "literal locale shell shell-always c escape" -d (_ "Select quoting style")
complete -c $i -l sort -x -d (_ "Sort criteria") -a "
extension\t'Sort by file extension'
none\tDon't\ sort
size\t'Sort by size'
time\t'Sort by modification time'
version\t'Sort by version'
status\t'Sort by file status modification time'
atime\t'Sort by access time'
access\t'Sort by access time'
use\t'Sort by access time'
"
complete -c $i -l time -x -d (_ "Show time type") -a "
time\t'Sort by modification time'
access\t'Sort by access time'
use\t'Sort by use time'
ctime\t'Sort by file status modification time'
status\t'Sort by status time'
"
complete -c $i -l time-style -x -a "full-iso long-iso iso locale" -d (_ "Select time style")
complete -c $i -s T -l tabsize -x -a "1 2 3 4 5 6 7 8 9 10 11 12" -d (_ "Assume tab stops at each COLS")
complete -c $i -s U -d (_ "Do not sort")
complete -c $i -s v -d (_ "Sort by version")
complete -c $i -s w -l width -x -d (_ "Assume screen width")
complete -c $i -s X -d (_ "Sort by extension")
complete -c $i -l help -d (_ "Display help and exit")
complete -c $i -l version -d (_ "Display version and exit")
complete $cmds -l author -d (_ "Print author")
complete $cmds -l blocksize -x -d (_ "Set block size")
complete $cmds -s B -l ignore-backups -d (_ "Ignore files ending with ~")
complete $cmds -l color -f -a "never always auto" -d (_ "Use colors")
complete $cmds -s D -l dired -d (_ "Generate dired output")
complete $cmds -l format -x -a "across commas horizontal long single-column verbose vertical" -d (_ "List format")
complete $cmds -l full-time -d (_ "Long format, full-iso time")
complete $cmds -s G -l no-group -d (_ "Don't print group information")
complete $cmds -l si -d (_ "Human readable sizes, powers of 1000")
complete $cmds -l dereference-command-line-symlink-to-dir #-d (_ "Follow directory symlinks from command line")
complete $cmds -l indicator-style -x -a "none classify file-type" -d (_ "Append filetype indicator")
complete $cmds -s I -l ignore -r -d (_ "Skip entries matching pattern")
complete $cmds -s N -l literal -d (_ "Print raw entry names")
complete $cmds -s o -d (_ "Long format without groups")
complete $cmds -l show-control-chars -d (_ "Non graphic as-is")
complete $cmds -s Q -l quote-name -d (_ "Enclose entry in quotes")
complete $cmds -l quoting-style -x -a "literal locale shell shell-always c escape" -d (_ "Select quoting style")
complete $cmds -l sort -x -d (_ "Sort criteria") -a "
extension\t'Sort by file extension'
none\tDon't\ sort
size\t'Sort by size'
time\t'Sort by modification time'
version\t'Sort by version'
status\t'Sort by file status modification time'
atime\t'Sort by access time'
access\t'Sort by access time'
use\t'Sort by access time'
"
complete $cmds -l time -x -d (_ "Show time type") -a "
time\t'Sort by modification time'
access\t'Sort by access time'
use\t'Sort by use time'
ctime\t'Sort by file status modification time'
status\t'Sort by status time'
"
complete $cmds -l time-style -x -a "full-iso long-iso iso locale" -d (_ "Select time style")
complete $cmds -s T -l tabsize -x -a "1 2 3 4 5 6 7 8 9 10 11 12" -d (_ "Assume tab stops at each COLS")
complete $cmds -s U -d (_ "Do not sort")
complete $cmds -s v -d (_ "Sort by version")
complete $cmds -s w -l width -x -d (_ "Assume screen width")
complete $cmds -s X -d (_ "Sort by extension")
complete $cmds -l help -d (_ "Display help and exit")
complete $cmds -l version -d (_ "Display version and exit")
else
else
# If not a GNU system, assume we have standard BSD ls features instead
# If not a GNU system, assume we have standard BSD ls features instead
complete -c $i -s B -d (_ "Octal escapes for non graphic characters")
complete -c $i -s G -d (_ "Use colors")
complete -c $i -s I -d (_ "Prevent -A from being automatically set for root")
complete -c $i -s P -d (_ "Don't follow symlinks")
complete -c $i -s T -d (_ "Show modification time")
complete -c $i -s W -d (_ "Show whiteouts when scanning directories")
complete -c $i -s Z -d (_ "Display each file's MAC label")
complete -c $i -s o -d (_ "Include the file flags in a long (-l) output")
complete -c $i -s w -d (_ "Print raw entry names")
complete $cmds -s B -d (_ "Octal escapes for non graphic characters")
complete $cmds -s G -d (_ "Use colors")
complete $cmds -s I -d (_ "Prevent -A from being automatically set for root")
complete $cmds -s P -d (_ "Don't follow symlinks")
complete $cmds -s T -d (_ "Show modification time")
complete $cmds -s W -d (_ "Show whiteouts when scanning directories")
complete $cmds -s Z -d (_ "Display each file's MAC label")
complete $cmds -s o -d (_ "Include the file flags in a long (-l) output")
complete $cmds -s w -d (_ "Print raw entry names")
end
end

View File

@@ -48,7 +48,7 @@ complete -c mplayer -o idx -d (_ "Build index if unavailable")
complete -c mplayer -o loadidx -d (_ "Load index from file") -r
complete -c mplayer -o ni -d (_ "Force non-interleaved AVI parser")
complete -c mplayer -o saveidx -d (_ "Rebuild index and save to file") -r
complete -c mplayer -o ss -d (_ "Seek to give time position") -x
complete -c mplayer -o ss -d (_ "Seek to given time position") -x
complete -c mplayer -o tv -d (_ "TV capture mode")
complete -c mplayer -o slang -d (_ "Subtitle language") -x -a $mplayer_lang
complete -c mplayer -o sub -d (_ "Subtitle file") -r

View File

@@ -10,7 +10,7 @@ complete -c pine -s o -d (_ "Open folder read-only")
complete -c pine -s p -d (_ "Set configuration file") -r
complete -c pine -s P -d (_ "Set global configuration file")
complete -c pine -s r -d (_ "Restricted mode")
complete -c pine -s z -d (_ "Enable suspention support")
complete -c pine -s z -d (_ "Enable suspension support")
complete -c pine -o conf -d (_ "Produce a sample global configuration file")
complete -c pine -o pinerc -d (_ "Produce sample configuration file") -r
complete -c pine -o sort -d (_ "Set mail sort order") -a "

View File

@@ -124,7 +124,7 @@ complete $rpm_mode -s i -l install -d (_ 'Install new package')
complete $rpm_mode -s U -l upgrade -d (_ 'Upgrade existing package')
complete $rpm_mode -s F -l freshen -d (_ 'Upgrade package if already installed')
complete $rpm_mode -s q -l query -d (_ 'Query installed packages')
complete $rpm_mode -s V -l verify -d (_ 'Verify package integrety')
complete $rpm_mode -s V -l verify -d (_ 'Verify package integrity')
complete $rpm_mode -s e -l erase -d (_ 'Erase package')
set -e rpm_mode

View File

@@ -58,20 +58,25 @@ end
# Completions
#
complete -c set -s e -l erase -d (_ "Erase variable")
complete -c set -s x -l export -d (_ "Export variable to subprocess")
complete -c set -s u -l unexport -d (_ "Do not export variable to subprocess")
complete -c set -s g -l global -d (_ "Make variable scope global")
complete -c set -s l -l local -d (_ "Make variable scope local")
complete -c set -s U -l universal -d (_ "Make variable scope universal, i.e. share variable with all the users fish processes on this computer")
complete -c set -s q -l query -d (_ "Test if variable is defined")
complete -c set -s h -l help -d (_ "Display help and exit")
# Regular switches, set only accepts these before the variable name,
# so we need to test using __fish_is_first_token
# Complete using preexisting variables
complete -c set -n '__fish_is_first_token' -s e -l erase -d (_ "Erase variable")
complete -c set -n '__fish_is_first_token' -s x -l export -d (_ "Export variable to subprocess")
complete -c set -n '__fish_is_first_token' -s u -l unexport -d (_ "Do not export variable to subprocess")
complete -c set -n '__fish_is_first_token' -s g -l global -d (_ "Make variable scope global")
complete -c set -n '__fish_is_first_token' -s l -l local -d (_ "Make variable scope local")
complete -c set -n '__fish_is_first_token' -s U -l universal -d (_ "Make variable scope universal, i.e. share variable with all the users fish processes on this computer")
complete -c set -n '__fish_is_first_token' -s q -l query -d (_ "Test if variable is defined")
complete -c set -n '__fish_is_first_token' -s h -l help -d (_ "Display help and exit")
# Complete using preexisting variable names
complete -c set -n '__fish_is_first_token' -x -a "(set|sed -e 's/ /\tVariable: /')"
# Color completions
complete -c set -n '__fish_set_is_color' -x -a '(set_color --print-colors)' -d (_ Color)
complete -c set -n '__fish_set_is_color' -s b -l background -x -a '(set_color --print-colors)' -d (_ "Change background color")
complete -c set -n '__fish_set_is_color' -s o -l bold -d (_ 'Make font bold')
# Locale completions
complete -c set -n '__fish_is_first_token' -x -a '$__fish_locale_vars' -d 'Locale variable'

View File

@@ -0,0 +1,33 @@
#
# Completions for sshfs
#
# Host combinations, borrowed from ssh.fish
#
complete -x -c sshfs -d Hostname -a "
(__fish_print_hostnames):
(
#Prepend any username specified in the completion to the hostname
echo (commandline -ct)|sed -ne 's/\(.*@\).*/\1/p'
)(__fish_print_hostnames):
(__fish_print_users)@
"
#
# Mount Points, for neatness, I am only mounting under ~/mnt/
#
complete -c sshfs -d (_ "Mount point") -x -a '(find ~/mnt -type d)'
#
# Command options
#
complete -c sshfs -s V -d (_ "Display version and exit")
complete -c sshfs -s p -x -d (_ "Port")
complete -c sshfs -s C -d (_ "Compression")
complete -c sshfs -s o -x -d (_ "Mount options")
complete -c sshfs -s d -d (_ "Enable debug")
complete -c sshfs -s f -d (_ "Foreground operation")
complete -c sshfs -s s -d (_ "Disable multi-threaded operation")
complete -c sshfs -s r -d (_ "Mount options")
complete -c sshfs -s h -d (_ "Display help and exit")

View File

@@ -0,0 +1,10 @@
complete -c status -l is-command-substitution -d (_ "Test if a command substitution is currently evaluated")
complete -c status -l is-block -d (_ "Test if a code block is currently evaluated")
complete -c status -l is-interactive -d (_ "Test if this is an interactive shell")
complete -c status -l is-login -d (_ "Test if this is a login shell")
complete -c status -l is-full-job-control -d (_ "Test if all new jobs are put under job control")
complete -c status -l is-interactive-job-control -d (_ "Test if only interactive new jobs are put under job control")
complete -c status -l is-no-job-control -d (_ "Test if new jobs are never put under job control")
complete -c status -s j -l job-control -xa "full interactive none" -d (_ "Set which jobs are out under job control")
complete -c status -s t -l print-stack-trace -d (_ "Print a list of all function calls leading up to running the current command")

View File

@@ -2,7 +2,7 @@
complete -x -c su -a "(__fish_complete_users)"
complete -c su -s l -l login -d (_ "Make login shell")
complete -r -c su -s c -l command -d (_ "Pass command to shell")
complete -r -c su -s c -l command -d (_ "Pass command to shell") -xa "(__fish_complete_command)"
complete -c su -s f -l fast -d (_ "Pass -f to the shell")
complete -c su -s m -l preserve_environment -d (_ "Preserve environment")
complete -c su -s p -d (_ "Preserve environment")

View File

@@ -0,0 +1,8 @@
#
# Completion for sudo
#
complete -c sudo -d (_ "Command to run") -x -a "(__fish_complete_subcommand)"
complete -c sudo -s h -n "__fish_no_arguments" -d (_ "Display help and exit")
complete -c sudo -s v -n "__fish_no_arguments" -d (_ "Validate")

View File

@@ -19,7 +19,7 @@ complete -c tar -l force-local -d (_ "Archive is local")
complete -c tar -s F -l info-script -d (_ "Run script at end of tape")
complete -c tar -s G -l incremental -d (_ "Use old incremental GNU format")
complete -c tar -s g -l listed-incremental -d (_ "Use new incremental GNU format")
complete -c tar -s h -l dereference -d (_ "Derefrerence symlinks")
complete -c tar -s h -l dereference -d (_ "Dereference symlinks")
complete -c tar -s i -l ignore-zeros -d (_ "Ignore zero block in archive")
complete -c tar -s j -l bzip -d (_ "Filter through bzip2")
complete -c tar -l ignore-failed-read -d (_ "Don't exit on unreadable files")

View File

@@ -1,7 +1,7 @@
for i in {,e}tex {,e}latex pdf{,e}latex pdf{,e}tex omega
complete -c $i -o help -d (_ "Display help and exit")
complete -c $i -o version -d (_ "Display version and exit")
complete -c $i -x -a "(
__fish_complete_suffix (commandline -ct) .tex '(La)TeX file'
)"
end
set -l cmds -c etex -c tex -c elatex -c latex -c pdflatex -c pdfelatex -c pdftex -c pdfetex -c omega
complete $cmds -o help -d (_ "Display help and exit")
complete $cmds -o version -d (_ "Display version and exit")
complete $cmds -x -a "(
__fish_complete_suffix (commandline -ct) .tex '(La)TeX file'
)"

View File

@@ -0,0 +1,11 @@
complete -c time -a "(__fish_complete_subcommand -- -o --output -f --format)" -d (_ "Command")
complete -c time -s f -l format -n "__fish_no_arguments" -d (_ "Specify output format") -x
complete -c time -s p -l portable -n "__fish_no_arguments" -d (_ "Use the portable output format")
complete -c time -s o -l output -n "__fish_no_arguments" -d (_ "Do not send the results to stderr, but overwrite the specified file") -r
complete -c time -s a -l append -n "__fish_no_arguments" -d (_ "(Used together with -o) Do not overwrite but append")
complete -c time -s v -l verbose -n "__fish_no_arguments" -d (_ "Verbose mode")
complete -c time -l help -n "__fish_no_arguments" -d (_ "Display help and exit")
complete -c time -s V -l version -n "__fish_no_arguments" -d (_ "Display version and exit")

View File

@@ -5,3 +5,8 @@ complete -c type -s f -l no-functions -d (_ "Supress function and builtin lookup
complete -c type -s t -l type -d (_ "Print command type")
complete -c type -s p -l path -d (_ "Print path to command, or nothing if name is not a command")
complete -c type -s P -l force-path -d (_ "Print path to command")
complete -c type -a "(builtin -n)" -d (_ "Builtin")
complete -c type -a "(functions -n)" -d (_ "Function")
complete -c type -a "(__fish_complete_command)" -d (_ "Command")

View File

@@ -5,7 +5,7 @@ complete -c uname -s r -l kernel-release -d (_ "Print kernel release")
complete -c uname -s v -l kernel-version -d (_ "Print kernel version")
complete -c uname -s m -l machine -d (_ "Print machine name")
complete -c uname -s p -l processor -d (_ "Print processor")
complete -c uname -s i -l hardware-platform -d (_ "Print harware platform")
complete -c uname -s i -l hardware-platform -d (_ "Print hardware platform")
complete -c uname -s o -l operating-system -d (_ "Print operating system")
complete -c uname -l help -d (_ "Display help and exit")
complete -c uname -l verion -d (_ "Display version and exit")

View File

@@ -6,19 +6,19 @@ complete -c wget -s V -l version -d (_ "Display version and exit")
complete -c wget -s h -l help -d (_ "Display help and exit")
complete -c wget -s b -l background -d (_ "Go to background immediately after startup")
complete -c wget -s e -l execute -d (_ "Execute command as if part of .wgetrc") -x
complete -c wget -s o -l output-file -d (_ "Log all messages to logfile") -f
complete -c wget -s o -l output-file -d (_ "Log all messages to logfile") -r
complete -c wget -s a -l append-output -d (_ "Append all messages to logfile")
complete -c wget -s d -l debug -d (_ "Turn on debug output")
complete -c wget -s q -l quiet -d (_ "Quiet mode")
complete -c wget -s v -l verbose -d (_ "Verbose mode")
complete -c wget -l non-verbose -d (_ "Turn off verbose without being completely quiet")
complete -c wget -o nv -d (_ "Turn off verbose without being completely quiet")
complete -c wget -s i -l input-file -d (_ "Read URLs from file") -f
complete -c wget -s i -l input-file -d (_ "Read URLs from file") -r
complete -c wget -s F -l force-html -d (_ "Force input to be treated as HTML")
complete -c wget -s B -l base -d (_ "Prepend string to relative links") -x
complete -c wget -l bind-adress -d (_ "Bind address on local machine") -xa "(__fish_print_addresses; __fish_print_hostnames)"
complete -c wget -s t -l tries -d (_ "Set number of retries to number") -xa "0 1 2 4 8 16 32 64 128"
complete -c wget -s O -l output-document -d (_ "Concatenate output to file") -f
complete -c wget -s O -l output-document -d (_ "Concatenate output to file") -r
complete -c wget -l no-clobber -d (_ "Never overwrite files with same name")
complete -c wget -o nc -d (_ "Never overwrite files with same name")
complete -c wget -s c -l continue -d (_ "Continue getting a partially-downloaded file")
@@ -57,13 +57,13 @@ complete -c wget -l no-host-directories -d (_ "Disable generation of host-prefix
complete -c wget -o nH -d (_ "Disable generation of host-prefixed directories")
complete -c wget -l protocal-directories -d (_ "Use the protocol name as a directory component")
complete -c wget -l cut-dirs -d (_ "Ignore specified number of directory components") -xa "1 2 3 4 5"
complete -c wget -s P -l directory-prefix -d (_ "Set directory prefix") -f
complete -c wget -s P -l directory-prefix -d (_ "Set directory prefix") -r
complete -c wget -s E -l html-extension -d (_ "Force html files to have html extension")
complete -c wget -l http-user -d (_ "Specify the http username") -xa "(__fish_complete_users)"
complete -c wget -l http-passwd -d (_ "Specify the http password") -x
complete -c wget -l no-cache -d (_ "Disable server-side cache")
complete -c wget -l no-cookies -d (_ "Disable the use of cookies")
complete -c wget -l load-cookies -d (_ "Load cookies from file") -f
complete -c wget -l load-cookies -d (_ "Load cookies from file") -r
complete -c wget -l save-cookies -d (_ "Save cookies to file")
complete -c wget -l keep-session-cookies -d (_ "Save session cookies")
complete -c wget -l ignore-length -d (_ "Ignore 'Content-Length' header")
@@ -74,7 +74,7 @@ complete -c wget -l referer -d (_ "Set referer URL") -x
complete -c wget -l save-headers -d (_ "Save the headers sent by the HTTP server")
complete -c wget -s U -l user-agent -d (_ "Identify as agent-string") -x
complete -c wget -l post-data -d (_ "Use POST as the method for all HTTP requests and send the specified data in the request body") -x
complete -c wget -l post-file -d (_ "Use POST as the method for all HTTP requests and send the specified data in the request body") -f
complete -c wget -l post-file -d (_ "Use POST as the method for all HTTP requests and send the specified data in the request body") -r
complete -c wget -l no-http-keep-alive -d (_ "Turn off keep-alive for http downloads")
#FTP options
@@ -82,7 +82,7 @@ complete -c wget -l no-http-keep-alive -d (_ "Turn off keep-alive for http downl
complete -c wget -l no-remove-listing -d (_ "Don't remove the temporary .listing files generated")
complete -c wget -l no-glob -d (_ "Turn off FTP globbing")
complete -c wget -l passive-ftp -d (_ "Use the passive FTP retrieval scheme")
complete -c wget -l retr-symlinks -d (_ "Traverse symlinks and retrive pointed-to files")
complete -c wget -l retr-symlinks -d (_ "Traverse symlinks and retrieve pointed-to files")
# Recursive options

View File

@@ -1,7 +1,7 @@
#
# Init file for fish
#
# @configure_input@
#
# Set default field separators
@@ -15,10 +15,10 @@ set -g IFS \ \t\n
# want this even for text-only terminals.
#
set -l path_list /bin /usr/bin /usr/X11R6/bin @PREFIX@/bin
set -l path_list /bin /usr/bin /usr/X11R6/bin @PREFIX@/bin @optbindirs@
set -l uid (id -u 2>/dev/null)
if test "$uid" = 0
# Root should also have the sbin directories in the path
if test "$USER" = root
set path_list $path_list /sbin /usr/sbin /usr/local/sbin
end
@@ -31,10 +31,9 @@ for i in $path_list
end
#
# Set some value for LANG if nothing was set before
# Set some value for LANG if nothing was set before, and this is a
# login shell. Also check for i18n information in /etc/sysconfig/i18n
#
if status --is-login
@@ -71,8 +70,21 @@ for i in DISPLAY
end
end
#
# Alias for gettext (or a fallback if gettext isn't installed) This
# needs to be defined here and not in fish_function.fish, since it is
# used by other init files.
#
function _ -d "Alias for the gettext command"
gettext fish $argv
printf "%s" $argv
end
if test 1 = "@HAVE_GETTEXT@"
if which gettext ^/dev/null >/dev/null
function _ -d "Alias for the gettext command"
gettext fish $argv
end
end
end
#

View File

@@ -1,6 +1,8 @@
# Main file for fish command completions. This file contains various
# common helper functions for the command completions. All actual
# completions are located in the completions subdirectory.
#
# @configure_input@
#
# Don't need completions in non-interactive mode
@@ -96,17 +98,57 @@ function __fish_complete_pids -d "Print a list of process identifiers along with
end
function __fish_complete_command -d "Complete using all available commands"
for i in $PATH; command ls $i; end
printf "%s\n" (commandline -ct)(complete -C (commandline -ct))
end
function __fish_complete_subcommand -d "Complete subcommand"
set -l res ""
set -l had_cmd 0
set -l cmd (commandline -cop) (commandline -ct)
set -l skip_next 1
for i in $cmd
if test "$skip_next" = 1
set skip_next 0
continue
end
if test "$had_cmd" = 1
set res "$res $i"
else
if contains -- $i $argv
set skip_next 1
continue
end
switch $i
case '-*'
case '*'
set had_cmd 1
set res $i
end
end
end
printf "%s\n" (commandline -ct)(complete -C $res)
end
function __fish_print_hostnames -d "Print a list of known hostnames"
# Print all hosts from /etc/hosts
cat /etc/hosts|sed -e 's/[0-9.]*\( \|\t\)*\(.*\)/\2/'|sed -e 's/\#.*//'|sed -e 'y/\t/\n/'|grep -v '^$'
if test -f /etc/hosts
sed </etc/hosts -e 's/[0-9.]*\( \|\t\)*\(.*\)/\2/'|sed -e 's/\#.*//'|tr \t \n |grep -v '^$'
end
# Print nfs servers from /etc/fstab
cat /etc/fstab| grep "^\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|[a-zA-Z.]*\):"|cut -d : -f 1
if test -f /etc/fstab
grep </etc/fstab "^\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\|[a-zA-Z.]*\):"|cut -d : -f 1
end
# Print hosts with known ssh keys
cat ~/.ssh/known_hosts{,2} ^/dev/null|cut -d ' ' -f 1| cut -d , -f 1
@@ -232,6 +274,15 @@ function __fish_print_packages
# Remove package version information from output and pipe into cache file
rpm -qa >$cache_file |sed -e 's/-[^-]*-[^-]*$//' | sed -e 's/$/\t'$package'/' &
end
# This completes the package name from the portage tree.
# True for installing new packages. Function for printing
# installed on the system packages is in completions/emerge.fish
if which emerge >/dev/null ^/dev/null
emerge -s \^(commandline -tc) |grep "^*" |cut -d\ -f3 |cut -d/ -f2
return
end
end
@@ -285,6 +336,20 @@ function __fish_is_first_token -d 'Test if no non-switch argument has been speci
return 0
end
function __fish_no_arguments -d "Internal fish function"
set -l cmd (commandline -poc) (commandline -tc)
set -e cmd[1]
for i in $cmd
switch $i
case '-*'
case '*'
return 1
end
end
return 0
end
#
# Completions for SysV startup scripts
#

View File

@@ -1,39 +1,15 @@
#
# This file defines various functions for fish
# This file defines various shellscript functions. Most of them are
# meant to be used directly by the user, but some of them, typically
# the ones whose name start with '__fish_', are only meant to be used
# internally by fish.
#
function _contains_help -d "Helper function for contains"
set bullet \*
if expr "$LANG" : ".*UTF" >/dev/null
set bullet \u2022
end
echo \tcontains - Test if a word is present in a list\n
__bold Synopsis
echo \n\n\tcontains \[OPTION] KEY [VALUES...]\n
__bold Description
echo \n\n\t$bullet (__bold -h) or (__bold --help) display help and exit\n
echo \tTest if the set VALUES contains the string KEY.
echo \tReturn status is 0 if yes, 1 otherwise.\n
__bold Example
echo \n
echo \tfor i in \~/bin /usr/local/bin
echo \t\tif not contains \$i \$PATH
echo \t\t\tset PATH \$PATH i
echo \t\tend
echo \tend
echo
echo \tThe above code tests if "~/bin" and /usr/local/bin are in the path
echo \tand if they are not, they are added.
end
function contains -d "Test if a key is contained in a set of values"
while set -q argv
switch $argv[1]
case '-h' '--h' '--he' '--hel' '--help'
_contains_help
help contains
return
case '--'
@@ -42,8 +18,8 @@ function contains -d "Test if a key is contained in a set of values"
break
case '-*'
echo Unknown option $argv[$i]
_contains_help
printf (_ "%s: Unknown option '%s'\n") contains $argv[$i]
help contains
return 1
case '*'
@@ -70,6 +46,7 @@ function contains -d "Test if a key is contained in a set of values"
return $status
end
#
# help should use 'open' to find a suitable browser, but only
# if there is a mime database _and_ DISPLAY is set, since the
@@ -81,20 +58,22 @@ end
function help -d "Show help for the fish shell"
# Declare variables to set correct scope
set -l fish_browser
set -l fish_browser_bg
set fish_browser
set fish_browser_bg
set -l h syntax completion editor job-control todo bugs history killring help
set h $h color prompt title variables builtin-overview changes expand
set h $h expand-variable expand-home expand-brace expand-wildcard
set -l help_topics $h expand-command-substitution expand-process
#
# Find a suitable browser for viewing the help pages. This is needed
# by the help function defined below.
#
set graphical_browsers htmlview x-www-browser firefox galeon mozilla konqueror epiphany opera netscape
set text_browsers htmlview www-browser links elinks lynx w3m
set -l graphical_browsers htmlview x-www-browser firefox galeon mozilla konqueror epiphany opera netscape
set -l text_browsers htmlview www-browser links elinks lynx w3m
if test $BROWSER
# User has manualy set a preferred browser, so we respect that
set fish_browser $BROWSER
@@ -102,9 +81,7 @@ function help -d "Show help for the fish shell"
if contains -- $BROWSER $graphical_browsers
set fish_browser_bg 1
end
else
# Check for a text-based browser.
for i in $text_browsers
if which $i 2>/dev/null >/dev/null
@@ -113,9 +90,9 @@ function help -d "Show help for the fish shell"
end
end
# If we are in a graphical environment, we check if there is a
# graphical browser to use instead.
if test (echo $DISPLAY) -a \( "$XAUTHORITY" = "$HOME/.Xauthority" -o "$XAUTHORITY" = "" \)
# If we are in a graphical environment, check if there is a graphical
# browser to use instead.
if test "$DISPLAY" -a \( "$XAUTHORITY" = "$HOME/.Xauthority" -o "$XAUTHORITY" = "" \)
for i in $graphical_browsers
if which $i 2>/dev/null >/dev/null
set fish_browser $i
@@ -132,46 +109,29 @@ function help -d "Show help for the fish shell"
return 1
end
if count $argv >/dev/null
set fish_help_item $argv[1]
end
set fish_help_page ""
set fish_help_item $argv[1]
if test "$fish_help_item" = .
set fish_help_page "builtins.html\#source"
end
if test "$fish_help_item" = difference
set fish_help_page difference.html
end
if test "$fish_help_item" = globbing
set fish_help_page "index.html\#expand"
end
if contains -- $fish_help_item (builtin -n)
set fish_help_page "builtins.html\#"$fish_help_item
end
if contains -- $fish_help_item count dirh dirs help mimedb nextd open popd prevd pushd set_color tokenize psub umask type
set fish_help_page "commands.html\#"$fish_help_item
end
set idx_subj syntax completion editor job-control todo bugs history
set idx_subj $idx_subj killring help color prompt title variables
set idx_subj $idx_subj builtin-overview changes
set idx_subj $idx_subj expand expand-variable expand-home expand-brace expand-wildcard expand-command-substitution expand-process
if contains -- $fish_help_item $idx_subj
set fish_help_page "index.html\#"$fish_help_item
end
if not test $fish_help_page
if which $fish_help_item >/dev/null ^/dev/null
man $fish_help_item
return
end
set fish_help_page "index.html"
switch "$fish_help_item"
case ""
set fish_help_page index.html
case "."
set fish_help_page "builtins.html\#source"
case difference
set fish_help_page difference.html
case globbing
set fish_help_page "index.html\#expand"
case (builtin -n)
set fish_help_page "builtins.html\#$fish_help_item"
case contains count dirh dirs help mimedb nextd open popd prevd pushd set_color tokenize psub umask type vared
set fish_help_page "commands.html\#$fish_help_item"
case $help_topics
set fish_help_page "index.html\#$fish_help_item"
case "*"
if which $fish_help_item >/dev/null ^/dev/null
man $fish_help_item
return
end
set fish_help_page "index.html"
end
if test $fish_browser_bg
@@ -179,16 +139,24 @@ function help -d "Show help for the fish shell"
else
eval $fish_browser file://$__fish_help_dir/$fish_help_page
end
end
#
# Make ls use colors if we are on a system that supports this
#
if ls --help 1>/dev/null 2>/dev/null
if ls --version 1>/dev/null 2>/dev/null
# This is GNU ls
function ls -d "List contents of directory"
command ls --color=auto --indicator-style=classify $argv
end
else
# BSD, OS X and a few more support colors through the -G switch instead
if ls / -G 1>/dev/null 2>/dev/null
function ls -d "List contents of directory"
command ls -G $argv
end
end
end
#
@@ -207,20 +175,34 @@ end
# application for the file.
#
function open -d "Open file in default application"
mimedb -l -- $argv
if not test (uname) = Darwin
function open -d "Open file in default application"
mimedb -l -- $argv
end
end
#
# Print the current working directory. If it is too long, it will be
# ellipsised. This function is used by the default prompt command.
# Print the current working directory in a shortened form.This
# function is used by the default prompt command.
#
function prompt_pwd -d "Print the current working directory, shortend to fit the prompt"
set -l wd (pwd)
printf "%s" $wd|sed -e 's-/\([^/]\)\([^/]*\)-/\1-g'
if test $wd != '~'
printf "%s\n" $wd|sed -e 's-.*/[^/]\([^/]*$\)-\1-'
if test (uname) = Darwin
function prompt_pwd -d "Print the current working directory, shortend to fit the prompt"
if test "$PWD" != "$HOME"
printf "%s" (echo $PWD|sed -e 's|/private||' -e "s|^$HOME|~|" -e 's-/\([^/]\)\([^/]*\)-/\1-g')
echo $PWD|sed -e 's-.*/[^/]\([^/]*$\)-\1-'
else
echo '~'
end
end
else
function prompt_pwd -d "Print the current working directory, shortend to fit the prompt"
if test "$PWD" != "$HOME"
printf "%s" (echo $PWD|sed -e "s|^$HOME|~|" -e 's-/\([^/]\)\([^/]*\)-/\1-g')
echo $PWD|sed -e 's-.*/[^/]\([^/]*$\)-\1-'
else
echo '~'
end
end
end
@@ -229,7 +211,7 @@ end
#
function pwd -d "Print working directory"
command pwd | sed -e "s|^$HOME|~|"
command pwd | sed -e 's|/private||' -e "s|^$HOME|~|"
end
#
@@ -242,10 +224,10 @@ function vared -d "Edit variable value"
switch $argv
case '-h' '--h' '--he' '--hel' '--help'
__vared_help
help vared
case '-*'
printf "vared: Unknown option %s\n" $argv
printf (_ "%s: Unknown option %s\n") vared $argv
case '*'
if test (count $$argv ) -lt 2
@@ -270,24 +252,20 @@ function vared -d "Edit variable value"
else
printf (_ 'vared: %s is an array variable. Use %svared%s %s[n] to edit the n:th element of %s\n') $argv (set_color $fish_color_command) (set_color $fish_color_normal) $argv $argv
printf (_ '%s: %s is an array variable. Use %svared%s %s[n] to edit the n:th element of %s\n') $argv (set_color $fish_color_command) (set_color $fish_color_normal) vared $argv $argv
end
end
else
printf (_ 'vared: Expected exactly one argument, got %s.\n\nSynopsis:\n\t%svared%s VARIABLE\n') (count $argv) (set_color $fish_color_command) (set_color $fish_color_normal)
printf (_ '%s: Expected exactly one argument, got %s.\n\nSynopsis:\n\t%svared%s VARIABLE\n') vared (count $argv) (set_color $fish_color_command) (set_color $fish_color_normal)
end
end
function __vared_help -d "Display help for the vared shellscript function"
#
# This function is used internally by the fish command completion code
#
printf "\tvared - Interactively edit the value of an environment variable\n\n"
printf "%s\n\t%svared%s VARIABLE\n\n" (__bold Synopsis) (set_color $fish_color_command) (set_color normal)
__bold Description
printf "\n\n\tvared is used to interactively edit the value of an environment \n"
printf "\tvariable. Array variables as a whole can not be edited using vared,\n"
printf "\tbut individual array elements can.\n\n"
__bold Example
printf "\n\n\t"\'"%svared%s PATH[3]"\'" edits the third element of the PATH array.\n\n" (set_color $fish_color_co\mmand) (set_color normal)
function __fish_describe_command -d "Command used to find descriptions for commands"
apropos $argv | awk -v FS=" +- +" '{split($1, names, ", "); for (name in names) if (names[name] ~ /^'"$argv"'.* *\([18]\)/) { sub("\\([18]\\)", "", names[name]); print names[name] "\t" $2; } }'
end
#
@@ -321,7 +299,7 @@ function popd -d "Pop dir from stack"
if test $dirstack[1]
cd $dirstack[1]
else
echo Directory stack is empty...
printf (_ "%s: Directory stack is empty...") popd
return 1
end
@@ -376,10 +354,10 @@ end
function __fish_move_last -d "Move the last element of a directory history from src to dest"
set src $argv[1]
set dest $argv[2]
set -l src $argv[1]
set -l dest $argv[2]
set size_src (count $$src)
set -l size_src (count $$src)
if test $size_src = 0
# Cannot make this step
@@ -405,15 +383,15 @@ end
function prevd -d "Move back in the directory history"
# Parse arguments
set show_hist 0
set times 1
set -l show_hist 0
set -l times 1
for i in (seq (count $argv))
switch $argv[$i]
case '-l'
case '-l' --l --li --lis --list
set show_hist 1
continue
case '-*'
echo Uknown option $argv[$i]
printf (_ "%s: Unknown option %s\n" ) prevd $argv[$i]
return 1
case '*'
if test $argv[$i] -ge 0 ^/dev/null
@@ -427,7 +405,7 @@ function prevd -d "Move back in the directory history"
end
# Traverse history
set code 1
set -l code 1
for i in (seq $times)
# Try one step backward
if __fish_move_last dirprev dirnext;
@@ -456,21 +434,21 @@ end
function nextd -d "Move forward in the directory history"
# Parse arguments
set show_hist 0
set times 1
set -l show_hist 0
set -l times 1
for i in (seq (count $argv))
switch $argv[$i]
case '-l'
case '-l' --l --li --lis --list
set show_hist 1
continue
case '-*'
echo Uknown option $argv[$i]
printf (_ "%s: Unknown option %s\n" ) nextd $argv[$i]
return 1
case '*'
if test $argv[$i] -ge 0 ^/dev/null
set times $argv[$i]
else
echo "The number of positions to skip must be a non-negative integer"
printf (_ "%s: The number of positions to skip must be a non-negative integer\n" ) nextd
return 1
end
continue
@@ -478,7 +456,7 @@ function nextd -d "Move forward in the directory history"
end
# Traverse history
set code 1
set -l code 1
for i in (seq $times)
# Try one step backward
if __fish_move_last dirnext dirprev;
@@ -507,9 +485,9 @@ end
function dirh -d "Print the current directory history (the back- and fwd- lists)"
# Avoid set comment
set current (command pwd)
set -- separator " "
set -- line_len (echo (count $dirprev) + (echo $dirprev $current $dirnext | wc -m) | bc)
set -l current (command pwd)
set -l separator " "
set -l line_len (echo (count $dirprev) + (echo $dirprev $current $dirnext | wc -m) | bc)
if test $line_len -gt $COLUMNS
# Print one entry per line if history is long
set separator "\n"
@@ -566,10 +544,9 @@ function trap -d 'Perform an action when the shell recives a signal'
set -l shortopt
set -l longopt
set shortopt -o lph
if getopt -T >/dev/null
set longopt
else
set -l shortopt -o lph
set -l longopt
if not getopt -T >/dev/null
set longopt -l print,help,list-signals
end
@@ -674,58 +651,31 @@ function trap -d 'Perform an action when the shell recives a signal'
end
function __fish_type_help -d "Help for the type shellscript function"
set bullet \*
if expr "$LANG" : ".*UTF" >/dev/null
set bullet \u2022
end
echo \ttype - Indicate how a name would be interpreted if used as a \n\tcommand name
echo
echo (__bold Synopsis)
echo
echo \t(set_color $fish_color_command)type(set_color normal) [OPTIONS] name [name ...]
echo
echo (__bold Description)
echo
echo \tWith no options, indicate how each name would be interpreted if \n\tused as a command name.
echo
echo \t$bullet (__bold -h) or (__bold --help) print this message
echo \t$bullet (__bold -a) or (__bold --all) print all possible definitions of the specified \n\t\ \ names
echo \t$bullet (__bold -f) or (__bold --no-functions) supresses function and builtin lookup
echo \t$bullet (__bold -t) or (__bold --type) print a string which is one of alias, keyword, \n\t\ \ function, builtin, or file if name is an alias, shell \n\t\ \ reserved word, function, builtin, or disk file, respectively
echo \t$bullet (__bold -p) or (__bold --path) either return the name of the disk file that would \n\t\ \ be executed if name were specified as a command name, or nothing \n\t\ \ if (__bold "type -t name") would not return file
echo \t$bullet (__bold -P) or (__bold --force-path) either return the name of the disk file that \n\t\ \ would be executed if name were specified as a command name, \n\t\ \ or nothing no file with the spacified name could be found \n\t\ \ in the PATH
echo
echo (__bold Example)
echo
echo \t\'(set_color $fish_color_command)type(set_color normal) fg\' outputs the string \'fg is a shell builtin\'.
echo
end
function type -d "Print the type of a command"
set status 1
set mode normal
set selection all
# Initialize
set -l status 1
set -l mode normal
set -l selection all
set -- shortopt -o tpPafh
if getopt -T >/dev/null
set longopt
else
set longopt -- -l type,path,force-path,all,no-functions,help
#
# Get options
#
set -l shortopt -o tpPafh
set -l longopt
if not getopt -T >/dev/null
set longopt -l type,path,force-path,all,no-functions,help
end
if not getopt -n type -Q $shortopt $longopt -- $argv
return 1
end
set -- tmp (getopt $shortopt $longopt -- $argv)
set -l tmp (getopt $shortopt $longopt -- $argv)
eval set opt -- $tmp
set -l opt
eval set opt $tmp
for i in $opt
switch $i
@@ -746,7 +696,7 @@ function type -d "Print the type of a command"
set selection files
case -h --help
__fish_type_help
help type
return 0
case --
@@ -755,6 +705,7 @@ function type -d "Print the type of a command"
end
end
# Check all possible types for the remaining arguments
for i in $argv
switch $i
@@ -776,7 +727,7 @@ function type -d "Print the type of a command"
functions $i
case type
printf (_ function)
printf (_ 'function\n')
case path
echo
@@ -815,7 +766,7 @@ function type -d "Print the type of a command"
printf (_ '%s is %s\n') $i (which $i)
case type
printf (_ file)
printf (_ 'file\n')
case path
which $i
@@ -837,7 +788,7 @@ end
function __fish_umask_parse -d "Parses a file permission specification as into an octal version"
# Test if already a valid octal mask, and pad it with zeros
if echo $argv | grep -E '^(0|)[0-7]{1,3}$' >/dev/null
for i in (seq (echo 5-(echo $argv|wc -c)|bc)); set -- argv 0$argv; end
for i in (seq (echo 5-(echo $argv|wc -c)|bc)); set argv 0$argv; end
echo $argv
else
# Test if argument really is a valid symbolic mask
@@ -846,34 +797,38 @@ function __fish_umask_parse -d "Parses a file permission specification as into a
return 1
end
set -e implicit_all
set -l implicit_all
# Insert inverted umask into res variable
set tmp $umask
set -l mode
set -l val
set -l tmp $umask
set -l res
for i in 1 2 3
set -- tmp (echo $tmp|cut -c 2-)
set -- res[$i] (echo 7-(echo $tmp|cut -c 1)|bc)
set tmp (echo $tmp|cut -c 2-)
set res[$i] (echo 7-(echo $tmp|cut -c 1)|bc)
end
set -- el (echo $argv|tr , \n)
set -l el (echo $argv|tr , \n)
for i in $el
switch $i
case 'u*'
set idx 1
set -- i (echo $i| cut -c 2-)
set i (echo $i| cut -c 2-)
case 'g*'
set idx 2
set -- i (echo $i| cut -c 2-)
set i (echo $i| cut -c 2-)
case 'o*'
set idx 3
set -- i (echo $i| cut -c 2-)
set i (echo $i| cut -c 2-)
case 'a*'
set idx 1 2 3
set -- i (echo $i| cut -c 2-)
set i (echo $i| cut -c 2-)
case '*'
set implicit_all 1
@@ -883,26 +838,26 @@ function __fish_umask_parse -d "Parses a file permission specification as into a
switch $i
case '=*'
set mode set
set -- i (echo $i| cut -c 2-)
set i (echo $i| cut -c 2-)
case '+*'
set mode add
set -- i (echo $i| cut -c 2-)
set i (echo $i| cut -c 2-)
case '-*'
set mode remove
set -- i (echo $i| cut -c 2-)
set i (echo $i| cut -c 2-)
case '*'
if not set -q implicit_all
echo umask: Invalid mask $argv >&2
if not count $implicit_all >/dev/null
printf (_ "%s: Invalid mask %s\n") umask $argv >&2
return
end
set mode set
end
if not echo $perm|grep -E '^(r|w|x)*$' >/dev/null
echo umask: Invalid mask $argv >&2
printf (_ "%s: Invalid mask %s\n") umask $argv >&2
return
end
@@ -947,15 +902,15 @@ function __fish_umask_print_symbolic
set val (echo $umask|cut -c $i)
if contains $val 0 1 2 3
set res {$res}r
set res {$res}r
end
if contains $val 0 1 4 5
set res {$res}w
set res {$res}w
end
if contains $val 0 2 4 6
set res {$res}x
set res {$res}x
end
end
@@ -968,20 +923,19 @@ function umask -d "Set default file permission mask"
set -l as_command 0
set -l symbolic 0
set -- shortopt -o pSh
if getopt -T >/dev/null
set longopt
else
set -- longopt -l as-command,symbolic,help
set -l shortopt -o pSh
set -l longopt
if not getopt -T >/dev/null
set longopt -l as-command,symbolic,help
end
if not getopt -n umask -Q $shortopt $longopt -- $argv
return 1
end
set tmp -- (getopt $shortopt $longopt -- $argv)
set -l tmp (getopt $shortopt $longopt -- $argv)
eval set -- opt $tmp
eval set opt $tmp
while count $opt >/dev/null
@@ -1026,7 +980,9 @@ function umask -d "Set default file permission mask"
set -l parsed (__fish_umask_parse $opt)
if test (count $parsed) -eq 1
set -g umask $parsed
return 0
end
return 1
case '*'
printf (_ '%s: Too many arguments\n') umask >&2

View File

@@ -1,6 +1,7 @@
#
# Initializations that should only be performed when in interactive mode
#
# @configure_input@
if not status --is-interactive
exit
@@ -26,7 +27,19 @@ end
# long it is.
function fish_prompt -d (_ "Write out the prompt")
printf '%s@%s %s%s%s> \n' (whoami) (hostname|cut -d . -f 1) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal)
# Just calculate these once, to save a few cycles when displaying the prompt
if not set -q __fish_prompt_hostname
set -g __fish_prompt_hostname (hostname|cut -d . -f 1)
end
if not set -q __fish_prompt_normal
set -g __fish_prompt_normal (set_color normal)
end
set -l prompt_color (set_color $fish_color_cwd)
printf '%s@%s %s%s%s> \n' $USER $__fish_prompt_hostname "$prompt_color" (prompt_pwd) "$__fish_prompt_normal"
end
#
@@ -40,7 +53,7 @@ end
# @SYSCONFDIR@/fish_inputrc.
#
for i in ~/.fish_inputrc @SYSCONFDIR@/fish_inputrc ~/etc/fish_inputrc /etc/fish_inputrc ~/.inputrc /etc/inputrc
for i in ~/.fish_inputrc @SYSCONFDIR@/fish_inputrc ~/.inputrc /etc/inputrc
if test -f $i
set -xg INPUTRC $i
break
@@ -52,15 +65,10 @@ end
# Set various color values
#
function set_default_color -d "Set an universal variable, unless it has already been set. If set, verify that it is a valid color name"
if not set -q $argv[1]
set -U -- $argv
return
function set_default -d "Set an exported universal variable, unless it has already been set"
if not set -q $argv[1]
set -Ux -- $argv
end
if contains -- $$argv[1] (set_color -c)
return
end
set -U -- $argv
end
function set_exported_default -d "Set an exported universal variable, unless it has already been set"
@@ -71,35 +79,35 @@ end
# Regular syntax highlighting colors
set_default_color fish_color_normal normal
set_default_color fish_color_command green
set_default_color fish_color_redirection normal
set_default_color fish_color_comment brown
set_default_color fish_color_error red
set_default fish_color_normal normal
set_default fish_color_command green
set_default fish_color_redirection normal
set_default fish_color_comment brown
set_default fish_color_error red
set_default_color fish_color_cwd green
set_default fish_color_cwd green
# Background color for matching quotes and parenthesis
set_default_color fish_color_match cyan
set_default fish_color_match cyan
# Background color for search matches
set_default_color fish_color_search_match purple
set_default fish_color_search_match purple
# Pager colors
set_default_color fish_pager_color_prefix cyan
set_default_color fish_pager_color_completion normal
set_default_color fish_pager_color_description normal
set_default_color fish_pager_color_progress cyan
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_color fish_color_history_current cyan
set_default fish_color_history_current cyan
#
# Setup the CDPATH variable
#
set_exported_default CDPATH . ~
set_default CDPATH . ~
#
# Match colors for grep, if supported
@@ -115,9 +123,52 @@ end
#
if command ls --color=auto --help 1>/dev/null 2>/dev/null
set_exported_default LS_COLORS $LS_COLORS '*.jar=01;31' '*.doc=35' '*.pdf=35' '*.ps=35' '*.xls=35' '*.swf=35' '*~=37'
set -l color_document 35
set -l color_image '01;35'
set -l color_sound '01;35'
set -l color_video '01;35'
set -l color_archive '01;31'
set -l color_command '01;32'
set -l color_backup 37
set -l default no=00 fi=00 'di=01;34' 'ln=01;36' 'pi=40;33' 'so=01;35' 'bd=40;33;01' 'cd=40;33;01' 'or=01;05;37;41' 'mi=01;05;37;41' ex=$color_command
for i in .cmd .exe .com .btm .bat .sh .csh .fish
set default $default "*$i=$color_command"
end
for i in .tar .tgz .arj .taz .lhz .zip .z .Z .gz .bz2 .bz .tz .rpm .cpio .jar .deb .rar .bin .hqx
set default $default "*$i=$color_archive"
end
for i in .jpg .jpeg .gif .bmp .xbm .xpm .png .tif
set default $default "*$i=$color_image"
end
for i in .mp3 .au .wav .aiff .ogg .wma
set default $default "*$i=$color_sound"
end
for i in .avi .mpeg .mpg .divx .mov .qt .wmv .rm
set default $default "*$i=$color_video"
end
for i in .htm .html .rtf .wpd .doc .pdf .ps .xls .swf .txt .tex .sxw .dvi INSTALL README ChangeLog
set default $default "*$i=$color_document"
end
for i in '~' .bak
set default $default "*$i=$color_backup"
end
set -gx LS_COLORS $default
end
functions -e set_default_color
#
# Remove temporary functions
#
functions -e set_exported_default
functions -e set_default

38
input.c
View File

@@ -32,7 +32,12 @@ implementation in fish is as of yet incomplete.
#include <termio.h>
#endif
#if HAVE_TERM_H
#include <term.h>
#elif HAVE_NCURSES_TERM_H
#include <ncurses/term.h>
#endif
#include <signal.h>
#include <dirent.h>
#include <wctype.h>
@@ -191,7 +196,18 @@ const wchar_t code_arr[] =
*/
static hash_table_t all_mappings;
static array_list_t *current_mode_mappings, *current_application_mappings, *global_mappings;
/**
Mappings for the current input mode
*/
static array_list_t *current_mode_mappings;
/**
Mappings for the current application
*/
static array_list_t *current_application_mappings;
/**
Global mappings
*/
static array_list_t *global_mappings;
/**
Number of nested conditional statement levels that are not evaluated
@@ -1292,12 +1308,32 @@ static int interrupt_handler()
Fire any pending events
*/
event_fire( 0 );
/*
Reap stray processes, including printing exit status messages
*/
if( job_reap( 1 ) )
repaint();
/*
Check if we should exit
*/
if( exit_status() )
{
return R_EXIT;
}
/*
Tell the reader an event occured
*/
if( reader_interupted() )
{
/*
Return 3, i.e. the character read by a Control-C.
*/
return 3;
}
return 0;
}

View File

@@ -77,8 +77,8 @@ wint_t input_readch();
/**
Push a character or a readline function onto the stack of unread
characters that input_readch will return before actually reading from fd
0.
*/
0.
*/
void input_unreadch( wint_t ch );
@@ -88,7 +88,7 @@ void input_unreadch( wint_t ch );
\param mode the name of the mapping mode to add this mapping to
\param s the sequence
\param d a description of the sequence
\param c am input function that will be run whenever the key sequence occurs
\param cmd an input function that will be run whenever the key sequence occurs
*/
void add_mapping( const wchar_t *mode, const wchar_t *s, const wchar_t * d, const wchar_t *cmd );

View File

@@ -9,9 +9,12 @@ Implementation file for the low level input library
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <wchar.h>
#include "util.h"
#include "common.h"
#include "wutil.h"

View File

@@ -8,7 +8,7 @@ Header file for the low level input library
#include <wchar.h>
/*
/**
Use unencoded private-use keycodes for internal characters
*/
#define INPUT_COMMON_RESERVED 0xe000
@@ -24,8 +24,14 @@ enum
}
;
/**
Init the library
*/
void input_common_init( int (*ih)() );
/**
Free memory used by the library
*/
void input_common_destroy();
/**
@@ -39,6 +45,11 @@ void input_common_destroy();
*/
wchar_t input_common_readch( int timed );
/**
Push a character or a readline function onto the stack of unread
characters that input_readch will return before actually reading from fd
0.
*/
void input_common_unreadch( wint_t ch );
#endif

View File

@@ -11,19 +11,19 @@
#include <unistd.h>
#include "util.h"
#include "wutil.h"
#include "common.h"
#include "intern.h"
hash_table_t *intern_table=0;
hash_table_t *intern_static_table=0;
/**
Table of interned strings
*/
static hash_table_t *intern_table=0;
/**
Load static strings that are universally common. Currently only loads the empty string.
Table of static interned strings
*/
static void intern_load_common_static()
{
intern_static( L"" );
}
static hash_table_t *intern_static_table=0;
const wchar_t *intern( const wchar_t *in )
{
@@ -32,9 +32,6 @@ const wchar_t *intern( const wchar_t *in )
if( !in )
return 0;
intern_load_common_static();
if( !intern_table )
{
intern_table = malloc( sizeof( hash_table_t ) );

12
io.c
View File

@@ -25,7 +25,11 @@ Utilities for io redirection.
#include <termio.h>
#endif
#if HAVE_TERM_H
#include <term.h>
#elif HAVE_NCURSES_TERM_H
#include <ncurses/term.h>
#endif
#include "util.h"
#include "wutil.h"
@@ -33,7 +37,7 @@ Utilities for io redirection.
#include "common.h"
#include "io.h"
#include "translate.h"
#include "halloc.h"
void io_buffer_read( io_data_t *d )
@@ -171,14 +175,14 @@ io_data_t *io_remove( io_data_t *list, io_data_t *element )
return list;
}
io_data_t *io_duplicate( io_data_t *l )
io_data_t *io_duplicate( void *context, io_data_t *l )
{
io_data_t *res;
if( l == 0 )
return 0;
res = malloc( sizeof( io_data_t) );
res = halloc( context, sizeof( io_data_t) );
if( !res )
{
@@ -187,7 +191,7 @@ io_data_t *io_duplicate( io_data_t *l )
}
memcpy( res, l, sizeof(io_data_t ));
res->next=io_duplicate( l->next );
res->next=io_duplicate( context, l->next );
return res;
}

4
io.h
View File

@@ -62,9 +62,9 @@ io_data_t *io_add( io_data_t *first_chain, io_data_t *decond_chain );
io_data_t *io_remove( io_data_t *list, io_data_t *element );
/**
Make a copy of the specified chain of redirections
Make a copy of the specified chain of redirections. Uses halloc.
*/
io_data_t *io_duplicate( io_data_t *l );
io_data_t *io_duplicate( void *context, io_data_t *l );
/**
Return the last io redirection in ht e chain for the specified file descriptor.

5
kill.c
View File

@@ -25,7 +25,6 @@
#include "sanity.h"
#include "common.h"
#include "env.h"
#include "expand.h"
#include "exec.h"
#include "parser.h"
@@ -95,7 +94,7 @@ void kill_add( wchar_t *str )
wchar_t *disp;
if( (disp = env_get( L"DISPLAY" )) )
{
wchar_t *escaped_str = expand_escape( str, 1 );
wchar_t *escaped_str = escape( str, 1 );
wchar_t *cmd = wcsdupcat2(L"echo ", escaped_str, L"|xsel -b",0);
exec_subshell( cmd, 0 );
free( cut_buffer );
@@ -137,7 +136,7 @@ static void kill_check_x_buffer()
for( i=0; i<al_get_count( &list ); i++ )
{
wchar_t *next_line = expand_escape( (wchar_t *)al_get( &list, i ), 0);
wchar_t *next_line = escape( (wchar_t *)al_get( &list, i ), 0);
if( i==0 )
{
new_cut_buffer = next_line;

53
main.c
View File

@@ -124,6 +124,10 @@ int main( int argc, char **argv )
"interactive", no_argument, 0, 'i'
}
,
{
"login", no_argument, 0, 'l'
}
,
{
"profile", required_argument, 0, 'p'
}
@@ -146,14 +150,14 @@ int main( int argc, char **argv )
int opt = getopt_long( argc,
argv,
"hivc:p:",
"hilvc:p:",
long_options,
&opt_index );
#else
int opt = getopt( argc,
argv,
"hivc:p:" );
"hilvc:p:" );
#endif
if( opt == -1 )
break;
@@ -170,21 +174,23 @@ int main( int argc, char **argv )
case 'h':
cmd = "help";
//interactive=0;
break;
case 'i':
force_interactive = 1;
break;
case 'l':
is_login=1;
break;
case 'p':
profile = optarg;
break;
case 'v':
fwprintf( stderr,
L"%s, version %s\n",
_(L"%s, version %s\n"),
PACKAGE_NAME,
PACKAGE_VERSION );
exit( 0 );
@@ -198,16 +204,11 @@ int main( int argc, char **argv )
my_optind = optind;
is_login |= strcmp( argv[0], "-fish") == 0;
// fwprintf( stderr, L"%s\n", argv[0] );
is_interactive_session &= (cmd == 0);
is_interactive_session &= (my_optind == argc);
is_interactive_session &= isatty(STDIN_FILENO);
// fwprintf( stderr, L"%d %d %d\n", cmd==0, my_optind == argc, isatty(STDIN_FILENO) );
if( force_interactive )
is_interactive_session=1;
is_interactive_session |= force_interactive;
translate_init();
proc_init();
@@ -222,8 +223,6 @@ int main( int argc, char **argv )
complete_init();
reader_init();
reader_push_current_filename( L"(internal)" );
if( read_init() )
{
if( cmd != 0 )
@@ -237,9 +236,7 @@ int main( int argc, char **argv )
{
if( my_optind == argc )
{
reader_push_current_filename( L"(stdin)" );
res = reader_read( 0 );
reader_pop_current_filename();
}
else
{
@@ -248,7 +245,8 @@ int main( int argc, char **argv )
int i;
string_buffer_t sb;
int fd;
wchar_t *rel_filename, *abs_filename;
if( ( fd = open(file, O_RDONLY) ) == -1 )
{
wperror( L"open" );
@@ -271,25 +269,30 @@ int main( int argc, char **argv )
env_set( L"argv", (wchar_t *)sb.buff, 0 );
sb_destroy( &sb );
}
reader_push_current_filename( str2wcs( file ) );
rel_filename = str2wcs( file );
abs_filename = wrealpath( rel_filename, 0 );
if( !abs_filename )
abs_filename = wcsdup(rel_filename);
reader_push_current_filename( intern( abs_filename ) );
free( rel_filename );
free( abs_filename );
res = reader_read( fd );
if( res )
{
debug( 1,
L"Error while reading file %ls\n",
reader_current_filename() );
_(L"Error while reading file %ls\n"),
reader_current_filename()?reader_current_filename(): _(L"Standard input") );
}
free(reader_pop_current_filename());
reader_pop_current_filename();
}
}
}
proc_fire_event( L"PROCESS_EXIT", EVENT_EXIT, getpid(), res );
reader_pop_current_filename();
proc_destroy();
env_destroy();
builtin_destroy();
@@ -303,7 +306,7 @@ int main( int argc, char **argv )
event_destroy();
output_destroy();
translate_destroy();
intern_free_all();
return res;

201
mimedb.c
View File

@@ -30,11 +30,18 @@ license. Read the source code of the library for more information.
#include <fcntl.h>
#include <libgen.h>
#include <errno.h>
#include <regex.h>
#include <locale.h>
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif
#if HAVE_LIBINTL_H
#include <libintl.h>
#endif
#include "xdgmime.h"
#include "util.h"
@@ -53,20 +60,30 @@ license. Read the source code of the library for more information.
#define MIME_SUFFIX ".xml"
/**
Start tag for comment
Start tag for langauge-specific comment
*/
#define START_TAG "<comment>"
#define START_TAG "<comment *(| +xml:lang *= *(\"%s\"|'%s') *)>"
/**
End tab for comment
*/
#define STOP_TAG "</comment>"
#define STOP_TAG "</comment *>"
/**
File contains cached list of mime actions
*/
#define DESKTOP_DEFAULT "applications/defaults.list"
/**
Size for temporary string buffer used to make a regex for language
specific descriptions
*/
#define BUFF_SIZE 1024
/**
Program name
*/
#define MIMEDB "mimedb"
/**
All types of input and output possible
@@ -82,6 +99,15 @@ enum
}
;
/**
Regular expression variable used to find start tag of description
*/
static regex_t *start_re=0;
/**
Regular expression variable used to find end tag of description
*/
static regex_t *stop_re=0;
/**
Error flag. Non-zero if something bad happened.
*/
@@ -101,6 +127,15 @@ static int launch_len=0;
*/
static int launch_pos=0;
#if HAVE_GETTEXT
/**
gettext alias
*/
#define _(string) gettext(string)
#else
#define _(string) (string)
#endif
/**
Dynamically generated function, made from the documentation in doc_src.
*/
@@ -115,7 +150,7 @@ void *my_malloc( size_t s )
if( !s )
{
error=1;
fprintf( stderr, "mimedb: Out of memory\n" );
fprintf( stderr, _("%s: Out of memory\n"), MIMEDB );
}
return res;
}
@@ -129,7 +164,7 @@ char *my_strdup( char *s )
if( !s )
{
error=1;
fprintf( stderr, "mimedb: Out of memory\n" );
fprintf( stderr, _("%s: Out of memory\n"), MIMEDB );
}
return res;
}
@@ -364,11 +399,56 @@ static char *munge( char *in )
}
in++;
}
fprintf( stderr, "mimedb: Unknown error in munge()\n" );
fprintf( stderr, _( "%s: Unknown error in munge()\n"), MIMEDB );
error=1;
return 0;
}
/**
Return a regular expression that matches all strings specifying the current locale
*/
static char *get_lang_re()
{
static char buff[BUFF_SIZE];
const char *lang = setlocale( LC_MESSAGES, 0 );
int close=0;
char *out=buff;
if( (1+strlen(lang)*4) >= BUFF_SIZE )
{
fprintf( stderr, _( "%s: Locale string too long\n"), MIMEDB );
error = 1;
return 0;
}
for( ; *lang; lang++ )
{
switch( *lang )
{
case '@':
case '.':
case '_':
if( close )
*out++ = ')';
close=1;
*out++ = '(';
*out++ = '|';
*out++ = *lang;
break;
default:
*out++ = *lang;
}
}
if( close )
*out++ = ')';
*out++=0;
return buff;
}
/**
Get description for a specified mimetype.
*/
@@ -380,8 +460,36 @@ static char *get_description( const char *mimetype )
int fd;
struct stat st;
char *contents;
char *start, *stop;
char *start=0, *stop=0;
if( !start_re )
{
char *lang;
char buff[BUFF_SIZE];
lang = get_lang_re();
if( !lang )
return 0;
snprintf( buff, BUFF_SIZE, START_TAG, lang, lang );
start_re = my_malloc( sizeof(regex_t));
stop_re = my_malloc( sizeof(regex_t));
if( regcomp( start_re, buff, REG_EXTENDED ) ||
regcomp( stop_re, STOP_TAG, REG_EXTENDED ) )
{
fprintf( stderr, _( "%s: Could not compile regular expressions\n"), MIMEDB );
error=1;
free( start_re );
free( stop_re );
start_re = stop_re = 0;
return 0;
}
}
fn_part = my_malloc( strlen(MIME_DIR) + strlen( mimetype) + strlen(MIME_SUFFIX) + 1 );
if( !fn_part )
@@ -436,15 +544,40 @@ static char *get_description( const char *mimetype )
free( fn );
contents[st.st_size]=0;
start = strstr( contents, START_TAG );
if( start )
regmatch_t match[1];
int w = -1;
start=contents;
/*
On multiple matches, use the longest match, should be a pretty
good heuristic for best match...
*/
while( !regexec(start_re, start, 1, match, 0) )
{
start += strlen(START_TAG);
stop = strstr( start, STOP_TAG );
if( stop )
int new_w = match[0].rm_eo - match[0].rm_so;
if( new_w > w )
{
/*
New match is for a longer match then the previous
match, so we use the new match
*/
w=new_w;
start += match[0].rm_eo;
}
}
if( w != -1 )
{
if( !regexec(stop_re, start, 1, match, 0) )
{
/*
We've found the beginning and the end of a suitable description
*/
char *res;
stop = start + match[0].rm_so;
*stop = '\0';
res = munge( start );
free( contents );
@@ -452,7 +585,7 @@ static char *get_description( const char *mimetype )
}
}
free( contents );
fprintf( stderr, "mimedb: No description for type %s\n", mimetype );
fprintf( stderr, _( "%s: No description for type %s\n"), MIMEDB, mimetype );
error=1;
return 0;
@@ -516,7 +649,7 @@ static char *get_action( const char *mimetype )
if( !launcher )
{
fprintf( stderr, "Could not parse launcher string %s\n", launcher_str );
fprintf( stderr, _("%s: Could not parse launcher string '%s'\n"), MIMEDB, launcher_str );
error=1;
return 0;
}
@@ -549,7 +682,7 @@ static char *get_action( const char *mimetype )
if( !launcher_command_str )
{
fprintf( stderr,
"mimedb: Default launcher %s does not specify how to start\n",
_( "%s: Default launcher '%s' does not specify how to start\n"), MIMEDB,
launcher_filename );
free( launcher_filename );
return 0;
@@ -929,7 +1062,7 @@ static void launch( char *filter, array_list_t *files, int fileno )
}
default:
fprintf( stderr, "Unsupported switch %c in launch string %s\n", *filter, filter_org );
fprintf( stderr, _("%s: Unsupported switch '%c' in launch string '%s'\n"), MIMEDB, *filter, filter_org );
launch_len=0;
break;
@@ -950,7 +1083,7 @@ static void launch( char *filter, array_list_t *files, int fileno )
case -1:
{
launch_len = 0;
fprintf( stderr, "mimedb: Out of memory\n" );
fprintf( stderr, _( "%s: Out of memory\n"), MIMEDB );
return;
}
case 0:
@@ -995,6 +1128,17 @@ static void clear_entry( const void *key, const void *val )
free( l );
}
/**
Do locale specific init
*/
static void locale_init()
{
setlocale( LC_ALL, "" );
#if HAVE_GETTEXT
bindtextdomain( PACKAGE_NAME, LOCALEDIR );
textdomain( PACKAGE_NAME );
#endif
}
/**
@@ -1011,8 +1155,9 @@ int main (int argc, char *argv[])
int i;
hash_table_t launch_hash;
locale_init();
/*
Parse options
*/
@@ -1118,7 +1263,7 @@ int main (int argc, char *argv[])
exit(0);
case 'v':
printf( "mimedb, version %s\n", PACKAGE_VERSION );
printf( _("%s, version %s\n"), MIMEDB, PACKAGE_VERSION );
exit( 0 );
case '?':
@@ -1129,7 +1274,7 @@ int main (int argc, char *argv[])
if( ( output_type == LAUNCH )&&(input_type==MIMETYPE))
{
fprintf( stderr, "Can not launch a mimetype\n" );
fprintf( stderr, _("%s: Can not launch a mimetype\n"), MIMEDB );
print_help();
exit(1);
}
@@ -1161,7 +1306,7 @@ int main (int argc, char *argv[])
mimetype = xdg_mime_unalias_mime_type (mimetype);
if( !mimetype )
{
fprintf( stderr, "mimedb: Could not parse mimetype from argument %s\n", argv[i] );
fprintf( stderr, _( "%s: Could not parse mimetype from argument '%s'\n"), MIMEDB, argv[i] );
error=1;
return 1;
}
@@ -1227,7 +1372,7 @@ int main (int argc, char *argv[])
/*
Perform the actual launching
*/
if( output_type == LAUNCH )
if( output_type == LAUNCH && !error )
{
int i;
array_list_t mimes;
@@ -1239,7 +1384,7 @@ int main (int argc, char *argv[])
array_list_t *files = (array_list_t *)hash_get( &launch_hash, mimetype );
if( !files )
{
fprintf( stderr, "mimedb: Unknown error\n" );
fprintf( stderr, _( "%s: Unknown error\n"), MIMEDB );
error=1;
break;
}
@@ -1260,6 +1405,14 @@ int main (int argc, char *argv[])
if( launch_buff )
free( launch_buff );
if( start_re )
{
regfree( start_re );
regfree( stop_re );
free( start_re );
free( stop_re );
}
xdg_mime_shutdown();
return error;

View File

@@ -26,7 +26,12 @@
#include <termio.h>
#endif
#if HAVE_TERM_H
#include <term.h>
#elif HAVE_NCURSES_TERM_H
#include <ncurses/term.h>
#endif
#include <signal.h>
#include <fcntl.h>
#include <dirent.h>

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